From 0996710024f060db75bf990b998a222eb20fc841 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 12 Feb 2023 17:48:47 +0800 Subject: [PATCH 01/61] =?UTF-8?q?add:=20=E7=AC=AC1=E8=8A=82=20=E6=90=AD?= =?UTF-8?q?=E5=BB=BARocketMQ=E6=BA=90=E7=A0=81=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/configs/sidebar/zh.ts | 54 ++++--- ...57\345\242\203\346\220\255\345\273\272.md" | 0 ...57\345\242\203\346\220\255\345\273\272.md" | 153 ++++++++++++++++++ 3 files changed, 182 insertions(+), 25 deletions(-) delete mode 100644 "docs/resources/middleware/rocketmq/01RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" create mode 100644 "docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" diff --git a/docs/.vuepress/configs/sidebar/zh.ts b/docs/.vuepress/configs/sidebar/zh.ts index ef9e8a8..0ec5aaa 100644 --- a/docs/.vuepress/configs/sidebar/zh.ts +++ b/docs/.vuepress/configs/sidebar/zh.ts @@ -1,28 +1,6 @@ import type {SidebarConfig} from '@vuepress/theme-default' export const sidebarZh: SidebarConfig = { - '/resources/bigdata/': [ - { - text: 'sql面试题', - link:'/resources/bigdata/hsql', - children: [ - '1-行列转换.md', - '2-排名取它值.md', - '3-累计求值.md', - '4-窗口大小的控制.md', - '5-不使用distinct和group by分组.md', - 'README.md' - ], - }, - { - text: 'hive sql函数总结', - link:'/resources/bigdata/hsql', - children: [ - - 'README.md' - ], - } - ], '/resources/data-structure-and-algorithm/': [ { text: '阅读指南', @@ -147,11 +125,15 @@ export const sidebarZh: SidebarConfig = { ], '/resources/middleware/': [ { - text: 'RocketMQ', + text: '阅读指南', link: '/resources/middleware/rocketmq/', - collapsible: true, children: [ - '01RocketMQ源码阅读环境搭建.md', + { + text: '第一章 搭建源码环境', + children: [ + '1-1RocketMQ源码阅读环境搭建.md' + ] + }, '02NameServer启动源码分析.md', '03Producer启动原理分析.md', '04Producer消息发送原理分析.md', @@ -196,4 +178,26 @@ export const sidebarZh: SidebarConfig = { link: '/resources/middleware/other/' } ], + '/resources/bigdata/': [ + { + text: 'sql面试题', + link:'/resources/bigdata/hsql', + children: [ + '1-行列转换.md', + '2-排名取它值.md', + '3-累计求值.md', + '4-窗口大小的控制.md', + '5-不使用distinct和group by分组.md', + 'README.md' + ], + }, + { + text: 'hive sql函数总结', + link:'/resources/bigdata/hsql', + children: [ + + 'README.md' + ], + } + ], } diff --git "a/docs/resources/middleware/rocketmq/01RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/01RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" deleted file mode 100644 index e69de29..0000000 diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" new file mode 100644 index 0000000..3d35165 --- /dev/null +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -0,0 +1,153 @@ +# 第1节 搭建RocketMQ源码环境 + +![image-20230212125755344](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212125755344.png) + +> 提到消息队列( Message Queue ),大家都会想到常见的那几种,比如: Kafka、 RabbitMQ、 RocketMQ、 ActiveMQ、 ZeroMQ、 MetaMQ 等,当然还有很多企业内部自研了适用于公司业务的 MQ 系统。作为分布式系统的重要组件, MQ 常用于系统间的解耦,以及削峰填谷、异步处理等场景。我们学习 MQ ,不仅要学会如何去使用,更要深入学习 MQ 的设计思想,以及 MQ 的实现原理。上述常见的 MQ 组件中,笔者推荐大家对Apache 的 RocketMQ 进行深入学习,它是 Java 语言实现,并且经历了“双十一”巨大流量的考验,是一个值得去学习的一个组件。本系列文章采用 RocketMQ 5.0 的版本进行深入的源码研究,感兴趣的朋友可以去 RocketMQ 的 github 仓库中将其 fork 到自己的仓库中进行学习。笔者将 RocketMQ 5.0 的版本的源码下载下来,导入到了自己的仓库中,后续的源码分析注释都将基于该仓库代码,仓库地址:[点击跳转](https://github.com/itlemon/rocketmq-5.0.0)。 + +## 一、RocketMQ源码结构 + +本文不再赘述如何去 $fork$ 代码,如何去 $git$ $clone$ 代码,笔者认为多数读者都会这些基本操作,如果正在阅读的您尚未掌握这些技巧,可以去查看一下其他博主的文章,正确把 RocketMQ 源码拉取到本地后再来阅读该文章。 Apache RocketMQ 是一个基于 Java 语言开发的消息中间件,构建工具采用的是常用的 $maven$ ,基本的模块结构如下图所示: + +![image-20230212153313072](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212153313072.png) + +RocketMQ 的所有模块都在上图进行了展示,笔者隐藏了部分文本文件,可能与你 $git$ $clone$ 下来的代码结构有细微区别。接下来,用下表对上述模块进行功能解释。 + +| 模块名称 | 功能介绍 | +| :------------: | :----------------------------------------------------------- | +| acl | 访问控制列表(Access Control Lists,ACL), RocketMQ 权限管理模块 | +| **bazel** | **bazel 是 Google 开源的构建工具,目前广泛用于云计算领域的开源软件(如 Kubernetes)构建, RocketMQ 5.0 引入了 bazel 构建** | +| broker | RocketMQ 5.0 中,计算与存储实现了分离,Broker主要专注于消息存储 | +| client | MQ 客户端,包括 Producer 和 Consumer | +| common | 用于存储 RocketMQ 项目的通用代码和 Model 等 | +| **container** | **RocketMQ 5.0 新引入 BrokerContainer 概念,一个 BrokerContainer 中可以部署多个 Broker,这些 Broker 拥有独立的端口,功能完全独立,并且可以共享同一个节点的资源,引入该模块主要是为了解决 RocketMQ 4.5 之前 Broker 节点挂掉后不能自动切换的问题及 RocketMQ 4.5 之后基于 Raft 协议的 DLedger 实现主从切换的资源冗余使用的问题,且支持 Mater-Slave Broker 交叉部署,提高了 Broker 的可用性** | +| **controller** | **RocketMQ 5.0 引入了 DLedger Controller 架构,解决传统 DLedger 架构的不足** | +| dev | merge_rocketmq_pr.py 脚本,用于处理 RP | +| distribution | Client、 Namesrv、 Broker 等启动脚本及打包脚本 | +| docs | 文档 | +| example | RocketMQ 示例代码,源码分析可以从这里入手 | +| filter | 过滤器模块,包含 SQL 过滤 | +| logging | 日志实现模块 | +| namesrv | Namesrv 实现模块 | +| openmessaging | openmessaging 模块 | +| **proxy** | **RocketMQ 5.0 为了更好地拥抱云原生,实现了计算和存储相分离,把计算相关的功能抽象到了 Proxy,协议适配、权限管理、消息管理等,Broker 则专注于存储** | +| remoting | 基于 Netty 实现的网络通信模块, RocketMQ 各组件之间的通信都依赖它 | +| srvutil | 工具包模块 | +| store | 数据存储模块,例如 Broker 数据 | +| style | 代码风格 XML 文件 | +| test | RocketMQ 案例测试模块 | +| tools | RocketMQ 对外命令行接口、管理类接口等 | + +上述模块中,加黑的模块是 RocketMQ 5.0 新增的模块,为了更好地拥抱云原生, RocketMQ 5.0 架构上发生了比较大的变化,实现计算存储相分离,并且引入 $bazel$ 进行构建。在高可用方面,RocketMQ 5.0 对传统的基于 DLedger 的高可用进行了改造,同时引入了 BrokerContainer 对等部署方案。 + +## 二、RocketMQ源码编译 + +将 RocketMQ 源码导入到 IntelliJ IDEA 中,如下图所示: + +image-20230212165733060 + +然后进入到 RocketMQ 根目录,在控制台使用命令 `mvn -Dmaven.test.skip=true clean package` 进行编译,当然也可以使用 IntelliJ IDEA 可视化插件进行编译,如下图所示: + +image-20230212170002921 + +编译成功后如下图所示: + +image-20230212170513837 + +如果编译过程中出现插件找不到或者部分依赖找不到,可以尝试将 $maven$ 的远程仓库替换成为[阿里云maven仓库](https://developer.aliyun.com/mvn/guide)。 + +## 三、启动Namesrv和Broker + +编译完成之后,可以尝试启动 Namesrv 和 Broker,为了阅读源码方便,笔者不建议去下载 RocketMQ 官方编译打包好的 Namesrv 和 Broker 进行测试,而是直接在 IDEA 中启动 Namesrv 和 Broker,方便后续的代码分析,接下来,我将带着大家一步一步去启动 Namesrv 和 Broker。 + +### 3.1 启动Namesrv + +进入到`namesrv`源代码的`org.apache.rocketmq.namesrv`包中,找到启动类`NamesrvStartup`,然后拷贝它的全路径,进入到启动窗口进行配置(建议先启动一下启动类,然后该窗口的部分参数都会自动填好),如下图所示: + +![image-20230212171956297](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212171956297.png) + +这里主要需要配置好一个环境变量 `ROCKETMQ_HOME`,可以在计算机的任何位置建一个目录,设置为 `ROCKETMQ_HOME` 的值。目录建立好之后,在 `rocketmq_home` 目录下建立三个目录,分别是 `conf`、 `logs`、 `store`,分别用于存储配置文件,日志以及数据。然后将 `distribution` 模块中 `conf` 目录下的 `broker.conf`、 `logback_broker.xml`、 `logback_namesrv.xml`拷贝到 `rocketmq_home` 下的 `conf` 目录中,并修改部分配置。首先修改 `broker.conf` ,具体内容如下: + +```properties +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +brokerClusterName = DefaultCluster +brokerName = broker-a +brokerId = 0 +# 添加此项,broker连接到本地的namesrv上 +namesrvAddr = 127.0.0.1:9876 +deleteWhen = 04 +fileReservedTime = 48 +# 同步复制,异步刷盘 +brokerRole = ASYNC_MASTER +flushDiskType = ASYNC_FLUSH + +# 添加以下配置,路径请修改为自己的正确路径 +# 配置存储位置 +storePathRootDir = /Users/jiangpingping/rocketmq_home/store +# commitlog 存储路径 +storePathCommitLog = /Users/jiangpingping/rocketmq_home/store/commitlog +# 消费队列存储路径 +storePathConsumeQueue = /Users/jiangpingping/rocketmq_home/store/consumequeue +# 消息索引存储路径 +storePathIndex = /Users/jiangpingping/rocketmq_home/store/index +# checkpoint文件存储路径 +storeCheckPoint = /Users/jiangpingping/rocketmq_home/store/checkpoint +# abort文件存储路径 +abortFile = /Users/jiangpingping/rocketmq_home/store/abort +``` + +为了将日志也存储到指定的 `rocketmq_home` 下的 logs 目录,还需要修改一下 `logback_broker.xml` 和 `logback_namesrv.xml` 文件,在两个日志中各添加一项配置,在 `` 标签下的第一行添加如下配置,用来覆盖系统变量值。 + +```xml + + +``` + +配置了上述内容,就可以正常启动 `Namesev` 模块了,其实上述配置也包含了 `Broker` 的相关配置,为了方便,就放在一起进行表述了。注意: `Namesrv` 的默认启动端口是 `9876`。当然,我们也可以修改 `NamesrvStartup` 的源码,让其支持自定义端口,具体可参考:[RocketMQ源码之路(二)NameServer路由中心源码分析](https://itlemon.blog.csdn.net/article/details/108812155)。 + +### 3.2 启动Broker + +配置`Broker`的启动类,添加一个启动参数指定配置文件启动,参数是: + +``` +-c /Users/jiangpingping/rocketmq_home/conf/broker.conf +``` + +并指定环境变量 `ROCKETMQ_HOME` ,具体如下图所示: + +![image-20230212174420929](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212174420929.png) + +配置完 `Broker` 后就可以正常启动了,后续的测试注意要先启动 `Namesrv`,后启动 `Broker`,顺序不要乱。 + +## 四、测试消息生产者和消费者 + +启动好 `Namesrv` 和 `Broker` 模块以后,进入到 `example` 模块中,找到 `org.apache.rocketmq.example.quickstart` 包,里面已经有了两个类,分别是 `Producer` 和 `Consumer` ,在两个类中分别设置一下 `Namesrv` 地址,如下所示: + +```java +// Producer +producer.setNamesrvAddr("127.0.0.1:9876"); +// Consumer +consumer.setNamesrvAddr("127.0.0.1:9876"); +``` + +然后分别启动 `Consumer` 和 `Producer` 就可以正常进行消息消费了。 + +## 五、总结 + +本文言简意赅,和我以前的文章风格大有不同,以前是面面俱到,全文翔实。原因是这篇文章是帮助大家尽快搭建起源码环境,对于一些基础知识,比如 RocketMQ 的发展史,什么是 `Namesrv`、什么是 `Broker`,这些基础知识大家可以去阅读 RocketMQ 官网文档或者其他博客可以了解到,所以这里就没有过多介绍。接下来,欢迎大家订阅我的 `RocketMQ源码之路` 系列文章,让我们一起去遨游 RocketMQ 源码世界吧! + +了解更多干货,欢迎关注我的微信公众号:爪哇论剑(微信号:itlemon) +![微信公众号-爪哇论剑-itlemon](https://img-blog.csdnimg.cn/20190917130526135.jpeg) \ No newline at end of file From e5f7c684c239ecd2d373f111cb0ce2ab6d694f30 Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 13 Feb 2023 20:38:45 +0800 Subject: [PATCH 02/61] add: format markdown table --- ...57\345\242\203\346\220\255\345\273\272.md" | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index 3d35165..f80bce1 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -12,30 +12,30 @@ RocketMQ 的所有模块都在上图进行了展示,笔者隐藏了部分文本文件,可能与你 $git$ $clone$ 下来的代码结构有细微区别。接下来,用下表对上述模块进行功能解释。 -| 模块名称 | 功能介绍 | -| :------------: | :----------------------------------------------------------- | -| acl | 访问控制列表(Access Control Lists,ACL), RocketMQ 权限管理模块 | -| **bazel** | **bazel 是 Google 开源的构建工具,目前广泛用于云计算领域的开源软件(如 Kubernetes)构建, RocketMQ 5.0 引入了 bazel 构建** | -| broker | RocketMQ 5.0 中,计算与存储实现了分离,Broker主要专注于消息存储 | -| client | MQ 客户端,包括 Producer 和 Consumer | -| common | 用于存储 RocketMQ 项目的通用代码和 Model 等 | +| 模块名称 | 功能介绍 | +|:--------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| acl | 访问控制列表(Access Control Lists,ACL), RocketMQ 权限管理模块 | +| **bazel** | **bazel 是 Google 开源的构建工具,目前广泛用于云计算领域的开源软件(如 Kubernetes)构建, RocketMQ 5.0 引入了 bazel 构建** | +| broker | RocketMQ 5.0 中,计算与存储实现了分离,Broker主要专注于消息存储 | +| client | MQ 客户端,包括 Producer 和 Consumer | +| common | 用于存储 RocketMQ 项目的通用代码和 Model 等 | | **container** | **RocketMQ 5.0 新引入 BrokerContainer 概念,一个 BrokerContainer 中可以部署多个 Broker,这些 Broker 拥有独立的端口,功能完全独立,并且可以共享同一个节点的资源,引入该模块主要是为了解决 RocketMQ 4.5 之前 Broker 节点挂掉后不能自动切换的问题及 RocketMQ 4.5 之后基于 Raft 协议的 DLedger 实现主从切换的资源冗余使用的问题,且支持 Mater-Slave Broker 交叉部署,提高了 Broker 的可用性** | -| **controller** | **RocketMQ 5.0 引入了 DLedger Controller 架构,解决传统 DLedger 架构的不足** | -| dev | merge_rocketmq_pr.py 脚本,用于处理 RP | -| distribution | Client、 Namesrv、 Broker 等启动脚本及打包脚本 | -| docs | 文档 | -| example | RocketMQ 示例代码,源码分析可以从这里入手 | -| filter | 过滤器模块,包含 SQL 过滤 | -| logging | 日志实现模块 | -| namesrv | Namesrv 实现模块 | -| openmessaging | openmessaging 模块 | -| **proxy** | **RocketMQ 5.0 为了更好地拥抱云原生,实现了计算和存储相分离,把计算相关的功能抽象到了 Proxy,协议适配、权限管理、消息管理等,Broker 则专注于存储** | -| remoting | 基于 Netty 实现的网络通信模块, RocketMQ 各组件之间的通信都依赖它 | -| srvutil | 工具包模块 | -| store | 数据存储模块,例如 Broker 数据 | -| style | 代码风格 XML 文件 | -| test | RocketMQ 案例测试模块 | -| tools | RocketMQ 对外命令行接口、管理类接口等 | +| **controller** | **RocketMQ 5.0 引入了 DLedger Controller 架构,解决传统 DLedger 架构的不足** | +| dev | merge_rocketmq_pr.py 脚本,用于处理 RP | +| distribution | Client、 Namesrv、 Broker 等启动脚本及打包脚本 | +| docs | 文档 | +| example | RocketMQ 示例代码,源码分析可以从这里入手 | +| filter | 过滤器模块,包含 SQL 过滤 | +| logging | 日志实现模块 | +| namesrv | Namesrv 实现模块 | +| openmessaging | openmessaging 模块 | +| **proxy** | **RocketMQ 5.0 为了更好地拥抱云原生,实现了计算和存储相分离,把计算相关的功能抽象到了 Proxy,协议适配、权限管理、消息管理等,Broker 则专注于存储** | +| remoting | 基于 Netty 实现的网络通信模块, RocketMQ 各组件之间的通信都依赖它 | +| srvutil | 工具包模块 | +| store | 数据存储模块,例如 Broker 数据 | +| style | 代码风格 XML 文件 | +| test | RocketMQ 案例测试模块 | +| tools | RocketMQ 对外命令行接口、管理类接口等 | 上述模块中,加黑的模块是 RocketMQ 5.0 新增的模块,为了更好地拥抱云原生, RocketMQ 5.0 架构上发生了比较大的变化,实现计算存储相分离,并且引入 $bazel$ 进行构建。在高可用方面,RocketMQ 5.0 对传统的基于 DLedger 的高可用进行了改造,同时引入了 BrokerContainer 对等部署方案。 From bd242166cff6d449f51fa077af5a1ca676954bb9 Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 13 Feb 2023 20:42:43 +0800 Subject: [PATCH 03/61] add: format markdown table --- ...\273\347\216\257\345\242\203\346\220\255\345\273\272.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index f80bce1..e27e75a 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -43,15 +43,15 @@ RocketMQ 的所有模块都在上图进行了展示,笔者隐藏了部分文 将 RocketMQ 源码导入到 IntelliJ IDEA 中,如下图所示: -image-20230212165733060 +![image-20230212165733060](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212165733060.png) 然后进入到 RocketMQ 根目录,在控制台使用命令 `mvn -Dmaven.test.skip=true clean package` 进行编译,当然也可以使用 IntelliJ IDEA 可视化插件进行编译,如下图所示: -image-20230212170002921 +![image-20230212170002921](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212170002921.png) 编译成功后如下图所示: -image-20230212170513837 +![image-20230212170513837](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212170513837.png) 如果编译过程中出现插件找不到或者部分依赖找不到,可以尝试将 $maven$ 的远程仓库替换成为[阿里云maven仓库](https://developer.aliyun.com/mvn/guide)。 From 762cd8b688ba7942a42db996328656a41cd04ac3 Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 13 Feb 2023 21:37:24 +0800 Subject: [PATCH 04/61] add: format markdown table --- ...\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index e27e75a..8bab748 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -43,7 +43,7 @@ RocketMQ 的所有模块都在上图进行了展示,笔者隐藏了部分文 将 RocketMQ 源码导入到 IntelliJ IDEA 中,如下图所示: -![image-20230212165733060](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212165733060.png) +![image-20230212165733060](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212165733060.png =200x) 然后进入到 RocketMQ 根目录,在控制台使用命令 `mvn -Dmaven.test.skip=true clean package` 进行编译,当然也可以使用 IntelliJ IDEA 可视化插件进行编译,如下图所示: From aa472cec098a84a70c4cb6c0e465b4f277c3df47 Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 13 Feb 2023 21:40:05 +0800 Subject: [PATCH 05/61] add: format markdown table --- docs/.vuepress/config.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 2293a8e..ed30d51 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -140,6 +140,8 @@ export default defineUserConfig({ mdEnhancePlugin({ // 使用 KaTeX 启用 TeX 支持 katex: true, + // 启用图片大小 + imgSize: true, }), ], }) \ No newline at end of file From 94282decce6a3a0e2dc9f479d887de91dda2f071 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 14 Feb 2023 22:12:37 +0800 Subject: [PATCH 06/61] add: format png --- ...\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index 8bab748..e27e75a 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -43,7 +43,7 @@ RocketMQ 的所有模块都在上图进行了展示,笔者隐藏了部分文 将 RocketMQ 源码导入到 IntelliJ IDEA 中,如下图所示: -![image-20230212165733060](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212165733060.png =200x) +![image-20230212165733060](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212165733060.png) 然后进入到 RocketMQ 根目录,在控制台使用命令 `mvn -Dmaven.test.skip=true clean package` 进行编译,当然也可以使用 IntelliJ IDEA 可视化插件进行编译,如下图所示: From 544bd8974138b2137e987c43369a757d882210b9 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 14 Feb 2023 22:39:45 +0800 Subject: [PATCH 07/61] add: format png --- ...\273\347\216\257\345\242\203\346\220\255\345\273\272.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index e27e75a..512f4b5 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -43,15 +43,15 @@ RocketMQ 的所有模块都在上图进行了展示,笔者隐藏了部分文 将 RocketMQ 源码导入到 IntelliJ IDEA 中,如下图所示: -![image-20230212165733060](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212165733060.png) +image-20230212165733060 然后进入到 RocketMQ 根目录,在控制台使用命令 `mvn -Dmaven.test.skip=true clean package` 进行编译,当然也可以使用 IntelliJ IDEA 可视化插件进行编译,如下图所示: -![image-20230212170002921](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212170002921.png) +image-20230212170002921 编译成功后如下图所示: -![image-20230212170513837](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212170513837.png) +image-20230212170513837 如果编译过程中出现插件找不到或者部分依赖找不到,可以尝试将 $maven$ 的远程仓库替换成为[阿里云maven仓库](https://developer.aliyun.com/mvn/guide)。 From c5fb97cef82de755ddad807548b887f3d3df1aea Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 14 Feb 2023 22:45:50 +0800 Subject: [PATCH 08/61] add: format png --- ...\273\347\216\257\345\242\203\346\220\255\345\273\272.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index 512f4b5..8600d83 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -43,15 +43,15 @@ RocketMQ 的所有模块都在上图进行了展示,笔者隐藏了部分文 将 RocketMQ 源码导入到 IntelliJ IDEA 中,如下图所示: -image-20230212165733060 +
image-20230212165733060
然后进入到 RocketMQ 根目录,在控制台使用命令 `mvn -Dmaven.test.skip=true clean package` 进行编译,当然也可以使用 IntelliJ IDEA 可视化插件进行编译,如下图所示: -image-20230212170002921 +
image-20230212170002921
编译成功后如下图所示: -image-20230212170513837 +
image-20230212170513837
如果编译过程中出现插件找不到或者部分依赖找不到,可以尝试将 $maven$ 的远程仓库替换成为[阿里云maven仓库](https://developer.aliyun.com/mvn/guide)。 From 6f225e4178f506b050d12d63d4446f474df4b702 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 14 Feb 2023 23:05:06 +0800 Subject: [PATCH 09/61] add: add nameserver pages. --- docs/.vuepress/configs/sidebar/zh.ts | 7 +++++++ ...204\345\220\257\345\212\250\345\216\237\347\220\206.md" | 3 +++ ...261\347\256\241\347\220\206\346\234\272\345\210\266.md" | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 "docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" create mode 100644 "docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" diff --git a/docs/.vuepress/configs/sidebar/zh.ts b/docs/.vuepress/configs/sidebar/zh.ts index 0ec5aaa..7a5f0ff 100644 --- a/docs/.vuepress/configs/sidebar/zh.ts +++ b/docs/.vuepress/configs/sidebar/zh.ts @@ -134,6 +134,13 @@ export const sidebarZh: SidebarConfig = { '1-1RocketMQ源码阅读环境搭建.md' ] }, + { + text: '第二章 深入解读NameServer', + children: [ + '2-1NameServer的启动原理.md', + '2-2NameServer的路由管理机制.md' + ] + }, '02NameServer启动源码分析.md', '03Producer启动原理分析.md', '04Producer消息发送原理分析.md', diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" new file mode 100644 index 0000000..d0fb76b --- /dev/null +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -0,0 +1,3 @@ +# 第一节 NameServer的启动原理 + +更多内容,敬请期待 \ No newline at end of file diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" new file mode 100644 index 0000000..f1078d6 --- /dev/null +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -0,0 +1,3 @@ +# 第二节 NameServer的路由管理机制 + +更多内容,敬请期待 \ No newline at end of file From a56312a34f41c058cc0d091e5d76d0a2ec32a5c4 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 14 Feb 2023 23:26:32 +0800 Subject: [PATCH 10/61] add: add nameserver pages. --- ...57\345\212\250\345\216\237\347\220\206.md" | 1125 ++++++++++++++++- 1 file changed, 1124 insertions(+), 1 deletion(-) diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index d0fb76b..b2d71a9 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -1,3 +1,1126 @@ # 第一节 NameServer的启动原理 -更多内容,敬请期待 \ No newline at end of file +![image-20230214231618529](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230214231618529.png) + +> 一般了解 RocketMQ 的读者都知道,NameServer 是 RocketMQ 的组织协调者,是 RocketMQ 对外提供服务的“大脑”。NameServer 提供了路由管理,服务注册与服务发现等机制,是保证消息正确地从生产者到消费者的“指挥官”。那么,生产者生产的消息是如何正确地被消费者消费的呢?Broker 的宕机是如何被生产者和消费者感知的呢?RocketMQ 对外提供服务的可靠性是如何保障的呢?带着这几个问题,我们一起去深入了解RocketMQ NameServer 的设计原理及实现吧! + +## 一、NameServer的基本原理 + +我们熟知的几种常见的消息队列组件,比如Kafka,ActiveMQ,RabbitMQ等,都是一种基于主题的发布订阅机制,RocketMQ也正是基于这种机制实现的消息服务。消息生产者(Producer)将生产好的消息发布到某个主题,该主题下的消息在消息服务器(Broker)中进行传送或存储,由消费者(Consumer)进行订阅主题,从消息服务器中获取到消息后进行消费。消费者获取消息的方式通常有两种,一种是主动去消息服务器拉取消息(Pull Message),另外一种是由消息服务器推送消息(Push Message)给消费者。这种主题的发布订阅机制应用到分布式系统中,成功解耦了生产者和消费者。既然是分布式系统,那么常常存在分布式系统问题,比如某个消息服务器宕机了,生产者是如何感知这台消息服务器宕机了,从而避免将消息发送到这台消息服务器上,消费者是如何感知这台消息服务器宕机了,从而避免从这台消息服务器上拉取消息的呢?且这台宕机的消息服务器是如何从消息服务器实例列表中被剔除的呢?这一切都将归功于NameServer,它的诞生让动态感知、动态剔除、负载均衡成为可能。 +图1-1是RocketMQ常见的物理部署图(图片来源:百度图库),采用的部署方式2m-2s(2Master,2Slave),本小节将根据此图阐述RocketMQ基本的流程原理,后面的小节将深入源码中,从源码中来验证基本流程原理。 +![](https://img-blog.csdnimg.cn/20201017102633155.png) +文章一开始就说道,NameServer是整个RocketMQ消息服务系统的“大脑”,是指挥消息正确发送、消费的“指挥官”,那么他是如何完成这样完美的指挥任务的呢? +NameServer被设计为一种无状态的服务注册发现中心,在NameServer集群中,各个NameServer之间是无感知,无通信的独立节点,任何一个NameServer节点挂掉,都不影响整体的消息服务。Broker在启动的时候,会向指定的NameServer列表中的每个NameServer注册,发送自身的元信息到每个NameServer中,这些元信息包含但不限于BrokerName,BrokerAddress,Broker端口,集群信息,Topic等信息,这些元信息将保存在NameServer的路由信息管理器(RouteInfoManager)中。当消息生产者在将生产的消息发送出去之前,会从NameServer中拉取Broker的信息列表,然后通过负载均衡算法从中选择一个Broker服务器将消息发送出去。当消息消费者要消费消息之前,也会去NameServer中拉取Broker的信息列表,从而从Broker中获取可消费的消息。Broker在首次启动会向NameServer注册元信息,启动后也会定期向NameServer发送心跳,这个周期默认是30秒,当然这个周期可以自定义,支持范围是10秒到60秒之间,每次心跳发送的数据包都是该Broker的元数据信息。NameServer也有自动检测能力,NameServer启动后会注册一个定时任务线程池,每10秒会自动扫描Broker列表,对于不再存活的Broker,将做剔除处理。这动态维护路由信息的能力,并不包含动态通知消息生产者,也就是说生产者并不会及时感知到非存活状态Broker被剔除,但是这并不影响消息的正确发送,因为生产者自身提供有容错机制来保证消息的正常发送。消费者与NameServer没有保持长连接,而是每30秒从NameServer获取所有Topic的信息列表,如果某个时刻某个Broker宕机,消费者可能需要30秒才能知道这个宕机的Broker是哪一个,当然这个值也是可以手动配置的,可根据实际业务来配置该值。消费者在感知Broker存活这一块,有自己的机制,比如每30秒向Broker发送心跳,且Broker每10秒会检测与消费者的连接情况,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟)没有发送心跳数据,则关闭连接,并向该消费者分组的所有消费者发出通知,分组内消费者重新分配队列继续消费。 + +## 二、NameServer的启动流程原理 + +在《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,我们了解了如何使用IDE启动NameServer,那么本小节将和大家一起探讨NameServer的启动流程原理,我们将 从NameServer的启动类NamesrvStartup开始,和大家一起来阅读NameServer在启动源码,帮助大家理解NameServer的启动流程。 +NameServer的启动类NamesrvStartup的main方法如下所示: + +```java +public static void main(String[] args) { + main0(args); +} + +public static NamesrvController main0(String[] args) { + + try { + // 第一步:根据命令行参数创建一个NamesrvController对象,内部包含各种参数加载设置等操作 + // 并设置了namesrv的启动端口 + NamesrvController controller = createNamesrvController(args); + + // 第二步:启动controller + start(controller); + String tip = "The Name Server boot success. serializeType=" + RemotingCommand + .getSerializeTypeConfigInThisServer(); + log.info(tip); + System.out.printf("%s%n", tip); + return controller; + } catch (Throwable e) { + e.printStackTrace(); + System.exit(-1); + } + + return null; +} +``` +从main0方法中可以看出,启动NameServer只有两个步骤,第一步是创建NamesrvController实例对象,第二步调用NamesrvStartup的start方法启动controller。 + +### 2.1 构建NamesrvController对象 + +我们一起来阅读NamesrvStartup的createNamesrvController方法,看看在创建NamesrvController对象的具体流程,代码如下: +```java +/** + * 创建一个Name Server Controller + * + * @param args 命令行参数 + * @return Name Server Controller对象 + * @throws IOException IO异常 + * @throws JoranException Joran异常 + */ +public static NamesrvController createNamesrvController(String[] args) throws IOException, JoranException { + // 设置一个系统参数,key为rocketmq.remoting.version,当前版本值为:Version.V4_7_1,数值为355 + System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION)); + + // 构建-h 和 -n 的命令行参数option,并且自定义了一个P命令行参数,用于定义namesrv端口 + Options options = ServerUtil.buildCommandlineOptions(new Options()); + // 解析完毕后的命令行参数 + commandLine = ServerUtil.parseCmdLine("mqnamesrv", args, buildCommandlineOptions(options), new PosixParser()); + if (null == commandLine) { + // 如果命令行参数为null,则退出虚拟机进程 + System.exit(-1); + return null; + } + + // 分别创建namesrv和nettyServer的config对象 + final NamesrvConfig namesrvConfig = new NamesrvConfig(); + final NettyServerConfig nettyServerConfig = new NettyServerConfig(); + // 设置netty监听9876端口,这就是为什么namesrv的默认端口是9876,这里可以改成其他端口 + // 其实还可以修改上述命令行参数代码,自定义一个参数,用来设置监听端口,在启动的时候指定该参数 + String listenPort; + if (commandLine.hasOption('P') && (StringUtils.isNumeric(listenPort = commandLine.getOptionValue('P')))) { + nettyServerConfig.setListenPort(Integer.parseInt(listenPort)); + } else { + nettyServerConfig.setListenPort(9876); + } + // 加载Name server config properties file + if (commandLine.hasOption('c')) { + String file = commandLine.getOptionValue('c'); + if (file != null) { + InputStream in = new BufferedInputStream(new FileInputStream(file)); + properties = new Properties(); + properties.load(in); + MixAll.properties2Object(properties, namesrvConfig); + MixAll.properties2Object(properties, nettyServerConfig); + + namesrvConfig.setConfigStorePath(file); + + System.out.printf("load config properties file OK, %s%n", file); + in.close(); + } + } + + // 如果在启动参数加上选项-p,那么将打印出namesrvConfig和nettyServerConfig的属性值信息 + // 其中namesrvConfig主要配置了namesrv的信息,nettyServerConfig主要配置了netty的属性值信息 + if (commandLine.hasOption('p')) { + InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_CONSOLE_NAME); + MixAll.printObjectProperties(console, namesrvConfig); + MixAll.printObjectProperties(console, nettyServerConfig); + System.exit(0); + } + + // 填充命令行commandLine中参数到namesrvConfig中 + MixAll.properties2Object(ServerUtil.commandLine2Properties(commandLine), namesrvConfig); + + // rocketmq_home默认来源于配置rocketmq.home.dir,如果没有配置,将从环境变量中获取ROCKETMQ_HOME参数 + if (null == namesrvConfig.getRocketmqHome()) { + System.out + .printf("Please set the %s variable in your environment to match the location of the RocketMQ " + + "installation%n", + MixAll.ROCKETMQ_HOME_ENV); + System.exit(-2); + } + + // 自定义日志配置logback_namesrv.xml,可以了解博文(https://www.jianshu.com/p/3b9cb5e22052)来理解日志的配置加载 + LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(lc); + lc.reset(); + configurator.doConfigure(namesrvConfig.getRocketmqHome() + "/conf/logback_namesrv.xml"); + + log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME); + + MixAll.printObjectProperties(log, namesrvConfig); + MixAll.printObjectProperties(log, nettyServerConfig); + + // 根据namesrvConfig, nettyServerConfig来创建一个NamesrvController对象 + final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig); + + // 将属性集合properties保存到controller的configuration属性中 + controller.getConfiguration().registerConfig(properties); + + return controller; +} +``` +以上的代码完成了NamesrvController对象的创建工作,其主要流程总结如下: + +- 第一步:设置一个系统参数,将当前RocketMQ版本存到系统参数中; +- 第二步:解析启动NameServer的命令行参数; +- 第三步:设置NameServer的启动监听端口,默认是9876,这里笔者额外添加了部分解析命令行参数的代码,支持从命令行中通过`-P`或者`--listenPort`来指定端口; +- 第四步:加载NameServer配置文件,构建NamesrvConfig和NettyServerConfig对象; +- 第五步:配置日志系统; +- 第六步:构建NamesrvController对象并将配置信息存储到controller中。 + +##### 2.2 启动NamesrvController +从启动NamesrvController的start方法可以看出,主要流程也是分为三步: + +- 第一步:进行controller的初始化工作; +- 第二步:注册钩子函数,当JVM正常退出的时候,将执行该钩子函数,执行关闭controller释放资源; +- 第三步:启动controller。 + +start方法代码如下所示: +```java +public static NamesrvController start(final NamesrvController controller) throws Exception { + + if (null == controller) { + throw new IllegalArgumentException("NamesrvController is null"); + } + + // 第一步:进行controller的初始化工作 + boolean initResult = controller.initialize(); + // 如果初始化controller失败,则直接退出 + if (!initResult) { + // 关闭controller,释放资源 + controller.shutdown(); + System.exit(-3); + } + + // 第二步:注册钩子函数,当JVM正常退出的时候,将执行该钩子函数,执行关闭controller释放资源 + Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, (Callable) () -> { + controller.shutdown(); + return null; + })); + + // 第三步:启动controller + controller.start(); + + return controller; +} +``` +在正式启动controller之前,controller进行了很多的初始化工作,主要如下所示: + +- 加载KV配置,主要流程是从本地文件中加载KV配置到内存中,默认加载路径是:`${user.home}/namesrv/kvConfig.json` +- 构建NettyRemotingServer对象 +- 创建一个用于网络交互的线程池`remotingExecutor`,默认固定线程数为8 +- 注册一个处理器,用于处理不同类型的请求 +- 注册两个定时任务线程池: + - NameServer定时每隔10秒钟扫描一次Broker列表,移除已经处于非激活状态的Broker; + - NameServer定时每隔10分钟打印一次KV的配置信息 +- 配置TSL协议,可选操作 + +具体代码分析如下所示: +```java +public boolean initialize() { + + // 第一步:加载KV配置,主要流程是从本地文件中加载KV配置到内存中 + // 默认加载路径是:${user.home}/namesrv/kvConfig.json + this.kvConfigManager.load(); + + // 第二步:构建NettyRemotingServer对象 + this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService); + + // 第三步:创建一个用于网络交互的线程池,默认固定线程数为8 + this.remotingExecutor = + Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), + new ThreadFactoryImpl("RemotingExecutorThread_")); + + // 第四步:注册一个处理器,用于处理不同类型的请求 + this.registerProcessor(); + + // 第五步:注册两个定时任务线程池 + // 1.NameServer定时每隔10秒钟扫描一次Broker列表,移除已经处于非激活状态的Broker; + // 2.NameServer定时每隔10分钟打印一次KV的配置信息 + this.scheduledExecutorService.scheduleAtFixedRate( + NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, 10, TimeUnit.SECONDS); + + this.scheduledExecutorService + .scheduleAtFixedRate(NamesrvController.this.kvConfigManager::printAllPeriodically, 1, 10, + TimeUnit.MINUTES); + + // 第六步:配置TSL协议,可选操作 + if (TlsSystemConfig.tlsMode != TlsMode.DISABLED) { + // Register a listener to reload SslContext + try { + fileWatchService = new FileWatchService( + new String[] { + TlsSystemConfig.tlsServerCertPath, + TlsSystemConfig.tlsServerKeyPath, + TlsSystemConfig.tlsServerTrustCertPath + }, + new FileWatchService.Listener() { + boolean certChanged, keyChanged = false; + + @Override + public void onChanged(String path) { + if (path.equals(TlsSystemConfig.tlsServerTrustCertPath)) { + log.info("The trust certificate changed, reload the ssl context"); + reloadServerSslContext(); + } + if (path.equals(TlsSystemConfig.tlsServerCertPath)) { + certChanged = true; + } + if (path.equals(TlsSystemConfig.tlsServerKeyPath)) { + keyChanged = true; + } + if (certChanged && keyChanged) { + log.info("The certificate and private key changed, reload the ssl context"); + certChanged = keyChanged = false; + reloadServerSslContext(); + } + } + + private void reloadServerSslContext() { + ((NettyRemotingServer) remotingServer).loadSslContext(); + } + }); + } catch (Exception e) { + log.warn("FileWatchService created error, can't load the certificate dynamically"); + } + } + + return true; +} +``` +对于注册了钩子函数,这里向我们展示了一种非常优雅的编程方式,对于代码中使用到了线程池等资源,建议为其注册钩子函数,每当JVM退出的时候,去执行钩子函数逻辑,去执行一些资源关闭的操作,这是一种比较优雅的方式。 + +## 三、NameServer的路由原理 + +文章一开始就提到,NameServer是保证消息正确地从生产者到消费者的“指挥官”,它提供了路由管理,服务注册与服务发现、故障剔除等机制,这些机制的背后原理都都依赖于NameServer的路由,本小节将着重介绍NameServer的路由原理。 + +### 3.1 路由信息管理器 + +NameServer有一个路由信息管理器`RouteInfoManager`,它位于`org.apache.rocketmq.namesrv.routeinfo`包内,其内部存储了topic与broker的各种信息与关系,是RocketMQ实现服务注册与发现、故障剔除的基础。 +RouteInfoManager内部维护了多个HashMap数据结构,用于存储路由信息,具体的内容如下所示: + +```java +/** + * 该Map存储的是Topic消息队列的路由信息,发送具体消息时可根据该Map来进行负载均衡 + */ +private final HashMap> topicQueueTable; + +/** + * Broker的基础信息表,键名是Broker的名称,BrokerData中存储了Broker的名称, + * 所属集群名称以及主Broker和备Broker的地址信息 + */ +private final HashMap brokerAddrTable; + +/** + * 集群与Broker名称的映射表,可以方便知道一个集群下有哪些Broker + */ +private final HashMap> clusterAddrTable; + +/** + * 该Map存储的是每个Broker的存活信息,Name Server每次收到心跳后会将此引用指向最新的表 + */ +private final HashMap brokerLiveTable; + +/** + * 该Map存储的是Broker与Filter Server之间的关系表 + */ +private final HashMap/* Filter Server */> filterServerTable; +``` +从上面的数据结构看来,维护NameServer的路由信息应该还是很简单的,没有太过于抽象的概念,从数据结构中也能得出以下几个结论: + +- 一个Topic包含多个消息队列,其数据是存储在`topicQueueTable`中。 +- 多个Broker拥有同一个Broker Name,它们之间使用BrokerId来进行区分,在BrokerData内部维护了一个HashMap结构来存储。 +- 一个RocketMQ集群可包含多个名称唯一的Broker。 +- 一个Broker可与多个Filter Server进行绑定。 + +其中QueueData、BrokerData、BrokerLiveInfo分别用于存储队列信息、Broker信息及Broker存活信息等数据,其类图如下所示: +```mermaid +classDiagram + class QueueData{ + -String brokerName + -int readQueueNums + -int writeQueueNums + -int perm + -int topicSynFlag + } + class BrokerData{ + -String cluster + -String brokerName + -int writeQueueNums + -HashMap brokerAddrs + } + class BrokerLiveInfo{ + -long lastUpdateTimestamp + -DataVersion dataVersion + -Channel channel + -String haServerAddr + } +``` +QueueData中各个属性含义如下所示: + +- brokerName:当前Queue所属的Broker的名称 +- readQueueNums:读Queue的数量 +- writeQueueNums:写Queue的数量 +- perm:读写权限,{@link org.apache.rocketmq.common.constant.PermName} +- topicSynFlag:topic同步标记,{@link org.apache.rocketmq.common.sysflag.TopicSysFlag} + +BrokerData中各个属性含义如下所示: + +- cluster:所属集群名称 +- brokerName:Broker名称 +- brokerAddrs:主备Broker信息表,键为BrokerID,值为Broker的地址 + +BrokerLiveInfo中各个属性含义如下所示: + +- lastUpdateTimestamp:上一次更新的时间戳,用于判断该Broker是否已经过期 +- dataVersion:Broker信息版本 +- channel:socket通道 +- haServerAddr:haServer的地址,是Slave从Master拉取数据时链接的地址 + +本文开始的第一张图是一个2主2从的RocketMQ集群部署方式,集群中包含2个Master的Broker和2个Slave的Broker,使用BrokerData存储上述部署方式,其表现为以下形式: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) +我们启动一个NameServer服务,并且启动四个Broker服务(分别是BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs),按照上面的图展示的方式来进行部署,一起验证一下RouteInfoManager内部的数据存储的内容。 +在本机IntelliJ IDEA中启动四个Broker,需要为四个Broker分别设置配置文件,我们参考《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,参考Broker的配置方式,分别配置四份,具体的配置文件参考代码中的[配置文件](https://github.com/itlemon/itlemon-rocketmq/tree/master/rocketmq_home),IntelliJ IDEA中的配置面板需要改成如下所示: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213215432215.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) +图中展示红框是设置了一个自定义的命令行参数,支持Broker自定义启动端口(默认是10911,需要在同一机器启动多个Broker服务,最好支持自定义端口设置),这需要修改一下`BrokerStartup`这个类的源码,具体可参考上面BrokerStartup的自定义启动端口的代码,这里给出[github地址](https://github.com/itlemon/itlemon-rocketmq/blob/master/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java),不再在文章中重复赘述了。需要注意的一点是,如果设置的broker-am的启动端口是10911,那么broker-as的不能设置为10912,因为每个每个broker启动后还会占用启动端口的后一个端口。 +我们继续按照顺序分别启动四个Broker服务,最后启动的broker-bs,并且给NameServer的RouteInfoManager中的registerBroker方法加上断点,因为Broker向NameServer发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 + +- topicQueueTable: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213231041621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) +上图中topicQueueTable对应于运行时的数据就是: +```json +{ + "testCluster": [ + { + "brokerName": "broker-a", + "readQueueNums": 16, + "writeQueueNums": 16, + "perm": 7, + "topicSynFlag": 0 + }, + { + "brokerName": "broker-b", + "readQueueNums": 16, + "writeQueueNums": 16, + "perm": 7, + "topicSynFlag": 0 + } + ] +} +``` +- brokerAddrTable: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213232601362.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) +上图中brokerAddrTable对应于运行时的数据就是: +```json +{ + "broker-a": { + "cluster": "testCluster", + "brokerName": "broker-a", + "brokerAddrs": { + "0": "172.20.192.218:10911", + "1": "172.20.192.218:10921" + } + }, + "broker-b": { + "cluster": "testCluster", + "brokerName": "broker-b", + "brokerAddrs": { + "0": "172.20.192.218:10931", + "1": "172.20.192.218:10941" + } + } +} +``` +- clusterAddrTable: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213223306896.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) +上图中clusterAddrTable对应于运行时的数据就是: +```json +{ + "testCluster": { + "broker-b": "DEFAULT_OBJECT", + "broker-a": "DEFAULT_OBJECT" + } +} +``` +这里需要说明一点,HashSet底层的实现结构仍然是HashMap,所以这里使用HashMap的方式来展示HashSet,读者关心Map的键即可。 +- brokerLiveTable: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213233041302.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) +上图中brokerLiveTable对应于运行时的数据就是: +```json +{ + "172.20.192.218:10921": { + "lastUpdateTimestamp": 1613230150507, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10922" + }, + "172.20.192.218:10911": { + "lastUpdateTimestamp": 1613230145828, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10912" + }, + "172.20.192.218:10941": { + "lastUpdateTimestamp": 1613230166459, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10942" + }, + "172.20.192.218:10931": { + "lastUpdateTimestamp": 1613230154587, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10932" + } +} +``` + +### 3.2 路由信息注册 + +路由信息注册通常是指,将自身的信息告诉服务注册中心,在RocketMQ中,这里的“自身”是指Broker,而服务注册中心指得就是NameServer。Broker在启动后,会向所有的NameServer注册自身的元信息,通常包括:集群名称(clusterName)、Broker地址(brokerAddr)、Broker名称(brokerName)、Broker ID(brokerId)、高可用地址(haServerAddr)、Topic相关信息(topicConfigWrapper)、过滤服务器列表、通信通道等信息等。这些元信息的注册,都是通过心跳机制来实现的,所谓的心跳机制,一般都是通过定时任务来实现的,按照一定的频率向NameServer发送元信息数据,从而实现续约。每个Broker会每隔30秒向NameServer发送心跳,NameServer接收到Broker心跳数据后,会去实时更新brokerLiveTable中BrokerLiveInfo的lastUpdateTimestamp字段(上一次心跳时间戳),当然,NameServer也有检查机制,会每隔10秒扫描brokerLiveTable,如果发现某个Broker的lastUpdateTimestamp字段超过2min没有更新,那么就认为该Broker存在故障,NameServer会主动将其从路由表中剔除,同时关闭通信通道。 +那么Broker是如何向NameServer进行注册的呢?下面的内容将一一揭秘。 + +从BrokerController的start()方法可以看出,Broker在启动的时候,会注册一个定时任务,每隔30s(默认值,可配置10~60s)向NameServer发送元数据信息。`brokerConfig.getRegisterNameServerPeriod()`的默认值是30s。 +```java +// 注册一个定时任务,默认每隔30s向NameServer发送元数据信息 +this.scheduledExecutorService.scheduleAtFixedRate(() -> { + try { + BrokerController.this.registerBrokerAll(true, + false, brokerConfig.isForceRegister()); + } catch (Throwable e) { + log.error("registerBrokerAll Exception", e); + } + }, 1000 * 10, Math.max(10000, + Math.min(brokerConfig.getRegisterNameServerPeriod(), 60000)), + TimeUnit.MILLISECONDS); +``` +具体的注册行为代码需要进入到registerBrokerAll方法中,这里将分析后的registerBrokerAll方法贴在下面: +```java +/** + * 注册Broker元信息到NameServer列表中 + * + * @param checkOrderConfig 是否检查顺序消息配置 + * @param oneway 是否是单向消息,如果是,那么就不需要知道注册结果,不同于同步和异步消息 + * @param forceRegister 是否是强制注册 + */ +public synchronized void registerBrokerAll(final boolean checkOrderConfig, boolean oneway, boolean forceRegister) { + // 将Topic配置进行包装,其实就是一些默认的topic信息 + TopicConfigSerializeWrapper topicConfigWrapper = + this.getTopicConfigManager().buildTopicConfigSerializeWrapper(); + + // 如果Broker只有读权限或者写权限,那么需要将Topic的权限设置为和Broker相同 + if (!PermName.isWriteable(this.getBrokerConfig().getBrokerPermission()) + || !PermName.isReadable(this.getBrokerConfig().getBrokerPermission())) { + ConcurrentHashMap topicConfigTable = new ConcurrentHashMap<>(); + for (TopicConfig topicConfig : topicConfigWrapper.getTopicConfigTable().values()) { + TopicConfig tmp = + new TopicConfig(topicConfig.getTopicName(), topicConfig.getReadQueueNums(), + topicConfig.getWriteQueueNums(), + this.brokerConfig.getBrokerPermission()); + topicConfigTable.put(topicConfig.getTopicName(), tmp); + } + topicConfigWrapper.setTopicConfigTable(topicConfigTable); + } + + // 判断是否需要注册,如果不满足强制注册,那么就需要调用needRegister来判断是否需要注册 + // needRegister内部逻辑也很简单,就是去请求NameServer,判断NameServer存储的Broker信息 + // 是否和当前的Broker版本信息是否一致,如果是一致的,那么就不需要注册 + if (forceRegister || needRegister(this.brokerConfig.getBrokerClusterName(), + this.getBrokerAddr(), + this.brokerConfig.getBrokerName(), + this.brokerConfig.getBrokerId(), + this.brokerConfig.getRegisterBrokerTimeoutMills())) { + // Broker向NameServer注册的主要方法 + doRegisterBrokerAll(checkOrderConfig, oneway, topicConfigWrapper); + } +} +``` +在doRegisterBrokerAll方法内,最主要的就是调用brokerOuterAPI的registerBrokerAll接口来向NameServer进行注册。 +```java +List registerBrokerResultList = this.brokerOuterAPI.registerBrokerAll( + this.brokerConfig.getBrokerClusterName(), + this.getBrokerAddr(), + this.brokerConfig.getBrokerName(), + this.brokerConfig.getBrokerId(), + this.getHAServerAddr(), + topicConfigWrapper, + this.filterServerManager.buildNewFilterServerList(), + oneway, + this.brokerConfig.getRegisterBrokerTimeoutMills(), + this.brokerConfig.isCompressedRegister()); +``` +接下来的操作就是遍历每一个NameServer服务地址,然后分别向每一个NameServer进行注册操作,具体代码如下所示: +```java +public List registerBrokerAll( + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId, + final String haServerAddr, + final TopicConfigSerializeWrapper topicConfigWrapper, + final List filterServerList, + final boolean oneway, + final int timeoutMills, + final boolean compressed) { + + // 封装注册结果的容器 + final List registerBrokerResultList = Lists.newArrayList(); + // 获取NameServer列表 + List nameServerAddressList = this.remotingClient.getNameServerAddressList(); + if (nameServerAddressList != null && !nameServerAddressList.isEmpty()) { + // 构建注册Broker的请求头对象 + final RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader(); + // 将Broker的主要元信息存储到请求头中 + requestHeader.setBrokerAddr(brokerAddr); + requestHeader.setBrokerId(brokerId); + requestHeader.setBrokerName(brokerName); + requestHeader.setClusterName(clusterName); + requestHeader.setHaServerAddr(haServerAddr); + requestHeader.setCompressed(compressed); + + // 构建请求体 + RegisterBrokerBody requestBody = new RegisterBrokerBody(); + // 将topic配置信息及过滤器服务信息数据封装到请求体中 + requestBody.setTopicConfigSerializeWrapper(topicConfigWrapper); + requestBody.setFilterServerList(filterServerList); + // 将请求体进行编码(是否进行gzip压缩,默认为false) + final byte[] body = requestBody.encode(compressed); + final int bodyCrc32 = UtilAll.crc32(body); + requestHeader.setBodyCrc32(bodyCrc32); + final CountDownLatch countDownLatch = new CountDownLatch(nameServerAddressList.size()); + // 遍历所有的NameServer地址,分别向每一个NameServer进行注册 + for (final String namesrvAddr : nameServerAddressList) { + brokerOuterExecutor.execute(() -> { + try { + RegisterBrokerResult result = + registerBroker(namesrvAddr, oneway, timeoutMills, requestHeader, body); + if (result != null) { + registerBrokerResultList.add(result); + } + + log.info("register broker[{}]to name server {} OK", brokerId, namesrvAddr); + } catch (Exception e) { + log.warn("registerBroker Exception, {}", namesrvAddr, e); + } finally { + countDownLatch.countDown(); + } + }); + } + + try { + countDownLatch.await(timeoutMills, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + } + } + + return registerBrokerResultList; +} +``` +分别向每一个NameServer注册时候,调用的都是同一个方法:registerBroker,底层调用的都是由Netty封装的远程连接,通过请求码来获取远程调用连接,将注册信息发送过去。注册Broker使用到的请求码是`RequestCode.REGISTER_BROKER`,不同的需求使用的请求码是不一样的,比如注销Broker使用到的是`RequestCode.UNREGISTER_BROKER`。 +```java +private RegisterBrokerResult registerBroker( + final String namesrvAddr, + final boolean oneway, + final int timeoutMills, + final RegisterBrokerRequestHeader requestHeader, + final byte[] body +) throws RemotingCommandException, MQBrokerException, RemotingConnectException, RemotingSendRequestException, + RemotingTimeoutException, + InterruptedException { + // 根据请求码RequestCode.REGISTER_BROKER获取注册Broker信息的远程连接 + RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.REGISTER_BROKER, requestHeader); + request.setBody(body); + + // 如果是单向消息,也就是不管注册结果如何,那么就调用不同的方法来进行注册 + if (oneway) { + try { + this.remotingClient.invokeOneway(namesrvAddr, request, timeoutMills); + } catch (RemotingTooMuchRequestException e) { + // Ignore + } + return null; + } + + // 同步注册,也就是阻塞等待注册结果 + RemotingCommand response = this.remotingClient.invokeSync(namesrvAddr, request, timeoutMills); + assert response != null; + switch (response.getCode()) { + case ResponseCode.SUCCESS: { + // 解析注册结果 + RegisterBrokerResponseHeader responseHeader = + (RegisterBrokerResponseHeader) response + .decodeCommandCustomHeader(RegisterBrokerResponseHeader.class); + RegisterBrokerResult result = new RegisterBrokerResult(); + result.setMasterAddr(responseHeader.getMasterAddr()); + result.setHaServerAddr(responseHeader.getHaServerAddr()); + if (response.getBody() != null) { + result.setKvTable(KVTable.decode(response.getBody(), KVTable.class)); + } + return result; + } + default: + break; + } + + throw new MQBrokerException(response.getCode(), response.getRemark()); +} +``` +再往底层分析就是涉及到Netty的知识了,本文主要围绕RocketMQ来进行源码分析,对于Netty,后续将通过其他的文章来讨论。以上内容就是Broker在启动的过程中向指定的NameServer注册元信息的流程分析。 + +Broker向指定的NameServer发送了心跳,NameServer接收到心跳后是如何处理的呢?本节中第一小节路由信息管理器中阐述了Broker发送过来的心跳数据是以何种形式存储在路由管理器中,接下来将解析路由信息维护的源代码,方便大家弄清楚其中的原理。 + +NameServer在初始化的时候,注册了一个处理器DefaultRequestProcessor,专门用于处理网络请求,已经没有印象的读者可以去文章的开始处看NamesrvController的initialize方法。当远程的注册请求到达的时候,都会由DefaultRequestProcessor的processRequest方法来进行处理,该方法其实就是起到了路由的作用,内部根据请求码来判断该调用哪个API来进行具体的操作,对于Broker注册元信息,其实就是转发给RouteInfoManager的registerBroker方法来进行处理的。 +```java +/** + * 注册Broker + * + * @param clusterName broker集群名称,来自broker.conf中配置的属性brokerClusterName的值 + * @param brokerAddr broker地址 + * @param brokerName broker名称,来自broker.conf中配置的属性brokerName的值 + * @param brokerId broker ID,来自broker.conf中配置的属性brokerId的值 + * @param haServerAddr ha server地址 + * @param topicConfigWrapper topic配置包装类对象 + * @param filterServerList filter server列表 + * @param channel netty channel + * @return RegisterBrokerResult 注册Broker结果 + */ +public RegisterBrokerResult registerBroker( + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId, + final String haServerAddr, + final TopicConfigSerializeWrapper topicConfigWrapper, + final List filterServerList, + final Channel channel) { + // 封装注册Broker的结果实体类 + RegisterBrokerResult result = new RegisterBrokerResult(); + try { + try { + // 第一步:获取一个写锁,防止并发修改路由表中的数据导致异常 + this.lock.writeLock().lockInterruptibly(); + + // 第二步:维护集群与BrokerName的路由表(关系表) + // 如果clusterAddrTable中集群名对应的brokerName集合存在,那么就直接存入,否则创建一个新的HashSet后存入 + Set brokerNames = this.clusterAddrTable.computeIfAbsent(clusterName, k -> new HashSet<>()); + brokerNames.add(brokerName); + + // 标记是否为第一次注册为false + boolean registerFirst = false; + + // 第三步:维护brokerName和brokerData的路由表(关系表) + // 根据brokerName来获取brokerData数据,如果brokerData不存在,那么可认为该Broker这是第一次注册 + BrokerData brokerData = this.brokerAddrTable.get(brokerName); + if (null == brokerData) { + registerFirst = true; + brokerData = new BrokerData(clusterName, brokerName, new HashMap<>()); + this.brokerAddrTable.put(brokerName, brokerData); + } + // 下面的这段代码其实我个人更加愿意将其使用代码块封装起来,其作用就是如果注册的Broker的ID发生了变化, + // 那么将原有注册的brokerAddr删除,再重新将新的信息存入到brokerData中的brokerAddrs + // 具体的可看下面的英文描述,也就是切换slave的broker为master的操作 + Map brokerAddrsMap = brokerData.getBrokerAddrs(); + //Switch slave to master: first remove <1, IP:PORT> in namesrv, then add <0, IP:PORT> + //The same IP:PORT must only have one record in brokerAddrTable + brokerAddrsMap.entrySet().removeIf( + item -> null != brokerAddr && brokerAddr.equals(item.getValue()) && brokerId != item.getKey()); + + // 将broker信息存入到brokerData的表brokerAddrs中 + String oldAddr = brokerData.getBrokerAddrs().put(brokerId, brokerAddr); + // 如果返回的oldAddr为null,则说明新存入的,表brokerAddrs不存在键为brokerId的数据,这种也认为是第一次注册 + registerFirst = registerFirst || (null == oldAddr); + + // 第四步:判断是否需要更新topicConfig信息,只有主Broker注册的时候(topicConfigWrapper始终不为空)才会去进一步判断 + if (null != topicConfigWrapper + && MixAll.MASTER_ID == brokerId) { + // 如果是第一次注册,或者topicConfig的版本发生了变化,那么就需要更新 + // 第一次注册,其实带来的topic都是一些默认的topic信息,当生产者发送主题的时候,如果主题没有创建,且 + // brokerConfig中的字段autoCreateTopicEnable为true的时候,那么将返回默认的主题路由信息 + if (this.isBrokerTopicConfigChanged(brokerAddr, topicConfigWrapper.getDataVersion()) + || registerFirst) { + ConcurrentMap tcTable = + topicConfigWrapper.getTopicConfigTable(); + if (tcTable != null) { + for (Map.Entry entry : tcTable.entrySet()) { + // 第五步:维护topicQueueTable路由表,没有则创建QueueData,否则根据需要来更新 + this.createAndUpdateQueueData(brokerName, entry.getValue()); + } + } + } + } + + // 第六步:维护brokerLiveTable路由表,将broker的信息存入到表中 + BrokerLiveInfo prevBrokerLiveInfo = this.brokerLiveTable.put(brokerAddr, + new BrokerLiveInfo( + System.currentTimeMillis(), + topicConfigWrapper.getDataVersion(), + channel, + haServerAddr)); + // 如果返回的为null,则认为是将新的broker注册到表中 + if (null == prevBrokerLiveInfo) { + log.info("new broker registered, {} HAServer: {}", brokerAddr, haServerAddr); + } + + // 第七步:维护filterServerTable,这一块内容后续分析 + if (filterServerList != null) { + if (filterServerList.isEmpty()) { + this.filterServerTable.remove(brokerAddr); + } else { + this.filterServerTable.put(brokerAddr, filterServerList); + } + } + + // 第八步:如果是非master的broker注册,还需要将master的信息返回给broker端 + if (MixAll.MASTER_ID != brokerId) { + String masterAddr = brokerData.getBrokerAddrs().get(MixAll.MASTER_ID); + if (masterAddr != null) { + BrokerLiveInfo brokerLiveInfo = this.brokerLiveTable.get(masterAddr); + if (brokerLiveInfo != null) { + result.setHaServerAddr(brokerLiveInfo.getHaServerAddr()); + result.setMasterAddr(masterAddr); + } + } + } + } finally { + // 第九步:释放写锁 + this.lock.writeLock().unlock(); + } + } catch (Exception e) { + log.error("registerBroker Exception", e); + } + + return result; +} +``` +以上的代码就是NameServer接收到Broker注册信息后维护路由表的代码,逻辑清晰明了,简单,设计中加入了写锁,保证了并发情况下的线程安全。读者直接阅读上述的代码注释就可以明白路由信息维护的流程及原理。 +### 3.3 路由信息剔除 + +接下来我们继续一起探讨一下路由信息剔除的原理。在『3.2 路由信息注册』小节中,我们已经分析了部分路由信息剔除的原理:每个Broker会每隔30秒向NameServer发送心跳,NameServer接收到Broker心跳数据后,会去实时更新brokerLiveTable中BrokerLiveInfo的lastUpdateTimestamp字段(上一次心跳时间戳),当然,NameServer也有检查机制,会每隔10秒扫描brokerLiveTable,如果发现某个Broker的lastUpdateTimestamp字段超过2min没有更新,那么就认为该Broker存在故障,NameServer会主动将其从路由表中剔除,同时关闭通信通道。 +对于RocketMQ来说,剔除路由信息主要有两个方式: + +- 故障剔除:故障剔除就是某个Broker超过2min没有发送心跳给NameServer,那么NameServer就会认为该Broker发生了故障,就会主动将其剔除,并同时更新所有的路由表。 +- 主动注销:Broker正常下线,向NameServer发送注销的请求,那么NameServer就会去实时更新全部路由表。 + +对于故障剔除和主动注销,底层使用到的代码是一样的,区别是前者是NameServer通过定时扫描,定期检查的方式来主动发现的,后者是Broker下线时主动发送注销请求告知NameServer的,在NameServer端处理方式是一样的。 + +**从故障剔除的角度来分析:** +NameServer在初始化的时候注册了一个定时任务,每隔10s扫描一次brokerLiveTable表,超过2min没有更新的Broker将被其剔除。 +```java +// NameServer定时每隔10秒钟扫描一次Broker列表,移除已经处于非激活状态的Broker +this.scheduledExecutorService.scheduleAtFixedRate( + NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, 10, TimeUnit.SECONDS); +``` +这里需要重点关注RouteInfoManager的scanNotActiveBroker方法: +```java +/** + * 扫描brokerLiveTable,将超过2min没有更新的Broker移除 + */ +public void scanNotActiveBroker() { + Iterator> it = this.brokerLiveTable.entrySet().iterator(); + while (it.hasNext()) { + Entry next = it.next(); + long last = next.getValue().getLastUpdateTimestamp(); + // 上一次更新时间戳+120s小于当前时间戳说明Broker已经过期 + if ((last + BROKER_CHANNEL_EXPIRED_TIME) < System.currentTimeMillis()) { + // 关闭通信通道 + RemotingUtil.closeChannel(next.getValue().getChannel()); + // 剔除broker + it.remove(); + log.warn("The broker channel expired, {} {}ms", next.getKey(), BROKER_CHANNEL_EXPIRED_TIME); + // 维护其他几个路由表 + this.onChannelDestroy(next.getKey(), next.getValue().getChannel()); + } + } +} +``` +当过期后,NameServer将Broker从brokerLiveTable剔除,并关闭了通信通道,其他路由表的维护则依赖onChannelDestroy方法。 +```java +/** + * 移除topicQueueTable brokerAddrTable clusterAddrTable中关于制定Broker的路由信息 + * + * @param remoteAddr Broker的地址 + * @param channel 通信通道 + */ +public void onChannelDestroy(String remoteAddr, Channel channel) { + String brokerAddrFound = null; + // 该方法不仅仅是在清理路由表的信息的时候调用,NameServer在定期检查长连接的时候也会去调用 + // 所以下面的这个if代码块是在定期检查长连接的时候用到 + if (channel != null) { + try { + try { + this.lock.readLock().lockInterruptibly(); + Iterator> itBrokerLiveTable = + this.brokerLiveTable.entrySet().iterator(); + while (itBrokerLiveTable.hasNext()) { + Entry entry = itBrokerLiveTable.next(); + if (entry.getValue().getChannel() == channel) { + brokerAddrFound = entry.getKey(); + break; + } + } + } finally { + this.lock.readLock().unlock(); + } + } catch (Exception e) { + log.error("onChannelDestroy Exception", e); + } + } + + // 如果brokerAddrFound为null,那么说明brokerLiveTable已经不存在指定的Broker信息了 + if (null == brokerAddrFound) { + brokerAddrFound = remoteAddr; + } else { + log.info("the broker's channel destroyed, {}, clean it's data structure at once", brokerAddrFound); + } + + if (brokerAddrFound != null && brokerAddrFound.length() > 0) { + + try { + try { + // 正式清理路由表信息 + // 第一步:获取写锁,防止并发异常 + this.lock.writeLock().lockInterruptibly(); + // 第二步:根据brokerAddr,移除路由表brokerLiveTable和filterServerTable中指定的Broker信息 + this.brokerLiveTable.remove(brokerAddrFound); + this.filterServerTable.remove(brokerAddrFound); + String brokerNameFound = null; + boolean removeBrokerName = false; + // 第三步:开始清理brokerAddrTable中关于指定brokerAddr的信息 + // 如果brokerName对应的BrokerData中没有Broker的信息,也就是BrokerData中的Map的brokerAddrs + // 为空,那么也要移除该brokerName对应的信息 + Iterator> itBrokerAddrTable = + this.brokerAddrTable.entrySet().iterator(); + while (itBrokerAddrTable.hasNext() && (null == brokerNameFound)) { + BrokerData brokerData = itBrokerAddrTable.next().getValue(); + + Iterator> it = brokerData.getBrokerAddrs().entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + Long brokerId = entry.getKey(); + String brokerAddr = entry.getValue(); + if (brokerAddr.equals(brokerAddrFound)) { + brokerNameFound = brokerData.getBrokerName(); + it.remove(); + log.info("remove brokerAddr[{}, {}] from brokerAddrTable, because channel destroyed", + brokerId, brokerAddr); + break; + } + } + + if (brokerData.getBrokerAddrs().isEmpty()) { + removeBrokerName = true; + itBrokerAddrTable.remove(); + log.info("remove brokerName[{}] from brokerAddrTable, because channel destroyed", + brokerData.getBrokerName()); + } + } + + // 第四步:清理clusterAddrTable中的brokerName信息,如果brokerName对应的没有存活的broker信息 + // 那么就需要在clusterAddrTable移除brokerName的信息 + if (brokerNameFound != null && removeBrokerName) { + Iterator>> it = this.clusterAddrTable.entrySet().iterator(); + while (it.hasNext()) { + Entry> entry = it.next(); + String clusterName = entry.getKey(); + Set brokerNames = entry.getValue(); + boolean removed = brokerNames.remove(brokerNameFound); + if (removed) { + log.info( + "remove brokerName[{}], clusterName[{}] from clusterAddrTable, because " + + "channel destroyed", + brokerNameFound, clusterName); + + if (brokerNames.isEmpty()) { + log.info( + "remove the clusterName[{}] from clusterAddrTable, because channel " + + "destroyed and no broker in this cluster", + clusterName); + it.remove(); + } + + break; + } + } + } + + // 第五步:清理topicQueueTable中对应的QueueData信息,如果brokerName对应的 + // broker都已经被移除,那么就需要清理对应的Queue的信息 + if (removeBrokerName) { + Iterator>> itTopicQueueTable = + this.topicQueueTable.entrySet().iterator(); + while (itTopicQueueTable.hasNext()) { + Entry> entry = itTopicQueueTable.next(); + String topic = entry.getKey(); + List queueDataList = entry.getValue(); + + Iterator itQueueData = queueDataList.iterator(); + while (itQueueData.hasNext()) { + QueueData queueData = itQueueData.next(); + if (queueData.getBrokerName().equals(brokerNameFound)) { + itQueueData.remove(); + log.info("remove topic[{} {}], from topicQueueTable, because channel destroyed", + topic, queueData); + } + } + + if (queueDataList.isEmpty()) { + itTopicQueueTable.remove(); + log.info("remove topic[{}] all queue, from topicQueueTable, because channel destroyed", + topic); + } + } + } + } finally { + // 第六步:必须释放锁资源 + this.lock.writeLock().unlock(); + } + } catch (Exception e) { + log.error("onChannelDestroy Exception", e); + } + } +} +``` +从上面的代码看来逻辑思路还是非常简单明了的,NameServer的设计初衷就是为了让系统更加简单。 + +**从主动注销的角度来分析:** +在Broker正常启动的时候会注册一个shutDown的钩子函数,代码如下所示: +```java +// Broker在启动的时候会注册一个钩子函数,当Broker的进程收到退出进程的信号后会指定该函数 +// 主要是执行controller.shutdown();来关闭资源链接已经清理NameServer中的路由信息等 +Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + private volatile boolean hasShutdown = false; + private final AtomicInteger shutdownTimes = new AtomicInteger(0); + + @Override + public void run() { + synchronized (this) { + log.info("Shutdown hook was invoked, {}", this.shutdownTimes.incrementAndGet()); + if (!this.hasShutdown) { + this.hasShutdown = true; + long beginTime = System.currentTimeMillis(); + controller.shutdown(); + long consumingTimeTotal = System.currentTimeMillis() - beginTime; + log.info("Shutdown hook over, consuming total time(ms): {}", consumingTimeTotal); + } + } + } + }, "ShutdownHook")); +``` +`controller.shutdown();`中会执行`this.unregisterBrokerAll();`方法,主要是去主动注销NameServer中的路由信息,底层调用的还是`brokerOuterAPI.unregisterBrokerAll`的方法: +```java +/** + * 注销NameServer中的路由信息 + * + * @param clusterName 集群名称 + * @param brokerAddr broker地址 + * @param brokerName broker名称 + * @param brokerId broker ID + */ +public void unregisterBrokerAll( + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId +) { + // 获取所有的NameServer列表 + List nameServerAddressList = this.remotingClient.getNameServerAddressList(); + if (nameServerAddressList != null) { + // 遍历NameServer列表并分别注销 + for (String namesrvAddr : nameServerAddressList) { + try { + this.unregisterBroker(namesrvAddr, clusterName, brokerAddr, brokerName, brokerId); + log.info("unregisterBroker OK, NamesrvAddr: {}", namesrvAddr); + } catch (Exception e) { + log.warn("unregisterBroker Exception, {}", namesrvAddr, e); + } + } + } +} +``` +具体的注销逻辑和注册逻辑是类似的,首先构建请求头,将必要信息进行封装,然后根据请求码来获取连接,然后执行连接获取执行结果,具体代码如下所示: +```java +public void unregisterBroker( + final String namesrvAddr, + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId +) throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException, + MQBrokerException { + // 第一步:封装注销Broker的请求头 + UnRegisterBrokerRequestHeader requestHeader = new UnRegisterBrokerRequestHeader(); + requestHeader.setBrokerAddr(brokerAddr); + requestHeader.setBrokerId(brokerId); + requestHeader.setBrokerName(brokerName); + requestHeader.setClusterName(clusterName); + // 第二步:根据请求码来获取连接 + RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.UNREGISTER_BROKER, requestHeader); + + // 第三步:执行连接请求 + RemotingCommand response = this.remotingClient.invokeSync(namesrvAddr, request, 3000); + assert response != null; + // 第四步:分析结果 + switch (response.getCode()) { + case ResponseCode.SUCCESS: { + return; + } + default: + break; + } + + throw new MQBrokerException(response.getCode(), response.getRemark()); +} +``` +这是Broker端主动注销的源码分析,当NameServer接收到注销请求后,会由NameServer的DefaultRequestProcessor根据请求码转发给RouteInfoManager的unregisterBroker方法来进行路由的删除维护操作,就和NameServer定期扫描的在底层使用的方法是一致的了。 + +### 3.4 路由信息发现 + +NameServer在设计之初就考虑将其设计得更加简单,NameServer中的路由信息在发生变化后,并不会主动推送给客户端(包括生产者和消费者),而是需要客户端主动拉取最新的路由信息。具体的请求码是`RequestCode.GET_ROUTEINFO_BY_TOPIC`,请求到达NameServer的DefaultRequestProcessor后,将转发给getRouteInfoByTopic方法来执行,具体的源码如下所示: +```java +/** + * 根据Topic来获取路由信息 + * + * @param ctx 上下文环境 + * @param request 请求内容 + * @return RemotingCommand对象 + * @throws RemotingCommandException 异常 + */ +public RemotingCommand getRouteInfoByTopic(ChannelHandlerContext ctx, + RemotingCommand request) throws RemotingCommandException { + // 封装返回体和解析请求头 + final RemotingCommand response = RemotingCommand.createResponseCommand(null); + final GetRouteInfoRequestHeader requestHeader = + (GetRouteInfoRequestHeader) request.decodeCommandCustomHeader(GetRouteInfoRequestHeader.class); + + // 从RouteInfoManager中获取路由信息,并封装为TopicRouteData对象 + TopicRouteData topicRouteData = + this.namesrvController.getRouteInfoManager().pickupTopicRouteData(requestHeader.getTopic()); + + if (topicRouteData != null) { + // 如果路由信息存在,且该主题配置的是顺序消息,那么就从NameServer的KVconfig中获取顺序消息相关的配置 + if (this.namesrvController.getNamesrvConfig().isOrderMessageEnable()) { + String orderTopicConf = + this.namesrvController.getKvConfigManager() + .getKVConfig(NamesrvUtil.NAMESPACE_ORDER_TOPIC_CONFIG, + requestHeader.getTopic()); + topicRouteData.setOrderTopicConf(orderTopicConf); + } + + // 返回体编码并返回 + byte[] content = topicRouteData.encode(); + response.setBody(content); + response.setCode(ResponseCode.SUCCESS); + response.setRemark(null); + return response; + } + + // 在未找到路由信息的情况下返回如下信息 + response.setCode(ResponseCode.TOPIC_NOT_EXIST); + response.setRemark("No topic route info in name server for the topic: " + requestHeader.getTopic() + + FAQUrl.suggestTodo(FAQUrl.APPLY_TOPIC_URL)); + return response; +} +``` +以上代码中主要的一行代码是: +```java +// 从RouteInfoManager中获取路由信息,并封装为TopicRouteData对象 +TopicRouteData topicRouteData = + this.namesrvController.getRouteInfoManager().pickupTopicRouteData(requestHeader.getTopic()); +``` +底层还是需要从RouteInfoManager获取路由表信息,最后将其封装为TopicRouteData返回给客户端。由于`pickupTopicRouteData`方法简单明了,读者可自行阅读并理解。 + +## 四、文章小结 + +本文从NameServer的启动流程开始分析,一步一步分析到本文的主要内容——路由管理器(RouteInfoManager),主要围绕路由信息的注册、剔除与发现,一步步分析后,我们发现原理其实很简单,RocketMQ就是这么喜人,性能强大的同时,让所有喜欢源码的朋友都能阅读得懂。总结来说就是: + +- Broker在启动的时候向指定的NameServer进行注册,发送自身的元信息到NameServer的路由管理器; +- 路由信息的剔除则有主动注销和异常剔除两种情况,都是将路由信息从路由管理器中删除,NameServer端的底层处理方式都是一致的,只是触发的方式不一样而已,前者是NameServer主动扫描,后者是Broker主动发送注销请求; +- 获取路由信息则由客户端主动拉取,NameServer并不会主动推送。 + +思考:如果某个Broker发生了故障,并没有主动发起注销的请求,那么NameServer最少要等待2min才会得知并进行故障剔除,在这期间,生产者将消息发送到故障的Broker,那么就会造成发送失败,其实这是分布式系统中常见的高可用问题,那么RocketMQ是如何解决这种问题的呢?我们可以带着这个问题进入到下一节的源码分析《[RocketMQ源码之路(三)消息发送源码分析](https://itlemon.blog.csdn.net/article/details/113879541)》,欢迎来撩。 + +了解更多干货,欢迎关注我的微信公众号:爪哇论剑(微信号:itlemon) +![微信公众号-爪哇论剑-itlemon](https://img-blog.csdnimg.cn/20190917130526135.jpeg) \ No newline at end of file From 368c88becb11381e67cf6cfc647669bc76bee10b Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 14 Feb 2023 23:33:13 +0800 Subject: [PATCH 11/61] add: add nameserver pages. --- docs/.vuepress/config.ts | 4 ++-- ...32\204\345\220\257\345\212\250\345\216\237\347\220\206.md" | 2 +- ...24\261\347\256\241\347\220\206\346\234\272\345\210\266.md" | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index ed30d51..6caf082 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -140,8 +140,8 @@ export default defineUserConfig({ mdEnhancePlugin({ // 使用 KaTeX 启用 TeX 支持 katex: true, - // 启用图片大小 - imgSize: true, + // 启用 mermaid + mermaid: true, }), ], }) \ No newline at end of file diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index b2d71a9..b02e015 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -1,4 +1,4 @@ -# 第一节 NameServer的启动原理 +# 第1节 NameServer的启动原理 ![image-20230214231618529](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230214231618529.png) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index f1078d6..093c008 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -1,3 +1,3 @@ -# 第二节 NameServer的路由管理机制 +# 第2节 NameServer的路由管理机制 -更多内容,敬请期待 \ No newline at end of file +![image-20230214233259510](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230214233259510.png) \ No newline at end of file From c8fdcf03d96172a821d696dbceb4526d2c31b5a7 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 15 Feb 2023 23:49:51 +0800 Subject: [PATCH 12/61] add: add rocketmq 5.0 feature page. --- docs/.vuepress/configs/sidebar/zh.ts | 3 ++- .../1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" | 2 ++ ...257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 "docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" rename "docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" => "docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" (99%) diff --git a/docs/.vuepress/configs/sidebar/zh.ts b/docs/.vuepress/configs/sidebar/zh.ts index 7a5f0ff..8bbfd92 100644 --- a/docs/.vuepress/configs/sidebar/zh.ts +++ b/docs/.vuepress/configs/sidebar/zh.ts @@ -131,7 +131,8 @@ export const sidebarZh: SidebarConfig = { { text: '第一章 搭建源码环境', children: [ - '1-1RocketMQ源码阅读环境搭建.md' + '1-1RocketMQ5.0新特性.md', + '1-2RocketMQ源码阅读环境搭建.md' ] }, { diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" new file mode 100644 index 0000000..c7dc0f0 --- /dev/null +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" @@ -0,0 +1,2 @@ +# 第1节 RocketMQ 5.0 新特性 + diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" similarity index 99% rename from "docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" rename to "docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index 8600d83..0c4b150 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -1,4 +1,4 @@ -# 第1节 搭建RocketMQ源码环境 +# 第2节 搭建RocketMQ源码环境 ![image-20230212125755344](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230212125755344.png) From a3adce284b5f336c819114a6ea0782f220c49b9e Mon Sep 17 00:00:00 2001 From: itlemon Date: Sat, 18 Feb 2023 23:34:36 +0800 Subject: [PATCH 13/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84namesrv=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\212\250\345\216\237\347\220\206.md" | 90 +++++++++++++++++-- 1 file changed, 83 insertions(+), 7 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index b02e015..796ad8b 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -2,20 +2,96 @@ ![image-20230214231618529](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230214231618529.png) -> 一般了解 RocketMQ 的读者都知道,NameServer 是 RocketMQ 的组织协调者,是 RocketMQ 对外提供服务的“大脑”。NameServer 提供了路由管理,服务注册与服务发现等机制,是保证消息正确地从生产者到消费者的“指挥官”。那么,生产者生产的消息是如何正确地被消费者消费的呢?Broker 的宕机是如何被生产者和消费者感知的呢?RocketMQ 对外提供服务的可靠性是如何保障的呢?带着这几个问题,我们一起去深入了解RocketMQ NameServer 的设计原理及实现吧! +> 一般了解 RocketMQ 的读者都知道,NameServer 是 RocketMQ 的组织协调者,是 RocketMQ 对外提供服务的“大脑”。NameServer 提供了路由管理,服务注册与服务发现等机制,是保证消息正确地从生产者到消费者的“指挥官”。那么,生产者生产的消息是如何正确地被消费者消费的呢?Broker 的宕机是如何被生产者和消费者感知的呢?RocketMQ 对外提供服务的可靠性是如何保障的呢?带着这几个问题,我们一起去深入了解RocketMQ NameServer 的设计原理及实现吧!文中的代码仓库地址:[点击跳转](https://github.com/itlemon/rocketmq-5.0.0)。 ## 一、NameServer的基本原理 -我们熟知的几种常见的消息队列组件,比如Kafka,ActiveMQ,RabbitMQ等,都是一种基于主题的发布订阅机制,RocketMQ也正是基于这种机制实现的消息服务。消息生产者(Producer)将生产好的消息发布到某个主题,该主题下的消息在消息服务器(Broker)中进行传送或存储,由消费者(Consumer)进行订阅主题,从消息服务器中获取到消息后进行消费。消费者获取消息的方式通常有两种,一种是主动去消息服务器拉取消息(Pull Message),另外一种是由消息服务器推送消息(Push Message)给消费者。这种主题的发布订阅机制应用到分布式系统中,成功解耦了生产者和消费者。既然是分布式系统,那么常常存在分布式系统问题,比如某个消息服务器宕机了,生产者是如何感知这台消息服务器宕机了,从而避免将消息发送到这台消息服务器上,消费者是如何感知这台消息服务器宕机了,从而避免从这台消息服务器上拉取消息的呢?且这台宕机的消息服务器是如何从消息服务器实例列表中被剔除的呢?这一切都将归功于NameServer,它的诞生让动态感知、动态剔除、负载均衡成为可能。 -图1-1是RocketMQ常见的物理部署图(图片来源:百度图库),采用的部署方式2m-2s(2Master,2Slave),本小节将根据此图阐述RocketMQ基本的流程原理,后面的小节将深入源码中,从源码中来验证基本流程原理。 +我们熟知的几种常见的消息队列组件,比如 Kafka,ActiveMQ,RabbitMQ 等,都是一种基于主题的发布订阅机制,RocketMQ 也正是基于这种机制实现的消息服务。消息生产者(Producer)将生产好的消息发布到某个主题,该主题下的消息在消息服务器(Broker)中进行传送或存储,由消费者(Consumer)进行订阅主题,从消息服务器中获取到消息后进行消费。 + +消费者获取消息的方式通常有两种,一种是主动去消息服务器拉取消息(Pull Message),另外一种是由消息服务器推送消息(Push Message)给消费者。这种主题的发布订阅机制应用到分布式系统中,成功解耦了生产者和消费者。既然是分布式系统,那么常常存在分布式系统问题,比如某个消息服务器宕机了,生产者是如何感知这台消息服务器宕机了,从而避免将消息发送到这台消息服务器上,消费者是如何感知这台消息服务器宕机了,从而避免从这台消息服务器上拉取消息的呢?且这台宕机的消息服务器是如何从消息服务器实例列表中被剔除的呢?这一切都将归功于 NameServer,它的诞生让动态感知、动态剔除、负载均衡成为可能。 + +下图是 RocketMQ 常见的物理部署图(图片来源:百度图库),采用的部署方式2m-2s(2Master,2Slave),这个部署结构在 RocketMQ 4.x 中也是常用的,本文暂时将不会去过多介绍 RocketMQ 5.0 的新部署结构,后续将有专门的文章去阐述。本小节将根据此图阐述 RocketMQ 基本的流程原理,后面的小节将深入源码中,从源码中来验证基本流程原理。 + ![](https://img-blog.csdnimg.cn/20201017102633155.png) -文章一开始就说道,NameServer是整个RocketMQ消息服务系统的“大脑”,是指挥消息正确发送、消费的“指挥官”,那么他是如何完成这样完美的指挥任务的呢? -NameServer被设计为一种无状态的服务注册发现中心,在NameServer集群中,各个NameServer之间是无感知,无通信的独立节点,任何一个NameServer节点挂掉,都不影响整体的消息服务。Broker在启动的时候,会向指定的NameServer列表中的每个NameServer注册,发送自身的元信息到每个NameServer中,这些元信息包含但不限于BrokerName,BrokerAddress,Broker端口,集群信息,Topic等信息,这些元信息将保存在NameServer的路由信息管理器(RouteInfoManager)中。当消息生产者在将生产的消息发送出去之前,会从NameServer中拉取Broker的信息列表,然后通过负载均衡算法从中选择一个Broker服务器将消息发送出去。当消息消费者要消费消息之前,也会去NameServer中拉取Broker的信息列表,从而从Broker中获取可消费的消息。Broker在首次启动会向NameServer注册元信息,启动后也会定期向NameServer发送心跳,这个周期默认是30秒,当然这个周期可以自定义,支持范围是10秒到60秒之间,每次心跳发送的数据包都是该Broker的元数据信息。NameServer也有自动检测能力,NameServer启动后会注册一个定时任务线程池,每10秒会自动扫描Broker列表,对于不再存活的Broker,将做剔除处理。这动态维护路由信息的能力,并不包含动态通知消息生产者,也就是说生产者并不会及时感知到非存活状态Broker被剔除,但是这并不影响消息的正确发送,因为生产者自身提供有容错机制来保证消息的正常发送。消费者与NameServer没有保持长连接,而是每30秒从NameServer获取所有Topic的信息列表,如果某个时刻某个Broker宕机,消费者可能需要30秒才能知道这个宕机的Broker是哪一个,当然这个值也是可以手动配置的,可根据实际业务来配置该值。消费者在感知Broker存活这一块,有自己的机制,比如每30秒向Broker发送心跳,且Broker每10秒会检测与消费者的连接情况,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟)没有发送心跳数据,则关闭连接,并向该消费者分组的所有消费者发出通知,分组内消费者重新分配队列继续消费。 + +文章一开始就说道,NameServer 是整个 RocketMQ 消息服务系统的“大脑”,是指挥消息正确发送、消费的“指挥官”,那么他是如何完成这样完美的指挥任务的呢? + +NameServer 被设计为一种无状态的服务注册发现中心,在 NameServer 集群中,各个 NameServer 之间是无感知,无通信的独立节点,任何一个 NameServer 节点挂掉,都不影响整体的消息服务。 + +Broker 在启动的时候,会向指定的 NameServer 列表中的每个 NameServer 注册,发送自身的元信息到每个 NameServer 中,这些元信息包含但不限于 BrokerName,BrokerAddress,Broker 端口,集群信息,Topic 等信息,这些元信息将保存在 NameServer 的路由信息管理器(RouteInfoManager)中。 + +当消息生产者在将生产的消息发送出去之前,会从 NameServer 中拉取 Broker 的信息列表,然后通过负载均衡算法从中选择一个 Broker 服务器将消息发送出去。当消息消费者要消费消息之前,也会去 NameServer 中拉取 Broker 的信息列表,从而从 Broker 中获取可消费的消息。 + +Broker 在首次启动会向 NameServer 注册元信息,启动后也会定期向 NameServer 发送心跳,这个周期默认是 $30$ 秒,当然这个周期可以自定义,支持范围是 $10$ 秒到 $60$ 秒之间,每次心跳发送的数据包都是该 Broker 的元数据信息。 + +NameServer 也有自动检测能力,NameServer 启动后会注册一个定时任务线程池,默认每隔 $5$ 秒(RocketMQ 4.x 默认是 $10$ 秒)会自动扫描 Broker 列表,对于不再存活的 Broker,将做剔除处理。这动态维护路由信息的能力,并不包含动态通知消息生产者,也就是说生产者并不会及时感知到非存活状态 Broker 被剔除,但是这并不影响消息的正确发送,因为生产者自身提供有容错机制来保证消息的正常发送。 + +消费者与 NameServer 没有保持长连接,而是每 $30$ 秒从 NameServer 获取所有 Topic 的信息列表,如果某个时刻某个 Broker 宕机,消费者可能需要 $30$ 秒才能知道这个宕机的 Broker 是哪一个,当然这个值也是可以在配置文件中配置的,可根据实际业务来配置该值。消费者在感知 Broker 存活这一块,有自己的机制,比如每 $30$ 秒向 Broker 发送心跳,且 Broker 每 $10$ 秒会检测与消费者的连接情况,若某个连接 $2$ 分钟内(当前时间与最后更新时间差值超过 $2$ 分钟)没有发送心跳数据,则关闭连接,并向该消费者分组的所有消费者发出通知,分组内消费者重新分配队列继续消费。 ## 二、NameServer的启动流程原理 -在《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,我们了解了如何使用IDE启动NameServer,那么本小节将和大家一起探讨NameServer的启动流程原理,我们将 从NameServer的启动类NamesrvStartup开始,和大家一起来阅读NameServer在启动源码,帮助大家理解NameServer的启动流程。 -NameServer的启动类NamesrvStartup的main方法如下所示: +在《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-2RocketMQ源码阅读环境搭建.md)》中,我们了解了如何使用 IDE 启动 NameServer,那么本小节将和大家一起探讨 NameServer 的启动流程原理,我们将从 NameServer 的启动类 NamesrvStartup 开始,和大家一起来阅读 NameServer 的启动源码,帮助大家理解 NameServer 的启动流程。 + +NameServer 的启动类 NamesrvStartup 的 main 方法(`org.apache.rocketmq.namesrv.NamesrvStartup#main`)如下所示: + +```java +public class NamesrvStartup { + + private static InternalLogger log; + + /** + * 解析命令行参数和配置文件参数,装配到该属性中进行存储,它存储全部的配置k-v,包含-c指定的启动文件和-p打印出来的变量 + */ + private static Properties properties = null; + + /** + * NameServer配置项:从properties中解析出来的全部NameServer配置 + */ + private static NamesrvConfig namesrvConfig = null; + + /** + * NettyServer的配置项:从properties中解析出来的全部NameServer RPC服务端启动配置 + */ + private static NettyServerConfig nettyServerConfig = null; + + /** + * NettyClient的配置项:从properties中解析出来的全部NameServer RPC客户端启动配置 + */ + private static NettyClientConfig nettyClientConfig = null; + + /** + * DledgerController的配置项:从properties中解析出来的全部Controller需要的启动配置 + */ + private static ControllerConfig controllerConfig = null; + + public static void main(String[] args) { + // 该方法中是启动NameServer的主要逻辑 + main0(args); + + // 这个方法主要是启动内嵌在NameServer中的DLedger Controller, + // DLedger Controller可以通过配置的形式在NameServer进程中启动,也可以独立部署。 + // 其主要作用是,用来存储和管理 Broker 的 SyncStateSet 列表, + // 并在某个 Broker 的 Master Broker 下线或⽹络隔离时,主动发出调度指令来切换 Broker 的 Master。 + // 此部分原理暂时不过多介绍,后续将有专题介绍 + controllerManagerMain(); + } + +} +``` + +main 方法上面的 $5$ 个配置项,都是在启动过程中,从环境变量、配置文件以及启动命令行参数中解析并装配的,解释如下: + +| 配置项 | 含义 | +| :---------------: | :----------------------------------------------------------- | +| properties | 解析命令行参数和配置文件参数,装配到该属性中进行存储,它存储全部的配置 k-v,包含 `-c` 指定的启动文件和 `-p` 打印出来的变量 | +| namesrvConfig | NameServer 配置项:从 properties 中解析出来的全部 NameServer 配置 | +| nettyServerConfig | NettyServer 的配置项:从 properties 中解析出来的全部 NameServer RPC 服务端启动配置 | +| nettyClientConfig | NettyClient 的配置项:从 properties 中解析出来的全部 NameServer RPC 客户端启动配置 | +| controllerConfig | DledgerController 的配置项:从 properties 中解析出来的全部 Controller 需要的启动配置 | + + + + ```java public static void main(String[] args) { From 7f7796decc56d58c60e7d2ee4dc1cf2054cc425f Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 19 Feb 2023 18:51:53 +0800 Subject: [PATCH 14/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84namesrv=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2\204\345\220\257\345\212\250\345\216\237\347\220\206.md" | 5 +++++ 1 file changed, 5 insertions(+) diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index 796ad8b..1e51d49 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -76,6 +76,7 @@ public class NamesrvStartup { controllerManagerMain(); } + // 后续代码暂时不展开 } ``` @@ -89,7 +90,11 @@ main 方法上面的 $5$ 个配置项,都是在启动过程中,从环境变 | nettyClientConfig | NettyClient 的配置项:从 properties 中解析出来的全部 NameServer RPC 客户端启动配置 | | controllerConfig | DledgerController 的配置项:从 properties 中解析出来的全部 Controller 需要的启动配置 | +在 `main(String[] args)` 方法中,包含main0(args)和controllerManagerMain()两个方法, main0逻辑和4.9.X基本差不多,主要新增了controllerManagerMain()。 +controllerManagerMain()方法主要是判断当前Namesrv是否配置允许内嵌启动一个Controller实例。 + +Namesrv配置中有一个特殊的配置项:enableControllerInNamesrv,默认false。若设置enableControllerInNamesrv=true,则Namesrv进程会启动一个Namesrv服务和Controller服务。 From d83a786d7a095765666e646f21577f346ed4a861 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 22 Feb 2023 22:25:28 +0800 Subject: [PATCH 15/61] add: add rocketmq 5.0 feature page. --- docs/.vuepress/config.ts | 2 +- .../1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 6caf082..d4cab8e 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -29,7 +29,7 @@ export default defineUserConfig({ logoDark: '/images/logo_dark.png', repo: 'itlemon/CodingGuide', docsBranch: 'master', - repoLabel: 'GitHub', + repoLabel: '❤', docsDir: 'docs', locales: { '/': { diff --git "a/docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" "b/docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" index c7dc0f0..2bc7fa1 100644 --- "a/docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" +++ "b/docs/resources/middleware/rocketmq/1-1RocketMQ5.0\346\226\260\347\211\271\346\200\247.md" @@ -1,2 +1,3 @@ # 第1节 RocketMQ 5.0 新特性 +![image-20230216000357152](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230216000357152.png) From 3479b286f7024a92bcc30b5b4eff45a2efe26631 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 22 Feb 2023 22:46:19 +0800 Subject: [PATCH 16/61] add: add rocketmq 5.0 feature page. --- docs/.vuepress/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index d4cab8e..6caf082 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -29,7 +29,7 @@ export default defineUserConfig({ logoDark: '/images/logo_dark.png', repo: 'itlemon/CodingGuide', docsBranch: 'master', - repoLabel: '❤', + repoLabel: 'GitHub', docsDir: 'docs', locales: { '/': { From b8304ec9a4323993cedfa7dd6ed10ec7e1b7d8b1 Mon Sep 17 00:00:00 2001 From: itlemon Date: Thu, 23 Feb 2023 00:31:14 +0800 Subject: [PATCH 17/61] =?UTF-8?q?add:=20=E5=AE=8C=E5=96=84NameServer?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\212\250\345\216\237\347\220\206.md" | 237 +++++++++++++++--- 1 file changed, 196 insertions(+), 41 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index 1e51d49..f899501 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -80,7 +80,7 @@ public class NamesrvStartup { } ``` -main 方法上面的 $5$ 个配置项,都是在启动过程中,从环境变量、配置文件以及启动命令行参数中解析并装配的,解释如下: +main 方法上面的 $5$ 个配置项,都是在启动过程中,从环境变量、配置文件以及启动命令行参数中解析并装配的,具体的配置装配流程在后面的代码中会有解释,这里先把各个配置项含义解释如下: | 配置项 | 含义 | | :---------------: | :----------------------------------------------------------- | @@ -90,44 +90,215 @@ main 方法上面的 $5$ 个配置项,都是在启动过程中,从环境变 | nettyClientConfig | NettyClient 的配置项:从 properties 中解析出来的全部 NameServer RPC 客户端启动配置 | | controllerConfig | DledgerController 的配置项:从 properties 中解析出来的全部 Controller 需要的启动配置 | -在 `main(String[] args)` 方法中,包含main0(args)和controllerManagerMain()两个方法, main0逻辑和4.9.X基本差不多,主要新增了controllerManagerMain()。 +我们看这个 NameServer 的启动代码,主方法 `main(String[] args)` 只有两行,包含 `main0(args)` 和 `controllerManagerMain()` 两个方法,`main0` 逻辑和 4.9.X 基本差不多,它是启动 NameServer 的主要逻辑,相较于 4.9.X,主要新增了 `controllerManagerMain()` 。 -controllerManagerMain()方法主要是判断当前Namesrv是否配置允许内嵌启动一个Controller实例。 +`controllerManagerMain()` 方法主要是判断当前 NameServer 是否配置允许内嵌启动一个 DLedger Controller 实例。NameServer 的配置项 namesrvConfig 中有一个配置项 `enableControllerInNamesrv`,它的默认值是 false,当被设置为 true 的时候,那么在启动 NameServer 的过程中,就会启动一个 DLedger Controller 服务。此部分代码我们暂时不过多分析,后续将有专题来分析。我们继续往下看 NameServer 的启动方法 main0。 -Namesrv配置中有一个特殊的配置项:enableControllerInNamesrv,默认false。若设置enableControllerInNamesrv=true,则Namesrv进程会启动一个Namesrv服务和Controller服务。 +```java +public static void main0(String[] args) { + try { + // 解析命令行参数及配置文件中的配置,并装配到本类的各个属性上 + parseCommandlineAndConfigFile(args); + + // 创建并启动NameServer Controller + createAndStartNamesrvController(); + } catch (Throwable e) { + e.printStackTrace(); + System.exit(-1); + } + +} +``` + +从 main0 方法中可以看出,启动 NameServer 只有两个步骤: + +- 第一步是解析命令行参数及配置文件中的配置,并装配到本类的各个属性上 +- 第二步是创建并启动 NameServer Controller +### 2.1 解析配置和装配属性 +我们一起来看看启动 NameServer 的过程中,是如何将命令行参数、配置文件中的配置解析并装配到属性中的,代码及注释如下: ```java -public static void main(String[] args) { - main0(args); -} +/** + * 命令行参数解析及配置文件解析,装配属性 + * + * @param args 命令行参数 + * @throws Exception 异常 + */ +public static void parseCommandlineAndConfigFile(String[] args) throws Exception { -public static NamesrvController main0(String[] args) { + // 设置当前MQ版本设置为全局环境变量,方便在本项目的任何地方进行获取 + // key为rocketmq.remoting.version,当前版本值为:Version.V5_0_0,数值为413 + System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION)); + //PackageConflictDetect.detectFastjson(); - try { - // 第一步:根据命令行参数创建一个NamesrvController对象,内部包含各种参数加载设置等操作 - // 并设置了namesrv的启动端口 - NamesrvController controller = createNamesrvController(args); - - // 第二步:启动controller - start(controller); - String tip = "The Name Server boot success. serializeType=" + RemotingCommand - .getSerializeTypeConfigInThisServer(); - log.info(tip); - System.out.printf("%s%n", tip); - return controller; - } catch (Throwable e) { - e.printStackTrace(); + // 构建-h 和 -n 的命令行选项option,并将两个命令行选项加入到options中 + // 发散一下,其实可以在buildCommandlineOptions加一些自定义代码,比如可以设置NameServer的启动端口等 + Options options = ServerUtil.buildCommandlineOptions(new Options()); + + // 从命令行参数中解析各个命令行选项,将选项名和选项值加载到CommandLine对象中, + // 其中本类的buildCommandlineOptions方法,向options中加入了两个选项,分别是configFile和printConfigItem + // 在解析命令行选项的时候,如果发现命令行选项中包含-h或者--help,那么NameServer是不会启动的,只会打印命令行帮助信息,打印结果如下所示: + // usage: mqnamesrv [-c ] [-h] [-n ] [-p] + // -c,--configFile Name server config properties file + // -h,--help Print help + // -n,--namesrvAddr Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876' + // -p,--printConfigItem Print all config items + // 如果你自定义了一些必需的命令行选项,但是在启动的时候,又没有填写这些选项,那么是会解析出错,出错后,也会打印出各个选项的信息 + CommandLine commandLine = ServerUtil.parseCmdLine("mqnamesrv", args, buildCommandlineOptions(options), new PosixParser()); + if (null == commandLine) { System.exit(-1); + return; + } + + // 创建配置对象 + namesrvConfig = new NamesrvConfig(); + nettyServerConfig = new NettyServerConfig(); + nettyClientConfig = new NettyClientConfig(); + + // 这里默认启动监听的端口是9876,其实可以在上面的命令行选项中加入一个自定义的选型,并设置一个端口选项 + // 这样就可以在启动的时候通过命令行传入监听端口 + nettyServerConfig.setListenPort(9876); + controllerConfig = new ControllerConfig(); + + // 获取命令行中configFile的值,这个值是配置文件的位置,如果包含这个参数,那么将解析该配置文件,将配置加载到各配置对象中 + if (commandLine.hasOption('c')) { + String file = commandLine.getOptionValue('c'); + if (file != null) { + InputStream in = new BufferedInputStream(Files.newInputStream(Paths.get(file))); + properties = new Properties(); + properties.load(in); + MixAll.properties2Object(properties, namesrvConfig); + MixAll.properties2Object(properties, nettyServerConfig); + MixAll.properties2Object(properties, nettyClientConfig); + MixAll.properties2Object(properties, controllerConfig); + + namesrvConfig.setConfigStorePath(file); + + System.out.printf("load config properties file OK, %s%n", file); + in.close(); + } + } + + // 如果在启动参数加上选项-p,那么将打印出namesrvConfig和nettyServerConfig的属性值信息 + // 其中namesrvConfig主要配置了namesrv的信息,nettyServerConfig主要配置了netty的属性值信息 + // 配置打印结束后就退出进程 + if (commandLine.hasOption('p')) { + MixAll.printObjectProperties(null, namesrvConfig); + MixAll.printObjectProperties(null, nettyServerConfig); + MixAll.printObjectProperties(null, nettyClientConfig); + MixAll.printObjectProperties(null, controllerConfig); + System.exit(0); + } + + // 这里再解析一遍命令行参数,装配namesrvConfig,从代码执行顺序来看, + // 命令行中的参数优先级要高于配置文件中的配置,因为这里可以覆盖配置文件中的值 + MixAll.properties2Object(ServerUtil.commandLine2Properties(commandLine), namesrvConfig); + + // 如果没有配置系统属性值rocketmq.home.dir或者环境变量ROCKETMQ_HOME,那么将直接退出 + // rocketmq_home默认来源于配置rocketmq.home.dir,如果没有配置,将从环境变量中获取ROCKETMQ_HOME参数 + if (null == namesrvConfig.getRocketmqHome()) { + System.out.printf("Please set the %s variable in your environment to match the location of the RocketMQ installation%n", MixAll.ROCKETMQ_HOME_ENV); + System.exit(-2); } - return null; + // 自定义日志配置logback_namesrv.xml,可以了解博文(https://www.jianshu.com/p/3b9cb5e22052)来理解日志的配置加载 + LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); + JoranConfigurator configurator = new JoranConfigurator(); + configurator.setContext(lc); + lc.reset(); + configurator.doConfigure(namesrvConfig.getRocketmqHome() + "/conf/logback_namesrv.xml"); + + log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME); + + // 启动过程中打印配置日志 + MixAll.printObjectProperties(log, namesrvConfig); + MixAll.printObjectProperties(log, nettyServerConfig); + } ``` -从main0方法中可以看出,启动NameServer只有两个步骤,第一步是创建NamesrvController实例对象,第二步调用NamesrvStartup的start方法启动controller。 -### 2.1 构建NamesrvController对象 +以上的代码完成了解析配置和装配属性的工作,其主要流程总结如下: + +- 第一步:设置一个系统参数,key 为 rocketmq.remoting.version,当前版本值为 Version.V5_0_0,数值为413,将当前 RocketMQ 版本存到系统参数中; + +- 第二步:构建命令行选项并解析命令行参数,生成 CommandLine 对象,在构建命令行选型的过程中,一共构建了 $4$ 个选项,如下所示: + + | 选项简称 | 选项全称 | 是否有参数数值 | 是否是必需选项 | 选项描述 | + | :------: | :-------------: | :------------: | :------------: | :----------------------------------------------------------- | + | h | help | false | false | Print help | + | n | namesrvAddr | true | false | Name server address list, eg: '192.168.0.1:9876;192.168.0.2:9876' | + | c | configFile | true | false | Name server config properties file | + | p | printConfigItem | false | false | Print all config items | + + 那么在启动过程中,可以在命令行中携带这些命令行选项,比如我指定 NameServerAddr,就可以在启动命令后添加 `-n 192.168.0.1:9876;192.168.0.2:9876` 或者 `--namesrvAddr 192.168.0.1:9876;192.168.0.2:9876` 作为启动参数,对于没有参数数值的选项,直接跟上选项简称或者全称即可,例如: `-h` 或者 `-p` ,那么在解析的时候就可以正确解析到命令行参数。 + +- 第三步:创建配置对象; + +- 第四步:设置 NameServer 的启动监听端口,默认是 9876,读者可以直接修改这里的端口号,但是笔者建议额外在 `NamesrvStartup#buildCommandlineOptions` 方法中添加一个命令行选项,从而支持从命令行中通过`-l`或者`--listenPort`来指定端口,示例代码如下高亮部分: + + :::: code-group + ::: code-group-item 改造代码1 + + ```java{10-13} + public static Options buildCommandlineOptions(final Options options) { + Option opt = new Option("c", "configFile", true, "Name server config properties file"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("p", "printConfigItem", false, "Print all config items"); + opt.setRequired(false); + options.addOption(opt); + + // 这里额外加一个选项,支持配置自定义监听端口 + opt = new Option("l", "listenPort", true, "Name server custom listening port"); + opt.setRequired(false); + options.addOption(opt); + return options; + } + ``` + + ::: + ::: code-group-item 改造代码2 + + ```java{8-13} + // 创建配置对象 + namesrvConfig = new NamesrvConfig(); + nettyServerConfig = new NettyServerConfig(); + nettyClientConfig = new NettyClientConfig(); + + // 这里默认启动监听的端口是9876,其实可以在上面的命令行选项中加入一个自定义的选型,并设置一个端口选项 + // 这样就可以在启动的时候通过命令行传入监听端口 + String listenPort; + if (commandLine.hasOption('l') && (StringUtils.isNumeric(listenPort = commandLine.getOptionValue('l')))) { + nettyServerConfig.setListenPort(Integer.parseInt(listenPort)); + } else { + nettyServerConfig.setListenPort(9876); + } + controllerConfig = new ControllerConfig(); + ``` + + ::: + :::: + +- 第五步:获取命令行中configFile的值,这个值是配置文件的位置,如果包含这个参数,那么将解析该配置文件,将配置加载到各配置对象中,并且检查命令行参数中是否包含选项 `p` ,如果包含,那么将打印所有配置信息并退出进程; + +- 第六步:检查是否配置系统属性值 `rocketmq.home.dir` 或者环境变量 `ROCKETMQ_HOME`,如果没有配置那么将直接退出进程; + +- 第七步:自定义日志配置 logback_namesrv.xml,可以了解 [博文](https://www.jianshu.com/p/3b9cb5e22052) 来理解日志的配置加载; + +- 第八步:打印 namesrvConfig 和 nettyServerConfig 的配置信息。 + +至此,各项配置的解析装配工作就结束了,接下来开始创建并启动NameServer Controller。 + +### 2.2 启动NamesrvController + +从启动NamesrvController的start方法可以看出,主要流程也是分为三步: + +- 第一步:进行controller的初始化工作; +- 第二步:注册钩子函数,当JVM正常退出的时候,将执行该钩子函数,执行关闭controller释放资源; +- 第三步:启动controller。 我们一起来阅读NamesrvStartup的createNamesrvController方法,看看在创建NamesrvController对象的具体流程,代码如下: ```java @@ -223,22 +394,6 @@ public static NamesrvController createNamesrvController(String[] args) throws IO return controller; } ``` -以上的代码完成了NamesrvController对象的创建工作,其主要流程总结如下: - -- 第一步:设置一个系统参数,将当前RocketMQ版本存到系统参数中; -- 第二步:解析启动NameServer的命令行参数; -- 第三步:设置NameServer的启动监听端口,默认是9876,这里笔者额外添加了部分解析命令行参数的代码,支持从命令行中通过`-P`或者`--listenPort`来指定端口; -- 第四步:加载NameServer配置文件,构建NamesrvConfig和NettyServerConfig对象; -- 第五步:配置日志系统; -- 第六步:构建NamesrvController对象并将配置信息存储到controller中。 - -##### 2.2 启动NamesrvController -从启动NamesrvController的start方法可以看出,主要流程也是分为三步: - -- 第一步:进行controller的初始化工作; -- 第二步:注册钩子函数,当JVM正常退出的时候,将执行该钩子函数,执行关闭controller释放资源; -- 第三步:启动controller。 - start方法代码如下所示: ```java public static NamesrvController start(final NamesrvController controller) throws Exception { From b6b3bffc2c2c4e3d91559ccee87b71798ba8de2a Mon Sep 17 00:00:00 2001 From: itlemon Date: Thu, 23 Feb 2023 23:25:42 +0800 Subject: [PATCH 18/61] =?UTF-8?q?add:=20=E5=AE=8C=E5=96=84NameServer?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\212\250\345\216\237\347\220\206.md" | 131 ++++++------------ 1 file changed, 40 insertions(+), 91 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index f899501..b378de5 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -232,11 +232,11 @@ public static void parseCommandlineAndConfigFile(String[] args) throws Exception | c | configFile | true | false | Name server config properties file | | p | printConfigItem | false | false | Print all config items | - 那么在启动过程中,可以在命令行中携带这些命令行选项,比如我指定 NameServerAddr,就可以在启动命令后添加 `-n 192.168.0.1:9876;192.168.0.2:9876` 或者 `--namesrvAddr 192.168.0.1:9876;192.168.0.2:9876` 作为启动参数,对于没有参数数值的选项,直接跟上选项简称或者全称即可,例如: `-h` 或者 `-p` ,那么在解析的时候就可以正确解析到命令行参数。 + 那么在启动过程中,可以在命令行中携带这些命令行选项,比如我指定 NameServerAddr,就可以在启动命令后添加 `-n 192.168.0.1:9876;192.168.0.2:9876` 或者 `--namesrvAddr 192.168.0.1:9876;192.168.0.2:9876` 作为启动参数,对于没有参数数值的选项,直接跟上选项简称或者全称即可,例如: `-h` 或者 `--help` ,那么在解析的时候就可以正确解析到命令行参数。 - 第三步:创建配置对象; -- 第四步:设置 NameServer 的启动监听端口,默认是 9876,读者可以直接修改这里的端口号,但是笔者建议额外在 `NamesrvStartup#buildCommandlineOptions` 方法中添加一个命令行选项,从而支持从命令行中通过`-l`或者`--listenPort`来指定端口,示例代码如下高亮部分: +- 第四步:设置 NameServer 的启动监听端口,默认是 9876,读者可以直接修改这里的端口号,但是笔者建议额外在 `NamesrvStartup#buildCommandlineOptions` 方法中添加一个命令行选项,例如 `listenPort`,从而支持从命令行中通过`-l`或者`--listenPort`来指定端口,示例代码如下高亮部分: :::: code-group ::: code-group-item 改造代码1 @@ -282,7 +282,7 @@ public static void parseCommandlineAndConfigFile(String[] args) throws Exception ::: :::: -- 第五步:获取命令行中configFile的值,这个值是配置文件的位置,如果包含这个参数,那么将解析该配置文件,将配置加载到各配置对象中,并且检查命令行参数中是否包含选项 `p` ,如果包含,那么将打印所有配置信息并退出进程; +- 第五步:获取命令行中configFile的值,这个值是配置文件的绝对路径,如果命令行参数中没有配置,那么将采用默认值,默认值是 `{user.home}/namesrv/namesrv.properties`,解析该配置文件(注意配置文件中的要使用键值对的形式,例如: key=value,且 key 要保持和上述配置对象中的属性名称一致),将配置加载到各配置对象中。并且检查命令行参数中是否包含选项 `p` ,如果包含,那么将打印所有配置信息并退出进程; - 第六步:检查是否配置系统属性值 `rocketmq.home.dir` 或者环境变量 `ROCKETMQ_HOME`,如果没有配置那么将直接退出进程; @@ -292,109 +292,58 @@ public static void parseCommandlineAndConfigFile(String[] args) throws Exception 至此,各项配置的解析装配工作就结束了,接下来开始创建并启动NameServer Controller。 -### 2.2 启动NamesrvController +### 2.2 创建并启动NamesrvController -从启动NamesrvController的start方法可以看出,主要流程也是分为三步: +这里先贴出创建并启动 NamesrvController 的方法,代码如下: -- 第一步:进行controller的初始化工作; -- 第二步:注册钩子函数,当JVM正常退出的时候,将执行该钩子函数,执行关闭controller释放资源; -- 第三步:启动controller。 - -我们一起来阅读NamesrvStartup的createNamesrvController方法,看看在创建NamesrvController对象的具体流程,代码如下: ```java /** - * 创建一个Name Server Controller - * - * @param args 命令行参数 - * @return Name Server Controller对象 - * @throws IOException IO异常 - * @throws JoranException Joran异常 + * 创建并启动NameServerController */ -public static NamesrvController createNamesrvController(String[] args) throws IOException, JoranException { - // 设置一个系统参数,key为rocketmq.remoting.version,当前版本值为:Version.V4_7_1,数值为355 - System.setProperty(RemotingCommand.REMOTING_VERSION_KEY, Integer.toString(MQVersion.CURRENT_VERSION)); - - // 构建-h 和 -n 的命令行参数option,并且自定义了一个P命令行参数,用于定义namesrv端口 - Options options = ServerUtil.buildCommandlineOptions(new Options()); - // 解析完毕后的命令行参数 - commandLine = ServerUtil.parseCmdLine("mqnamesrv", args, buildCommandlineOptions(options), new PosixParser()); - if (null == commandLine) { - // 如果命令行参数为null,则退出虚拟机进程 - System.exit(-1); - return null; - } - - // 分别创建namesrv和nettyServer的config对象 - final NamesrvConfig namesrvConfig = new NamesrvConfig(); - final NettyServerConfig nettyServerConfig = new NettyServerConfig(); - // 设置netty监听9876端口,这就是为什么namesrv的默认端口是9876,这里可以改成其他端口 - // 其实还可以修改上述命令行参数代码,自定义一个参数,用来设置监听端口,在启动的时候指定该参数 - String listenPort; - if (commandLine.hasOption('P') && (StringUtils.isNumeric(listenPort = commandLine.getOptionValue('P')))) { - nettyServerConfig.setListenPort(Integer.parseInt(listenPort)); - } else { - nettyServerConfig.setListenPort(9876); - } - // 加载Name server config properties file - if (commandLine.hasOption('c')) { - String file = commandLine.getOptionValue('c'); - if (file != null) { - InputStream in = new BufferedInputStream(new FileInputStream(file)); - properties = new Properties(); - properties.load(in); - MixAll.properties2Object(properties, namesrvConfig); - MixAll.properties2Object(properties, nettyServerConfig); - - namesrvConfig.setConfigStorePath(file); - - System.out.printf("load config properties file OK, %s%n", file); - in.close(); - } - } - - // 如果在启动参数加上选项-p,那么将打印出namesrvConfig和nettyServerConfig的属性值信息 - // 其中namesrvConfig主要配置了namesrv的信息,nettyServerConfig主要配置了netty的属性值信息 - if (commandLine.hasOption('p')) { - InternalLogger console = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_CONSOLE_NAME); - MixAll.printObjectProperties(console, namesrvConfig); - MixAll.printObjectProperties(console, nettyServerConfig); - System.exit(0); - } +public static void createAndStartNamesrvController() throws Exception { + // 创建NameServerController对象 + NamesrvController controller = createNamesrvController(); + // 启动NameServerController对象 + start(controller); + String tip = "The Name Server boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer(); + log.info(tip); + System.out.printf("%s%n", tip); +} +``` - // 填充命令行commandLine中参数到namesrvConfig中 - MixAll.properties2Object(ServerUtil.commandLine2Properties(commandLine), namesrvConfig); +从代码中可以看出,主要流程分为两步: - // rocketmq_home默认来源于配置rocketmq.home.dir,如果没有配置,将从环境变量中获取ROCKETMQ_HOME参数 - if (null == namesrvConfig.getRocketmqHome()) { - System.out - .printf("Please set the %s variable in your environment to match the location of the RocketMQ " - + "installation%n", - MixAll.ROCKETMQ_HOME_ENV); - System.exit(-2); - } +- 第一步:创建NameServerController对象; +- 第二步:启动NameServerController对象。 - // 自定义日志配置logback_namesrv.xml,可以了解博文(https://www.jianshu.com/p/3b9cb5e22052)来理解日志的配置加载 - LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); - JoranConfigurator configurator = new JoranConfigurator(); - configurator.setContext(lc); - lc.reset(); - configurator.doConfigure(namesrvConfig.getRocketmqHome() + "/conf/logback_namesrv.xml"); - - log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME); +#### 2.2.1 创建NameServerController对象 - MixAll.printObjectProperties(log, namesrvConfig); - MixAll.printObjectProperties(log, nettyServerConfig); - - // 根据namesrvConfig, nettyServerConfig来创建一个NamesrvController对象 - final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig); +我们一起来阅读 NamesrvStartup 的 createNamesrvController 方法,看看在创建 NamesrvController 对象的具体流程,代码如下: +```java +/** + * 创建NameServerController + */ +public static NamesrvController createNamesrvController() { - // 将属性集合properties保存到controller的configuration属性中 + // 构建NamesrvController对象,构造方法里面创建了KVConfigManager、BrokerHousekeepingService、RouteInfoManager、Configuration对象 + final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig, nettyClientConfig); + // remember all configs to prevent discard + // 将配置注册到Configuration中,并被controller持有,防止配置丢失 controller.getConfiguration().registerConfig(properties); - return controller; } ``` +调用 NamesrvController 的构造方法创建对象,构造方法里面创建了 KVConfigManager、BrokerHousekeepingService、RouteInfoManager、Configuration 对象,这里简单介绍一下这四个类的作用。 + +- KVConfigManager:该类是 NameServer 的配置存储类。会将配置信息存储在文件 `{user.home}/namesrv/kvConfig.json`。内部用来存储配置信息的是一个`HashMap>`结构,也就是两级结构。第一级是命名空间,第二集是 KV 对,都是字符串形式。该类的`load`方法可以从文件中加载数据到内存里,`persist`方法可以将内存中的数据再写入到文件中。 +- BrokerHousekeepingService:该类是用来处理 broker 连接发生变化的服务。可以看到这个类实现了ChannelEventListener 接口,除了onChannelConnect 外,其余各个方法均委托给 namesrvController 的 routeInfoManager 的 onChannelDestroy 方法。这里需要 netty 的一些基础,简单来说每一个 broker 与 namesrv通过一个“通道” channel 进行“沟通”。namesrv 通过监测这些通道是否发生某些事件,去做出相应的变动。可以点进 routeInfoManager 的 onChannelDestroy 方法看看,对于宕机的 broker 是如何处理的。这一块的内容将在路由原理中详细讲解,这里了解即可。 +- RouteInfoManager:这就是 RocketMQ 的路由管理器,其内部维护了路由相关的所有元数据信信息,包括 topic 队列、Broker 地址信息、Broker 集群信息、Broker 活跃信息、Broker 上的 FilterServer 列表等。也因此,提供了扫描不活跃的 Broker、删除 topic、获取 topic 列表、注册 Broker、查询 Broker 的 Topic 配置等基础方法,由对应的网络请求或定时任务进行调用。 +- Configuration:用于存储配置文件、命令行中的各项配置,将配置注册到Configuration中,并被controller持有,防止配置丢失。 + +#### 2.2.2 启动NameServerController对象 + start方法代码如下所示: + ```java public static NamesrvController start(final NamesrvController controller) throws Exception { From 3f6a7233bdb23980b215a50c4cfa418eb05161b6 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 28 Feb 2023 19:30:59 +0800 Subject: [PATCH 19/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7vuepress?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=B02.0.0-beta.61?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 20 +- yarn.lock | 1149 +++++++++++++++++++++++++++++--------------------- 2 files changed, 672 insertions(+), 497 deletions(-) diff --git a/package.json b/package.json index 6b0c9ec..a05c17e 100644 --- a/package.json +++ b/package.json @@ -7,16 +7,16 @@ "author": "itlemon ", "license": "MIT", "dependencies": { - "@goy/vuepress-plugin-svg-icons": "^5.3.1", - "@vuepress/plugin-google-analytics": "^2.0.0-beta.60", - "@vuepress/plugin-pwa": "^2.0.0-beta.60", - "@vuepress/plugin-pwa-popup": "^2.0.0-beta.60", - "@vuepress/plugin-search": "^2.0.0-beta.60", - "vuepress": "^2.0.0-beta.60", - "vuepress-plugin-comment2": "^2.0.0-beta.173", - "vuepress-plugin-copy-code2": "^2.0.0-beta.173", - "vuepress-plugin-md-enhance": "^2.0.0-beta.173", - "vuepress-plugin-seo2": "^2.0.0-beta.173" + "@goy/vuepress-plugin-svg-icons": "5.3.2", + "@vuepress/plugin-google-analytics": "2.0.0-beta.61", + "@vuepress/plugin-pwa": "2.0.0-beta.61", + "@vuepress/plugin-pwa-popup": "2.0.0-beta.61", + "@vuepress/plugin-search": "2.0.0-beta.61", + "vuepress": "2.0.0-beta.61", + "vuepress-plugin-comment2": "2.0.0-beta.184", + "vuepress-plugin-copy-code2": "2.0.0-beta.184", + "vuepress-plugin-md-enhance": "2.0.0-beta.184", + "vuepress-plugin-seo2": "2.0.0-beta.184" }, "scripts": { "docs:dev": "vuepress dev docs --clean-cache", diff --git a/yarn.lock b/yarn.lock index f8b27a3..38190d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": +"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== @@ -31,7 +31,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== -"@babel/core@^7.11.1", "@babel/core@^7.20.12": +"@babel/core@^7.11.1": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== @@ -52,6 +52,27 @@ json5 "^2.2.2" semver "^6.3.0" +"@babel/core@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" + integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.0" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.21.0" + "@babel/helpers" "^7.21.0" + "@babel/parser" "^7.21.0" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + "@babel/generator@^7.20.7": version "7.20.14" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" @@ -61,6 +82,16 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" +"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": + version "7.21.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" + integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== + dependencies: + "@babel/types" "^7.21.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -141,6 +172,14 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" +"@babel/helper-function-name@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" + integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/types" "^7.21.0" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -176,6 +215,20 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" +"@babel/helper-module-transforms@^7.21.0": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" + integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.2" + "@babel/types" "^7.21.2" + "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" @@ -265,6 +318,15 @@ "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" +"@babel/helpers@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" + integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.21.0" + "@babel/types" "^7.21.0" + "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -279,6 +341,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== +"@babel/parser@^7.21.0", "@babel/parser@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" + integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -909,6 +976,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" + integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.1" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.2" + "@babel/types" "^7.21.2" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -918,6 +1001,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.21.0", "@babel/types@^7.21.2": + version "7.21.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" + integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@braintree/sanitize-url@^6.0.0": version "6.0.2" resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" @@ -1033,12 +1125,14 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== -"@goy/vuepress-plugin-svg-icons@^5.3.1": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@goy/vuepress-plugin-svg-icons/-/vuepress-plugin-svg-icons-5.3.1.tgz#696be5eec8cf493506a6b6806927508da0cc4bf7" - integrity sha512-h0rjgA2W0UBWx9a6KZ/ZSleaFjD2AKK3a0abcBFD3HxxHZvzsiP2vMMo8V7j6gT/m0DZ7EoAUmWadbZiQAlzJA== +"@goy/vuepress-plugin-svg-icons@5.3.2": + version "5.3.2" + resolved "https://registry.yarnpkg.com/@goy/vuepress-plugin-svg-icons/-/vuepress-plugin-svg-icons-5.3.2.tgz#f63ad4e0e0a8348b24a4b8c551b7812950ee86e4" + integrity sha512-23hubRO33YeP7nBYzaxcWdjmz/daKMFlZQ625XKB/a5E2pdAy3wtQg7rDKFbWmdx61phRauiOy0W/68NhiNIzA== dependencies: + "@vuepress/client" "2.0.0-beta.60" svg-mixer "^2.3.14" + vue "^3.2.47" "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" @@ -1080,7 +1174,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -1105,250 +1199,242 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.0.0" -"@mdit-vue/plugin-component@^0.11.2": - version "0.11.2" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-component/-/plugin-component-0.11.2.tgz#3b7b6aef7368bb1a4b006c8430f0e9b7d4044b5b" - integrity sha512-ucFiEULCkLcCG1Tf1MfG5u5PS4BIXWIeKGHRGsXxz1ix2GbZWKFVgWEdNEckBu8s75Fv1WJLIOiAYZyri2f1nw== +"@mdit-vue/plugin-component@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-component/-/plugin-component-0.12.0.tgz#7a52837935e2cbc9b6cf22fd5f9349f6199fc18c" + integrity sha512-LrwV3f0Y6H7b7m/w1Y3bkGuR3HOiBK4QiHHW3HuRMza6MZodDQbj8Baik5/V5GiSg1/ltijS1CymVcycd1EfTw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/plugin-frontmatter@^0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-0.11.1.tgz#4e4e013bf151fa54525f4e9c7c0a829912364ccb" - integrity sha512-AdZJInjD1pTJXlfhuoBS5ycuIQ3ewBfY0R/XHM3TRDEaDHQJHxouUCpCyijZmpdljTU45lFetIowaKtAi7GBog== +"@mdit-vue/plugin-frontmatter@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-0.12.0.tgz#fb344646241bed1bae5f8bd320c7b2f493bd8b67" + integrity sha512-26Y3JktjGgNoCVH7NLqi5RcdAauAqxepTt2qXueRcRHtGpiRQV2/M1FveIhCOTCtHSuG5bBOHUxGaV6vRK3Vbw== dependencies: - "@mdit-vue/types" "0.11.0" + "@mdit-vue/types" "0.12.0" "@types/markdown-it" "^12.2.3" gray-matter "^4.0.3" markdown-it "^13.0.1" -"@mdit-vue/plugin-headers@^0.11.2": - version "0.11.2" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-headers/-/plugin-headers-0.11.2.tgz#dd7ca7d00a6b2e28d516ba83718c6e336995d125" - integrity sha512-hH2zm4m+2tWe7dya/nxbbpB95pa9RjwYxl++kyZuRrqyhNTtsi2HWojX02peQ1nQMKKIWPDHtpeAHGP7dOLKFw== +"@mdit-vue/plugin-headers@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-headers/-/plugin-headers-0.12.0.tgz#c16921e071b2766fd04a703d8d42ead00561f44c" + integrity sha512-7qR63J2uc/rXbjHT77WoYBm9imwzx1tVESmRK+Uth6kqFvSWAXAFPcm4PBatGEE8TgzhklPs5BTcQtQhmmsyaw== dependencies: - "@mdit-vue/shared" "0.11.2" - "@mdit-vue/types" "0.11.0" + "@mdit-vue/shared" "0.12.0" + "@mdit-vue/types" "0.12.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/plugin-sfc@^0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-sfc/-/plugin-sfc-0.11.1.tgz#1e7102ea3f67f0761e482ac50c413f7e10e1ba41" - integrity sha512-3AjQXqExzT9FWGNOeTBqK1pbt1UA5anrZvjo7OO2PJ3lrfZd0rbjionFkmW/VW1912laHUraIP6n74mUNqPuWw== +"@mdit-vue/plugin-sfc@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-sfc/-/plugin-sfc-0.12.0.tgz#2932c333657ddaf6d76664118b83c93d5dd4f727" + integrity sha512-mH+rHsERzDxGucAQJILspRiD723AIWMmtMhp7lDKdkCIbIhYfupFv/CkSeX+LAx5UY5greWvUTPGYVKn4gw/5Q== dependencies: - "@mdit-vue/types" "0.11.0" + "@mdit-vue/types" "0.12.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/plugin-title@^0.11.2": - version "0.11.2" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-title/-/plugin-title-0.11.2.tgz#8fc030ef1ef835872ce8a184a6941242c8bdc10e" - integrity sha512-R91WCN16CePWRT2bSXaDJGXvj0MuaCz4m2GbYqUbQxd+dqf18uuGPdbhr1rwhIqCvy7GD/g7hSgOFi3DNDAIzA== +"@mdit-vue/plugin-title@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-title/-/plugin-title-0.12.0.tgz#e69f33036972a7a67c3321647bdbcb1b9a5b6f4e" + integrity sha512-XrQcior1EmPgsDG88KsoF4LUSQw/RS1Nyfn5xNWGiurO70a2hml4kCe0XzT4sLKUAPG0HNbIY6b92ezNezqWTg== dependencies: - "@mdit-vue/shared" "0.11.2" - "@mdit-vue/types" "0.11.0" + "@mdit-vue/shared" "0.12.0" + "@mdit-vue/types" "0.12.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/plugin-toc@^0.11.2": - version "0.11.2" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-toc/-/plugin-toc-0.11.2.tgz#ed508ec23fd7ea2b6a7263ac4c1b98a4bbdc0853" - integrity sha512-0OcGG4TnYIZJ6SLZtk24Nj0oP2vcLn0FyMTao/nB/2Z17/fP3whoo6dVV+0G4Oi8HZ+MMDi661lvS2b4b/glYA== +"@mdit-vue/plugin-toc@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-toc/-/plugin-toc-0.12.0.tgz#bf8c4c4d13dc9ef8dc3c4b8213e3846312cca7f3" + integrity sha512-tT985CqvLp17DFWHrSvmmJbh7qcy0Rl0dBbYN//Fn952a04dbr1mb2LqW0B1oStSAQj2q24HpK4ZPgYOt7Z1Jg== dependencies: - "@mdit-vue/shared" "0.11.2" - "@mdit-vue/types" "0.11.0" + "@mdit-vue/shared" "0.12.0" + "@mdit-vue/types" "0.12.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/shared@0.11.2", "@mdit-vue/shared@^0.11.2": - version "0.11.2" - resolved "https://registry.yarnpkg.com/@mdit-vue/shared/-/shared-0.11.2.tgz#ef575b9b6b4697858b9e391dcae7307b503bd9ad" - integrity sha512-Z/GS/v9DURZE13Hv41meKzdnprMwenVJoM3t82OE5HIGvtE6QovsZ+mMF/rMvLgaLLMDjT3EwvrrBmemWkHYTQ== +"@mdit-vue/shared@0.12.0", "@mdit-vue/shared@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/shared/-/shared-0.12.0.tgz#e4e7d5ffb362dedb92b161fcbf05e81a3d2ac143" + integrity sha512-E+sGSubhvnp+Gmb2hJXFDxdLwwQD1H52EVbA4yrxxI5q/cwtnPIN2eJU3zlZB9KcvzXYDFFwt/x2mfhK8RZKBg== dependencies: - "@mdit-vue/types" "0.11.0" + "@mdit-vue/types" "0.12.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/types@0.11.0", "@mdit-vue/types@^0.11.0": +"@mdit-vue/types@0.12.0", "@mdit-vue/types@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@mdit-vue/types/-/types-0.12.0.tgz#096ff57d3590d076f7d7561dbc9956fb0bb89fe1" + integrity sha512-mrC4y8n88BYvgcgzq9bvTlDgFyi2zuvzmPilRvRc3Uz1iIvq8mDhxJ0rHKFUNzPEScpDvJdIujqiDrulMqiudA== + +"@mdit-vue/types@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@mdit-vue/types/-/types-0.11.0.tgz#ab9c6f4e69d9c9eaabf1a73e59dc699875b224ef" integrity sha512-ygCGP7vFpqS02hpZwEe1uz8cfImWX06+zRs08J+tCZRKb6k+easIaIHFtY9ZSxt7j9L/gAPLDo/5RmOT6z0DPQ== -"@mdit/plugin-align@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.2.3.tgz#9ffb7f6e030071f711b34475e75ddeaf5f7144a7" - integrity sha512-TR4bR8qIg7tYSa62XspVzJKfUCCBJBiwTIAfKWtmeQALtDBClCZa26bL2EJnmdY5EdQVzU9sTHXWcR/p3AnVaw== +"@mdit/plugin-align@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.3.0.tgz#5d46c1b05a5648fc2582ea5d8483af7664d89ae0" + integrity sha512-t5SY5n93Et8MJRbEmlcREpPNLy/A7j0U13mXiuADtgvkMIWGXiO3PLyPPLfov9vWhh1tcDcNQ1+XY3hw71LwzQ== dependencies: - "@mdit/plugin-container" "0.2.3" + "@mdit/plugin-container" "0.3.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-attrs@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.2.3.tgz#6c23fb2cdc01dcebc242770315482198b969b110" - integrity sha512-iTqwXOAscDXL20Lt4do3wI6+MQz/iqvSqETpR57M20yl2L/rM02RdVex5BWbxdhqFtDylh+/qtI4X2H6JFv/OQ== +"@mdit/plugin-attrs@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.3.0.tgz#3104b0cfd528a79daa7f6872c39807eede6b58c0" + integrity sha512-u8TrEmoZsCmtPA8Q94CXEBAU8VO8xEaX7JJ20SXcv5C8u4h5S/LwnqBXckBH9B8Qz0j8JS7XeKxfm6X+lmwMxg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-container@0.2.3", "@mdit/plugin-container@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.2.3.tgz#c81b6bc8f182e50a7dfee096ba45cda8b817dbf1" - integrity sha512-psgaYyBX6Pq56R5S+NOIWhk8nz73LBaoputKq2NjQadIUgYlN7CmwOJeUjyg4ZK0wwBg1HzFFD5JaJ+C2jVssA== +"@mdit/plugin-container@0.3.0", "@mdit/plugin-container@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.3.0.tgz#d8f4e4c3839de2a77e2b28ec68d2d6b45efc0dc7" + integrity sha512-mNdw5H8VsifwtRCEvuyIa6kTDP1a3CHe7PhICzmK51/6yObN6PRWWwEDuG3vJOu1pIRltcsgMKMwEC8BWT2S0A== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-figure@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.2.3.tgz#46870b8ec30ca9fdf8e73b4d07c968d66f25bbea" - integrity sha512-d1KMMkQq9+0SxVMssnm28KDm1JVxozA8lh9fecKRlMnvN7B7NCnLbQZEe/l8Tj2yesOEgzSGL98+gfu/wdJimA== +"@mdit/plugin-figure@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.3.0.tgz#5f8aa1c24e7d632d7f466c1f827f3d051c2d869b" + integrity sha512-657sxb+qjZ5ff5YXEOuPqobSFcXuLNS7pWFA9oZxK8Fbo8FqS/sAKuUV2axo2SBR9pydLNP/bPvu2YbvYdQkNA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-footnote@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.2.3.tgz#a85c15a96a50ca24f9b5d1d63176f716e4f2eb87" - integrity sha512-LiSxbIu5PJTEj+qUcULQViLvyLyDjmnyM/iRdN4Y2biZ2Is/iVsHfhrrOFoqfTIRUqMwZwvbNJdyFPNheTCQfg== +"@mdit/plugin-footnote@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.3.0.tgz#7a2d0da81a674a0391c154c9f9e14158db93aeda" + integrity sha512-2qfSklSJplsP4sct02cdMcBSVyLAHIhR1OMxhEnS0WsUMtX68r2G7buBtfVbYRT68lCygkZFAD4nymdslEdDRA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-lazyload@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.2.3.tgz#ec58cbffe92f86d0ebf3f3c87470c48cba3e9f54" - integrity sha512-LQJ+mEDiRVyyUYIv4V5NXb3H8Mxp58OLEGJAyM5GV30ZnlsNQV/eyqLvrkaI/zzr0AULaI4RnwtZrUthsxmQZA== +"@mdit/plugin-img-lazyload@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.3.0.tgz#992eb5de9d1bfd4ce6726eb3614226cf16a535c8" + integrity sha512-KytI59hWWfiynlt8meFBEGcJO0LrdUbj2Uicq7E1NycTIipgxAKIPU0pxc/eY+gdJhp+W0lpl+orRG0eoVLX+A== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-mark@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.2.3.tgz#2ae0a57bcb699bff1a3824b65ad07107beb687d6" - integrity sha512-bQyCeF1DH06MTb+bpjja5As/mkDMShoEWaZ2inc9knphkLA3EHYuHo+DU72RlhXvYv9AaUmlFl870Wu5OeNvZw== +"@mdit/plugin-img-mark@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.3.0.tgz#3133f3837beecc285e110828ca9ca1864b98a855" + integrity sha512-dto+KOvhai6piINS3052+GUk6AKvxe3bSU6I1dFbYKRswIDZcf8XIMQZVYiBN+2tLKMQzzwcu+irVuWHkS6LYQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-size@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.2.3.tgz#9c369b85b1c2a9dacba160181f39d917ded5a09e" - integrity sha512-oIBWHMIqlMRp4ns/AQC9DwluV2x/aG+vnu1QhIBaUeuLcwZKp4IdmdDDMTqzASpvMpwqe+wRt4aVnyOmOzRF+w== +"@mdit/plugin-img-size@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.3.0.tgz#d2dbdcc0716cf86c0ad0cf4f08bfee8d0ec66a88" + integrity sha512-cjj9hGJTiwNwAmuQPSRaQZNaguYBExHZREm1NboWI8zMCTvMXc1zZnTHb96WmD1n2K2c9L2pLkAuqPJu5Z8ZpA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-include@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.2.3.tgz#28e776401705301a371f517059d2a7ed08245b85" - integrity sha512-ZCNKi5w+FYkwXXoaFyRqfohBz1uxkwCOWjuF8iHtI8PCXJrquoQz4ynXpLCtMXkg2ohgrcHcQriTOwoGM7xusA== +"@mdit/plugin-include@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.3.0.tgz#3073048a5d34adae75dd8b9dd5f52968080d2af8" + integrity sha512-rDH+4fqT3bv7+Nf5OT6LOvwn545ox5eE1eGHkZWty/XINbKmNP6VSdbgdieqAgJA4nlLCs4yscFk2vuzT8dqrQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" upath "^2.0.1" -"@mdit/plugin-katex@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.2.3.tgz#08e08f25fb99a00cada8680781ec6616fe39e2b1" - integrity sha512-BBeLtivXoGsxHLXqM6h0G661E3amnFBqGX3OuUO3pgVL/IU+yVkn1tFu6D0eFZkyN4juHHrqa1RP2MLQSlziug== +"@mdit/plugin-katex@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.3.0.tgz#c0d75f636edb2456adc0c85872a1c64bf1faaf83" + integrity sha512-Uol7ZF2Yc4fBgQOwsy6cQQFkoIWXqV8o7Wf+I9ZJHYosbKZXFrfLkfDkWISSb+TzSTBCrRkrQtt6zi+4+nj9sw== dependencies: - "@mdit/plugin-tex" "0.2.3" + "@mdit/plugin-tex" "0.3.0" "@types/katex" "^0.16.0" "@types/markdown-it" "^12.2.3" katex "^0.16.4" markdown-it "^13.0.1" -"@mdit/plugin-mark@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.2.3.tgz#8e49bb7434d72062ca5906603a69d729a98f62cf" - integrity sha512-ppGqi3hCV0yeswAK8K4mmTXrzLU/skBjzDQx8q02Ixt7ppE+T8Sh6A9Pir7pPDqhDTE5MHKWxl//KlUfyPQPMw== +"@mdit/plugin-mark@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.3.0.tgz#72caffbedc01f02e193fd593134fe6498b3a9c5a" + integrity sha512-LRCjS/q8ryg/yWnKCGIKWVxCRu36WBfUGDlCuw+cb59ptkbF24Q6Khs8pnZZGq6q+XSFHmYUCCHqp2q79XAvyA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-mathjax@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.2.3.tgz#994d21d46161ac75cc9c72eb831750bf74f3c236" - integrity sha512-8P5SqRQuyEQ2JBzIGG+Cl93eZU0rx+i1asELRDnz7t1NCTyIkyLCA57utZx5kC3UcuBo7Nog4N2L04zKup2AxQ== +"@mdit/plugin-mathjax@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.3.0.tgz#0d890e708b58fa23b7216c228656b792ebbbaf5e" + integrity sha512-9lvYnVd0kllsysikRr4f+OMS9zjM57QgEIB7e+dSDtYGMQISNxiLQvYap/pMMtY+zZQ51I7heGCjZ2OXmWEtbg== dependencies: - "@mdit/plugin-tex" "0.2.3" + "@mdit/plugin-tex" "0.3.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" mathjax-full "^3.2.2" upath "^2.0.1" -"@mdit/plugin-stylize@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.2.3.tgz#b7dca4c0e99e9d1bd4c94975f1ec6b74d08fdca9" - integrity sha512-EeRLwmEDwxB7NaF91OAqIJ5uUKHoPyZie4zFLbA3gKwqVXa6OC1XG1k3S8w9GuRnep/K7+e/5gPGFM68tI7v8g== +"@mdit/plugin-stylize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.3.0.tgz#dd3c0778a32be59384a97c10092b166f3aa28d28" + integrity sha512-WT+ts6/Xd+K3ASlHDWa4ZHqDx4KgRsuHgLhmyvyAGY9ApNP1Q0ROY5Ik4bn92WVRU3WEfK8ICOEOnoEPEP2NJA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sub@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.2.3.tgz#081299975735ee873330904e3448eb4a1ad3f030" - integrity sha512-eWCOxASIU/Y1efzhJkb1y0XWa0yGVdtYm4SKfUd73rF4dNEYIYJiNKkQfefrGtMuQdeM7iBqBZfYtcq/nipkzg== +"@mdit/plugin-sub@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.3.0.tgz#929a5cb4ec8ed1923dbb8cb0f3f751284b2d5a3f" + integrity sha512-T4fYZqIJ2ZJOQ4WoURU813XL7Y6prs5jYaxLWteOqF9JkTcqNQ22hJcdGe5domIG/dH79IZqVHkJ7okoFOt/Xg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sup@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.2.3.tgz#93c7807bb54970f36d12f1eea1ff43400622d1f6" - integrity sha512-gqOOQo6lE2e8SFHpXhKCKiFGoVIO1JUDA97Ol5iIFZtXJ4lbObWKxtYa63KH+kOVwDUUGSojQ6s8+oGMxmtIDA== +"@mdit/plugin-sup@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.3.0.tgz#9e884d98f2db29d09ebc3b11d376b5c99fa08997" + integrity sha512-K6L1/WK94XwFG+Oo54GVM9m+Y0cjinoiVtWjT0OIswCQWDuuXG7H4JH2uxBxQJb8MWNsnnQRUFnaG1RPiRP94Q== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tab@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.2.3.tgz#c57e6aa522afe0765e9fbff35eea9eee555ee006" - integrity sha512-J0LkcQ2Kb2fm+8Gnd1Ke8rKfJXMQPqwx3ZDa2AtLCcBEf5hWAKbLoc/cWjDVXiHjsdOklIs5AtCyNUkR5YbyOA== +"@mdit/plugin-tab@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.3.0.tgz#618e30542939564c116c31a6bc8ee664d32f0e5f" + integrity sha512-mHnj+AZRem7Jilc1Auu7wL5Uo/S32Slp1WU3Of3RJn0LiQnEpZHKr/kpQutEWV+kZo/rIcTIxdCYWXBZqj38ng== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tasklist@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.2.3.tgz#31a2e7c1e613250d1ffb3d12b21fdf19f06084d5" - integrity sha512-szYn7pyaozAPhilrNeC5PNLR+Rm9qlPvRQsxMK88Sa4seSdDhQnPkDb+407QYtYdYpyrn0ZKCvnmuXc9CLlhmQ== +"@mdit/plugin-tasklist@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.3.0.tgz#f568dc65ff64e9b54959b1270b5424136628ddf6" + integrity sha512-/nekYc2zSKxGFbTR2o6dXyqoUfQBrf9PX0O81ZOGIzaMI+t6y9q3tJwnmbwLD/QE1MeW6kaR4byCcD3rc1SyAQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tex@0.2.3", "@mdit/plugin-tex@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.2.3.tgz#0900c20f805a3cd02ec8bc5f51193b3dcc80c199" - integrity sha512-sD7dILLqwdPA3B89W5Ezj2vMjrYZKBFICLvPmp49crdAW51tcLUtjKK5nF86fUY7VULlsDG9h5+lQV9wc/HNYA== +"@mdit/plugin-tex@0.3.0", "@mdit/plugin-tex@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.3.0.tgz#49916ad786a91642f207d68c76ccd425f250988f" + integrity sha512-GXAOOBlk2me/noWOCbZeoqMsCcsIeNob+LhLYfk8q4w3rHJM9gdUI5JL05ClbvO7eNSSjQVZZ1tHfyjK08RvSg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-uml@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.2.3.tgz#58fb5f24c7262bd026d5ae89bc30123a592b9ab8" - integrity sha512-bLo1R4f6xaXtToLLP4+7+x/i9p815NnuS+l63RkhE2juEagQYKaB2Ytw/91K0/sprWrrvOL3ESRlgFK14MAmHQ== +"@mdit/plugin-uml@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.3.0.tgz#eec2dc54cd48c5143abd7f855d7a4b2739204e37" + integrity sha512-QS00olhRy3Ct5qwjFYBk6YtCZK5oLM8K4SyPND7LCrqiV3PiAtH8jXN9BnDmKQN+EhXXzFe3NlxRjNLvGu/JUw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mermaid-js/mermaid-mindmap@^9.3.0": - version "9.3.0" - resolved "https://registry.yarnpkg.com/@mermaid-js/mermaid-mindmap/-/mermaid-mindmap-9.3.0.tgz#cfe10329198a0f37e27eef1dcc4a1cf21f187e2b" - integrity sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw== - dependencies: - "@braintree/sanitize-url" "^6.0.0" - cytoscape "^3.23.0" - cytoscape-cose-bilkent "^4.1.0" - cytoscape-fcose "^2.1.0" - d3 "^7.0.0" - khroma "^2.0.0" - non-layered-tidy-tree-layout "^2.0.2" - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1429,11 +1515,12 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/fs-extra@^9.0.13": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== +"@types/fs-extra@^11.0.1": + version "11.0.1" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" + integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== dependencies: + "@types/jsonfile" "*" "@types/node" "*" "@types/hash-sum@^1.0.0": @@ -1441,6 +1528,13 @@ resolved "https://registry.yarnpkg.com/@types/hash-sum/-/hash-sum-1.0.0.tgz#838f4e8627887d42b162d05f3d96ca636c2bc504" integrity sha512-FdLBT93h3kcZ586Aee66HPCVJ6qvxVjBlDWNmxSGSbCZe9hTsjRKdSsl4y1T+3zfujxo9auykQMnFsfyHWD7wg== +"@types/jsonfile@*": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" + integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== + dependencies: + "@types/node" "*" + "@types/katex@^0.16.0": version "0.16.0" resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.0.tgz#0e640df3647fe237212be863e1f5111eb9754f93" @@ -1550,7 +1644,7 @@ "@vue/compiler-dom" "3.2.47" "@vue/shared" "3.2.47" -"@vue/devtools-api@^6.4.5": +"@vue/devtools-api@^6.4.5", "@vue/devtools-api@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== @@ -1603,42 +1697,42 @@ "@vue/compiler-ssr" "3.2.47" "@vue/shared" "3.2.47" -"@vue/shared@3.2.47", "@vue/shared@^3.2.45": +"@vue/shared@3.2.47", "@vue/shared@^3.2.45", "@vue/shared@^3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== -"@vuepress/bundler-vite@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.60.tgz#33330a6f3f53069d70ebb08fe7951bc87489d851" - integrity sha512-nf+UAKNlAEZXZqu2Ztvr8Hg/5CtevWxvQGfYKV4lhw8UmoDjKKHoHPpPhF1QTUbnZ8W+jPLzIVz+hjunzsxl/A== +"@vuepress/bundler-vite@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.61.tgz#cd14f061733dfd63b917738fa4b72de6dfc166d1" + integrity sha512-J9/DGfsqr9rGJT+0osL9uL+jrrGHeAsWuZoCCbQIDbe0rEO2whvou51PJpwko3R0vvCTWsolh6rXYeb0N0+yFg== dependencies: "@vitejs/plugin-vue" "^4.0.0" - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" autoprefixer "^10.4.13" connect-history-api-fallback "^2.0.0" - postcss "^8.4.20" + postcss "^8.4.21" postcss-load-config "^4.0.1" - rollup "^3.9.0" - vite "~4.0.3" - vue "^3.2.45" + rollup "^3.17.3" + vite "~4.1.4" + vue "^3.2.47" vue-router "^4.1.6" -"@vuepress/cli@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/cli/-/cli-2.0.0-beta.60.tgz#17560f2073d92ac0238a7030464b473a74cfe577" - integrity sha512-ibC6ezsn1m+r3PB382ZZfmwBFlkR/9LVk5u2cUBmhBj4t+W2XPgWkKTTmG81ny7lnUJweloQc9fa1ww77se2Ug== +"@vuepress/cli@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/cli/-/cli-2.0.0-beta.61.tgz#279784c755dde3e4868a667cb6ce7311f67bfb57" + integrity sha512-0CWc82c75987mVZwBOGBaCDke74NwlS6L3n1ybWrrqaFeueZSonwdm+qvaNvM/AJC10chqOJtpO/O3P+/YkBHQ== dependencies: - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" cac "^6.7.14" chokidar "^3.5.3" envinfo "^7.8.1" - esbuild "^0.16.12" + esbuild "~0.16.17" "@vuepress/client@2.0.0-beta.60": version "2.0.0-beta.60" @@ -1650,193 +1744,203 @@ vue "^3.2.45" vue-router "^4.1.6" -"@vuepress/core@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-2.0.0-beta.60.tgz#9a35102fef1aff15ce6bf0b725c54d055032e854" - integrity sha512-HkUkqBnBI7GMVZGxdzV4C/iyFwPo215sVLYvZVEWpQIaLk/47WkK0sHtz/1i00ujwJC3uGOH1+f0IHkxzqjUmg== +"@vuepress/client@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/client/-/client-2.0.0-beta.61.tgz#d36321495924f19d468b71af48ae3a06ab626b93" + integrity sha512-C5QbdQkPsurEsKUkLclVucUAKMzBph9kHMUvfKHJqBaAsiXKYVLa61AICTJeyDkhTYF0faOjmpqmaElfMt1S9w== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/markdown" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - vue "^3.2.45" + "@vue/devtools-api" "^6.5.0" + "@vuepress/shared" "2.0.0-beta.61" + vue "^3.2.47" + vue-router "^4.1.6" -"@vuepress/markdown@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-2.0.0-beta.60.tgz#12222cde5ab41395f8c3bf7b2ef512935814f45b" - integrity sha512-97AT4aZr1k1VrJZoUvzbrX6nU/TwxlFpLNi8KNtWK3TMZT6+hAU0aCg6TwuwirShvey8mr9GaMNSssAdpSK4mg== - dependencies: - "@mdit-vue/plugin-component" "^0.11.2" - "@mdit-vue/plugin-frontmatter" "^0.11.1" - "@mdit-vue/plugin-headers" "^0.11.2" - "@mdit-vue/plugin-sfc" "^0.11.1" - "@mdit-vue/plugin-title" "^0.11.2" - "@mdit-vue/plugin-toc" "^0.11.2" - "@mdit-vue/shared" "^0.11.2" - "@mdit-vue/types" "^0.11.0" +"@vuepress/core@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-2.0.0-beta.61.tgz#602ceb2da0b9c2fd0bc5828115c896f17521ff08" + integrity sha512-jPr60d/uadgBmEQhXCRLNOm2M4Ym65lvZhGf/wyZCo14kpacp2YoO7RR8bzp/NEpWe7ndr/U8O/VDjFYTsz80g== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/markdown" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" + +"@vuepress/markdown@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-2.0.0-beta.61.tgz#8ea7f785b25f149ec006236cc1bbe2b59161a862" + integrity sha512-vzj933XxsfE9B+1kdMXncYtYU7TGTLjWP+qeikVsy5imq2BXa/n3OFVGyGkkdOYmu05hkm82+07dOvtGA+iMBQ== + dependencies: + "@mdit-vue/plugin-component" "^0.12.0" + "@mdit-vue/plugin-frontmatter" "^0.12.0" + "@mdit-vue/plugin-headers" "^0.12.0" + "@mdit-vue/plugin-sfc" "^0.12.0" + "@mdit-vue/plugin-title" "^0.12.0" + "@mdit-vue/plugin-toc" "^0.12.0" + "@mdit-vue/shared" "^0.12.0" + "@mdit-vue/types" "^0.12.0" "@types/markdown-it" "^12.2.3" "@types/markdown-it-emoji" "^2.0.2" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" markdown-it "^13.0.1" - markdown-it-anchor "^8.6.6" + markdown-it-anchor "^8.6.7" markdown-it-emoji "^2.0.2" mdurl "^1.0.1" -"@vuepress/plugin-active-header-links@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.60.tgz#c6a225d94483012c296493f628bc2493c9190899" - integrity sha512-L+KijW7FvoDWMTd6wiIZhMA/uZYgMhiukL6IaVWtQ0COyWGIjaZUlX+mHd1munSzz4aWBMbck7no82bPswCh0g== +"@vuepress/plugin-active-header-links@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.61.tgz#03282f4d9cca94acaa0bf09659fcb38dbc34474a" + integrity sha512-+bbzb4YqnuTOANvSmJq8hbp60Tl3jLMiaZdkHKxKK9lDODGfTB8uAlH+KvuvxxuLm+Za186r+2PtBwJby773fA== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" ts-debounce "^4.0.0" - vue "^3.2.45" + vue "^3.2.47" vue-router "^4.1.6" -"@vuepress/plugin-back-to-top@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.60.tgz#03b769855b40785f24aa33290cfc17409cdab5b2" - integrity sha512-vpVTA6EwWjjYyl6Op5J16RV6rEvwUYkLnjYhJ2qWroDb8U2x32HGWFJZQFIyatGO+oU6UBVYow90j2+Ery2g6g== +"@vuepress/plugin-back-to-top@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.61.tgz#b5feec33f99971cd3a0bd5bf100ead806c119d2b" + integrity sha512-2KX83rdc00FSs38o8/P2Hp0ifKVtRbO+4kXW5ilzY27v0UMY8H//KxmoE/+PZDS9iyeXF1O/YUm3VtoMN5Y/9g== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" ts-debounce "^4.0.0" - vue "^3.2.45" + vue "^3.2.47" -"@vuepress/plugin-container@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.60.tgz#1668487acbc7c89e6f23e0a09fe1926c68cf39d4" - integrity sha512-yQBAm7sFRGMvCz8Ju2qFG0iLQs/XvWd11UAsywSdvps3A0nZuANSb68QTYJPN3JJfZ5d0LCxlhJ4rbBWT49+wQ== +"@vuepress/plugin-container@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.61.tgz#2e9a12d8918b3d7a7f29c6fb44d549287b89cd93" + integrity sha512-XVIhMpTSv0F8tsmCKFHzFtsJzD2SeiKX60jHaEGCym+shNvr9euECWY7ygEB5Ob6oQUIDZNS1dDb1RcYsksZ8A== dependencies: "@types/markdown-it" "^12.2.3" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/markdown" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/markdown" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" markdown-it "^13.0.1" markdown-it-container "^3.0.0" -"@vuepress/plugin-external-link-icon@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-beta.60.tgz#c248bb736617af8d4cea34a6866923cf3ba637b0" - integrity sha512-We4YmS4G7sWoOec/FKYhTM86qRCMBbDThcxOiPm6sWHrhTdxk3bFgJq/DfqJU/ply1ta72AWep0rEY6fj6JJ2A== +"@vuepress/plugin-external-link-icon@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-beta.61.tgz#63d3f89d8d1869a06904fb123ca41d31a8272298" + integrity sha512-Jyp/QdqIvybfocD2K8otKIeHrKMeOamt74tlstsZxrtveKhWE3Js1/n2MP/bJlGkcHrAb6lQQr/JFhpT5jtHVg== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/markdown" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - vue "^3.2.45" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/markdown" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" -"@vuepress/plugin-git@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.60.tgz#22e381fc531cf12a382e12acd241073820278c2c" - integrity sha512-Yu+D8gItxD8BFueV5fQd7AxIgjcxyDY1AFCTmPsP9VDMJ0AuJuaPTLWOf5o0uKzWd5z1mDw0ZwWFh8j3FyHv+A== +"@vuepress/plugin-git@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.61.tgz#4c7827a8f964b55fe594cd5f4f79509e0264bc5d" + integrity sha512-ozoxZ+x57yGiHDs5tXJvbyoZTiYpfb7QQaS5mgxn0+XZqfg7/cZnT7DmJtxVqk+VFmz73WHgN+4pGRjkuTOLqQ== dependencies: - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - execa "^6.1.0" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + execa "^7.0.0" -"@vuepress/plugin-google-analytics@^2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.60.tgz#63607c276de87634b72fc12af6ba4ea986befd32" - integrity sha512-Uq8UiYh2O3pGG7CR+Me6DldumcIA8xnr6hPqjFdqpi4heQifepxxSY1VQcjGrhu1F/8m16O5MryKMaNtg12BqA== +"@vuepress/plugin-google-analytics@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.61.tgz#c38751ac6c7dcf104d8ff8eb2e137b33ae94eda5" + integrity sha512-UwjDVtNpqkfEz7S5TPl703Jwhg0V1Xfvz8y5c4y5nQLNRky0/3bOKx8u7e5J3AATtwz0XwI2cmhXtuHFs6IiDA== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" -"@vuepress/plugin-medium-zoom@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.60.tgz#2ffca0d31e2ef9a73443bd9f2aacbfbb466ab969" - integrity sha512-KiJui/sTIHa321jJ/dc11ysyqTMj4Sz9tWoTSnwBJ4nebaO/0OFGQcFajk2+1ELs4poUh/w0THxc+NskR+bf+g== +"@vuepress/plugin-medium-zoom@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.61.tgz#14dba3228b9b50ef1b170a8a1c94d858a7d2331f" + integrity sha512-mFY2vHXeqC8dizFVlFO7HIzirb79Z8sudKWPVfZmq0Qmlttyhxlns8GjrsPQl1mnz2NlYUY1ztUasikPwsYjAw== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" medium-zoom "^1.0.8" - vue "^3.2.45" + vue "^3.2.47" -"@vuepress/plugin-nprogress@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.60.tgz#38b587c6520bfd851a41341784d6492ef07ae6ba" - integrity sha512-zRdJP39qFO8q9TAwlCS4tLOd2rLGtkKqkPTsfhjtWwDqSbtTHy0GqVBL8KJUy3H0+qSiyvtC647yLNRbJ9LOlw== +"@vuepress/plugin-nprogress@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.61.tgz#dbbd0e59177ffb3a051beb6103406c00e4f162d9" + integrity sha512-d36NEy8hkZaAuqMZec9VTEjozPkj9Wvimyx+AgJYpYN8JDBrWB58r9Gu9xHf8/PVeEnKayggD2xJYpGKtQ2lrw== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - vue "^3.2.45" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" vue-router "^4.1.6" -"@vuepress/plugin-palette@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.60.tgz#dcd6b69530fb4dc0cab9d6b712d15305bc176d73" - integrity sha512-KPIQCLUEIsgsdxINR6mYJRhHmWCo0850QEvy9+ikdv+ds1z6wJ5xwq/xWy/pRJ6lXdgHQrtuVkroWl+IdppcRw== +"@vuepress/plugin-palette@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.61.tgz#0b907b58a57307d1e8d71b4d8713968ad4dfedb0" + integrity sha512-mQE/2dxwOZfkc7wwkwR6byaeMJYTqQV7WmfQ4YQ3zAOr4nDP8Bx/zZVRyV3NjAcMwuif/CURpAYJo+WkFM+fpQ== dependencies: - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" chokidar "^3.5.3" -"@vuepress/plugin-prismjs@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.60.tgz#14cdddf7d89de63ec78bcf91095e58903521f61f" - integrity sha512-yWRWAsUX6iO7uUN67yyy20x3H1clQZ519rHh2dvs6wMyXsO0E3vlNB8jrveOdr+0lfoUll58t2AsxpvzTObY0A== +"@vuepress/plugin-prismjs@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.61.tgz#f9ae5b08e1ad56aa87996892b168710618654b83" + integrity sha512-B6TRmttJuPs1OMJXE2Stul7zhMUKCPy2YSXEmVWwlJ90jWti85o5nhTT9/OhxBVn3EZ89b+YroPDbB/g1uUc1w== dependencies: - "@vuepress/core" "2.0.0-beta.60" + "@vuepress/core" "2.0.0-beta.61" prismjs "^1.29.0" -"@vuepress/plugin-pwa-popup@^2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa-popup/-/plugin-pwa-popup-2.0.0-beta.60.tgz#a2ddc6d2cc346f671b4eb0db2f83067ec5562e66" - integrity sha512-DHJG1BsqUndBxI6rc0QJY6ZPsurLvn0EkQfr8/w3QinY36lHGMq+hW1LfowilrmJdKueCDs0TUUf7pzWq6jGGQ== +"@vuepress/plugin-pwa-popup@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa-popup/-/plugin-pwa-popup-2.0.0-beta.61.tgz#a250089b158fa12f04d76fedddacdd1165f9fa92" + integrity sha512-neY/pPTkyaZsA0187L1jCliydrIf5j6liHPlbQdr4Mx5TprxomYb/eqcmykA5JSfCaINYh07A9qBi3Mw17Xo8g== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/plugin-pwa" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - vue "^3.2.45" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/plugin-pwa" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" -"@vuepress/plugin-pwa@2.0.0-beta.60", "@vuepress/plugin-pwa@^2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa/-/plugin-pwa-2.0.0-beta.60.tgz#8fb85216f9f41d4da524cdc695894498f84b08ab" - integrity sha512-v+ohgXgZAEb/WCi8c74RNOPB0N91RaHalkuIy8aa3nhrKd41Rp06PAaDDxtrm4zmMlQKkqTCO78ia9eY75GW0Q== +"@vuepress/plugin-pwa@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa/-/plugin-pwa-2.0.0-beta.61.tgz#acd18d982b1fe2d5cfb41fa2e2199a285faafeb1" + integrity sha512-5joCU3FsybJEzz7gOBzA0t9yFA9DIGl0UZH4Ycd8EHsK3o8+NeNtwvRzMPLyA7i7GfO57RUyRP3jGXIwWJeYQQ== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" mitt "^3.0.0" register-service-worker "^1.7.2" - vue "^3.2.45" + vue "^3.2.47" workbox-build "^6.5.4" -"@vuepress/plugin-search@^2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.60.tgz#e253e00bb8070093baa5f7f400df75c1c484b7b4" - integrity sha512-9ENqni4H35/L6vab5DpQfy92DcKPL+36xxoOj1EqZfjU/IlIOFKz4TK8JwhaX+reswokF8NriPFcWol4xIa5IA== +"@vuepress/plugin-search@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.61.tgz#473804cd576703c16adae49bcaf81cb6f144bbb4" + integrity sha512-gcyl3C7WBCC38dp42q6F8s0S/yKjm/yHqmpqtABxwFG+6IhZne0qFI9Q2CaaG/UGSa9UE0xVxeKfcBE1XIyX9A== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" chokidar "^3.5.3" - vue "^3.2.45" + vue "^3.2.47" vue-router "^4.1.6" -"@vuepress/plugin-theme-data@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.60.tgz#742bca9ad5160f8d140714fc363d68d8a1ad317c" - integrity sha512-3b34sXEAzShvUzeEMA/0JE4VrLxoMqGJOGMl0I9m0DKg2apgjRG6nYYq6gUnJW0gcUVK+tOOOHsMT6mTMs3xdA== +"@vuepress/plugin-theme-data@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.61.tgz#f95a56c8ffb4cca8b559b4cf81ef665fe07523aa" + integrity sha512-drPLGbaXqXnHsuFHn6FolbqdRIxJzla1+10b3cKnsslatRbSPjKWos4Eri3xzgzEIC5TotPwTeT25gDRMpW8Sw== dependencies: - "@vue/devtools-api" "^6.4.5" - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - vue "^3.2.45" + "@vue/devtools-api" "^6.5.0" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" "@vuepress/shared@2.0.0-beta.60": version "2.0.0-beta.60" @@ -1846,39 +1950,47 @@ "@mdit-vue/types" "^0.11.0" "@vue/shared" "^3.2.45" -"@vuepress/theme-default@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-2.0.0-beta.60.tgz#ad4ed420ed8c7571cfb9091489df59d722cc448e" - integrity sha512-j9ybX31HWlmITnuGFt/IxQOt8ttBDI8ebzh4uKs70Yv8z4m1pMrlPNY2Qs2ubLpJIuCQNtMY2cfQKgaUiDYAuQ== - dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/plugin-active-header-links" "2.0.0-beta.60" - "@vuepress/plugin-back-to-top" "2.0.0-beta.60" - "@vuepress/plugin-container" "2.0.0-beta.60" - "@vuepress/plugin-external-link-icon" "2.0.0-beta.60" - "@vuepress/plugin-git" "2.0.0-beta.60" - "@vuepress/plugin-medium-zoom" "2.0.0-beta.60" - "@vuepress/plugin-nprogress" "2.0.0-beta.60" - "@vuepress/plugin-palette" "2.0.0-beta.60" - "@vuepress/plugin-prismjs" "2.0.0-beta.60" - "@vuepress/plugin-theme-data" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - "@vueuse/core" "^9.9.0" - sass "^1.57.1" - vue "^3.2.45" +"@vuepress/shared@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/shared/-/shared-2.0.0-beta.61.tgz#7342602990ccf3a1a4aefcdbe8315b368ed5602b" + integrity sha512-NhOQ1FDr5lDSu5IinNlNNzrF+jGOZ+bMFUyAlCxlTvK9oY6aRBCNwV8dWme+yoh3/zviKHGu62Xp7J2hKAHNZA== + dependencies: + "@mdit-vue/types" "^0.12.0" + "@vue/shared" "^3.2.47" + +"@vuepress/theme-default@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-2.0.0-beta.61.tgz#71fb67713bb9a39be0d28ddd37009c503179282a" + integrity sha512-ajjxaGqrSy5LXf+7sslHV1fbUzggMYjITcXxBYa3gT4zVu1tsytAAcmtYxnQKblL1Eo2Wo7inujl/NUwaWDjDQ== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/plugin-active-header-links" "2.0.0-beta.61" + "@vuepress/plugin-back-to-top" "2.0.0-beta.61" + "@vuepress/plugin-container" "2.0.0-beta.61" + "@vuepress/plugin-external-link-icon" "2.0.0-beta.61" + "@vuepress/plugin-git" "2.0.0-beta.61" + "@vuepress/plugin-medium-zoom" "2.0.0-beta.61" + "@vuepress/plugin-nprogress" "2.0.0-beta.61" + "@vuepress/plugin-palette" "2.0.0-beta.61" + "@vuepress/plugin-prismjs" "2.0.0-beta.61" + "@vuepress/plugin-theme-data" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" + sass "^1.58.3" + vue "^3.2.47" vue-router "^4.1.6" -"@vuepress/utils@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/utils/-/utils-2.0.0-beta.60.tgz#dfb31c66df708ffc6a9362242eb16b05047c2903" - integrity sha512-R5m5/AtKWAnlH+Su2yxoHQNp2JdJZ7gHV5531RbFySq9FTlKHtvE5RFceeppc0/UpzPE6KggRdaRqyjc77vg4g== +"@vuepress/utils@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/@vuepress/utils/-/utils-2.0.0-beta.61.tgz#a073e1ad22386f1922af3e7ef6220c5286fc5239" + integrity sha512-W7g6xjrdyOW5E1V1ouyTm5d4+kgSd4KcM80D7K0NNScrhLIW6gpOggVVOVyTH3q2K1GQhzPlUcUe04ZNSo0ilQ== dependencies: "@types/debug" "^4.1.7" - "@types/fs-extra" "^9.0.13" + "@types/fs-extra" "^11.0.1" "@types/hash-sum" "^1.0.0" - "@vuepress/shared" "2.0.0-beta.60" + "@vuepress/shared" "2.0.0-beta.61" debug "^4.3.4" fs-extra "^11.1.0" globby "^13.1.3" @@ -1887,7 +1999,7 @@ picocolors "^1.0.0" upath "^2.0.1" -"@vueuse/core@^9.10.0", "@vueuse/core@^9.12.0", "@vueuse/core@^9.9.0": +"@vueuse/core@^9.10.0": version "9.12.0" resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.12.0.tgz#e5b20f901e081c7ae5fe0e5f3af217929034eefe" integrity sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg== @@ -1897,11 +2009,26 @@ "@vueuse/shared" "9.12.0" vue-demi "*" +"@vueuse/core@^9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" + integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== + dependencies: + "@types/web-bluetooth" "^0.0.16" + "@vueuse/metadata" "9.13.0" + "@vueuse/shared" "9.13.0" + vue-demi "*" + "@vueuse/metadata@9.12.0": version "9.12.0" resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.12.0.tgz#19a0fefcba6a66a2382af10a7a67ebad6eec1f27" integrity sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ== +"@vueuse/metadata@9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" + integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== + "@vueuse/shared@9.12.0": version "9.12.0" resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.12.0.tgz#e6597da80084cba8fc3d6545f4c2fa9817b80428" @@ -1909,6 +2036,13 @@ dependencies: vue-demi "*" +"@vueuse/shared@9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" + integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== + dependencies: + vue-demi "*" + "@waline/client@^2.14.7": version "2.14.7" resolved "https://registry.yarnpkg.com/@waline/client/-/client-2.14.7.tgz#5226af39c3ab7e762fee6d58215006b587b41370" @@ -2280,7 +2414,7 @@ chalk@^5.0.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== -chart.js@^4.2.0: +chart.js@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.2.1.tgz#d2bd5c98e9a0ae35408975b638f40513b067ba1d" integrity sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw== @@ -2763,7 +2897,7 @@ d3-zoom@3: d3-selection "2 - 3" d3-transition "2 - 3" -d3@^7.0.0, d3@^7.7.0: +d3@^7.4.0, d3@^7.8.2: version "7.8.2" resolved "https://registry.yarnpkg.com/d3/-/d3-7.8.2.tgz#2bdb3c178d095ae03b107a18837ae049838e372d" integrity sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ== @@ -2799,12 +2933,12 @@ d3@^7.0.0, d3@^7.7.0: d3-transition "3" d3-zoom "3" -dagre-d3-es@7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz#8cab465ff95aca8a1ca2292d07e1fb31b5db83f2" - integrity sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q== +dagre-d3-es@7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.8.tgz#14c309c3c08ba8329a7cf51000bd56a369c513d1" + integrity sha512-eykdoYQ4FwCJinEYS0gPL2f2w+BPbSLvnQSJ3Ye1vAoPjdkq6xIMKBv+UkICd3qZE26wBKIn3p+6n0QC7R1LyA== dependencies: - d3 "^7.7.0" + d3 "^7.8.2" lodash-es "^4.17.21" dayjs@^1.11.7: @@ -2938,10 +3072,10 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.1.tgz#f9cb1a275fde9af6f2d0a2644ef648dd6847b631" - integrity sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA== +dompurify@2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" + integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== domutils@^1.5.1: version "1.7.0" @@ -2990,6 +3124,11 @@ electron-to-chromium@^1.4.284: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== +elkjs@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.8.2.tgz#c37763c5a3e24e042e318455e0147c912a7c248e" + integrity sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -3084,7 +3223,7 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild@^0.16.12, esbuild@^0.16.3: +esbuild@^0.16.14, esbuild@~0.16.17: version "0.16.17" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== @@ -3152,14 +3291,14 @@ eve-raphael@0.5.0: resolved "https://registry.yarnpkg.com/eve-raphael/-/eve-raphael-0.5.0.tgz#17c754b792beef3fa6684d79cf5a47c63c4cda30" integrity sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug== -execa@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== +execa@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.0.0.tgz#2a44e20e73797f6c2df23889927972386157d7e4" + integrity sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.1" - human-signals "^3.0.1" + human-signals "^4.3.0" is-stream "^3.0.0" merge-stream "^2.0.0" npm-run-path "^5.1.0" @@ -3412,12 +3551,12 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -giscus@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/giscus/-/giscus-1.2.6.tgz#0ccdf3bd4e936da95d2e2708446850c1e5ec4496" - integrity sha512-VqMWmCdlUk9krX2M3oMgn9/Y6XEbRXRHtfhNTuRn/AdeGOeko54OFEIsizQ/nYWymuUNGZR48KGptCtYL77rtA== +giscus@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/giscus/-/giscus-1.2.8.tgz#557964e1cb5e46c4b0abf69ed0b974c0718b8142" + integrity sha512-pufrgQYt1W+4ztiWp/PilLPN8NdyKvpbQ8jNqbAa1g84t6qqyevXHfkOYCi4x4d+y191vJAUc6seL1Dq74yUeA== dependencies: - lit "^2.5.0" + lit "^2.6.1" glob-all@^3.1.0: version "3.3.1" @@ -3628,10 +3767,10 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.3.0" -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== +human-signals@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.0.tgz#2095c3cd5afae40049403d4b811235b03879db50" + integrity sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ== iconv-lite@0.6: version "0.6.3" @@ -4151,7 +4290,7 @@ lit-html@^2.2.0, lit-html@^2.6.0: dependencies: "@types/trusted-types" "^2.0.2" -lit@^2.5.0: +lit@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/lit/-/lit-2.6.1.tgz#5951a2098b9bde5b328c73b55c15fdc0eefd96d7" integrity sha512-DT87LD64f8acR7uVp7kZfhLRrHkfC/N4BVzAtnw9Yg8087mbBJ//qedwdwX0kzDbxgPccWRW6mFwGbRQIxy0pw== @@ -4210,6 +4349,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -4229,10 +4375,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-anchor@^8.6.6: - version "8.6.6" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.6.tgz#4a12e358c9c2167ee28cb7a5f10e29d6f1ffd7ca" - integrity sha512-jRW30YGywD2ESXDc+l17AiritL0uVaSnWsb26f+68qaW9zgbIIr1f4v2Nsvc0+s0Z2N3uX6t/yAw7BwCQ1wMsA== +markdown-it-anchor@^8.6.7: + version "8.6.7" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== markdown-it-container@^3.0.0: version "3.0.0" @@ -4305,21 +4451,27 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@^9.3.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.3.0.tgz#8bd7c4a44b53e4e85c53a0a474442e9c273494ae" - integrity sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg== +mermaid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.0.0.tgz#6f7ae2eda0ab221089dc1eb166938203f2a7b04d" + integrity sha512-syS1qyYCd3EPXCVSpYtefY4D9z9WZAK8hFgjeHR9PAtanybLO162Tu7o5i/nZkqRrJq0Rk8RqskQlhBPgT8eBw== dependencies: "@braintree/sanitize-url" "^6.0.0" - d3 "^7.0.0" - dagre-d3-es "7.0.6" - dompurify "2.4.1" + cytoscape "^3.23.0" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.1.0" + d3 "^7.4.0" + dagre-d3-es "7.0.8" + dompurify "2.4.3" + elkjs "^0.8.2" khroma "^2.0.0" lodash-es "^4.17.21" - moment-mini "^2.24.0" + moment-mini "^2.29.4" non-layered-tidy-tree-layout "^2.0.2" stylis "^4.1.2" + ts-dedent "^2.2.0" uuid "^9.0.0" + web-worker "^1.2.0" mhchemparser@^4.1.0: version "4.1.1" @@ -4414,7 +4566,7 @@ mj-context-menu@^0.6.1: resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== -moment-mini@^2.24.0: +moment-mini@^2.29.4: version "2.29.4" resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.29.4.tgz#cbbcdc58ce1b267506f28ea6668dbe060a32758f" integrity sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg== @@ -4696,7 +4848,7 @@ postcss@^6.0.21: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.1.10, postcss@^8.4.20: +postcss@^8.1.10, postcss@^8.4.21: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -5005,10 +5157,10 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rollup@^3.7.0, rollup@^3.9.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.15.0.tgz#6f4105e8c4b8145229657b74ad660b02fbfacc05" - integrity sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg== +rollup@^3.10.0, rollup@^3.17.3: + version "3.17.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.17.3.tgz#ee7c4e1a262da55c491a4788b632fa123315f6ef" + integrity sha512-p5LaCXiiOL/wrOkj8djsIDFmyU9ysUxcyW+EKRLHb6TKldJzXpImjcRSR+vgo09DBdofGcOoLOsRyxxG2n5/qQ== optionalDependencies: fsevents "~2.3.2" @@ -5055,10 +5207,10 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.57.1, sass@^1.58.0: - version "1.58.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" - integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== +sass@^1.58.3: + version "1.58.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d" + integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -5082,6 +5234,13 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -5493,6 +5652,11 @@ ts-debounce@^4.0.0: resolved "https://registry.yarnpkg.com/ts-debounce/-/ts-debounce-4.0.0.tgz#33440ef64fab53793c3d546a8ca6ae539ec15841" integrity sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg== +ts-dedent@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.2.0.tgz#39e4bd297cd036292ae2394eb3412be63f563bb5" + integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== + tslib@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" @@ -5503,10 +5667,10 @@ tslib@2.4.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== -twikoo@^1.6.9: - version "1.6.9" - resolved "https://registry.yarnpkg.com/twikoo/-/twikoo-1.6.9.tgz#7992519c4e035430e6291a711e57ac7b7a88c1d8" - integrity sha512-Umm2kqj4gPkTqxCbHpLO8QLq+T3fn4OPIa5hqW7amYj2aBVVOIdd3dsBbvE1sYT94GFu+Ivea/L41nR1g4lqqw== +twikoo@^1.6.10: + version "1.6.10" + resolved "https://registry.yarnpkg.com/twikoo/-/twikoo-1.6.10.tgz#4256fa62abf61c0b83b8e855aceeed943126196e" + integrity sha512-5CPfRUzd8kHvNB6ekYXvgEbsIEQuySBOm47VkMh3nI4rj79crT+2v9aCDVuson+KorEngdGfe5MOni0VKNblmQ== type-fest@^0.16.0: version "0.16.0" @@ -5657,15 +5821,15 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== -vite@~4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.0.4.tgz#4612ce0b47bbb233a887a54a4ae0c6e240a0da31" - integrity sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw== +vite@~4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" + integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== dependencies: - esbuild "^0.16.3" - postcss "^8.4.20" + esbuild "^0.16.14" + postcss "^8.4.21" resolve "^1.22.1" - rollup "^3.7.0" + rollup "^3.10.0" optionalDependencies: fsevents "~2.3.2" @@ -5692,136 +5856,137 @@ vue@^3.2.45, vue@^3.2.47: "@vue/server-renderer" "3.2.47" "@vue/shared" "3.2.47" -vuepress-plugin-comment2@^2.0.0-beta.173: - version "2.0.0-beta.173" - resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.173.tgz#b855a09c27398de9a5745e3024bc4e304c898986" - integrity sha512-/rtd82u908EIe1fsBqvmwJzF1jK4TAx5fPUcfiQTwEcHcKgbRiRYadXMvsT/NT6VAdYpO8a31ZbPXs9j35b6uQ== +vuepress-plugin-comment2@2.0.0-beta.184: + version "2.0.0-beta.184" + resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.184.tgz#5e5722162177c09cff9cc2788b3b7bed9b20a0f3" + integrity sha512-Bm0/EqwIZ965T5ZsMD4U4XPFqMfkROt0KCi38JCtPoIWPtrt/lzmFw2j7ppu+aGKjWjiC4LEo+7nj9UnaG8ptA== dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" "@waline/client" "^2.14.7" artalk "^2.4.4" - giscus "^1.2.6" - twikoo "^1.6.9" + giscus "^1.2.8" + twikoo "^1.6.10" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.173" - vuepress-shared "2.0.0-beta.173" - -vuepress-plugin-copy-code2@^2.0.0-beta.173: - version "2.0.0-beta.173" - resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.173.tgz#b0eaf6a8883920baa86cb0f1fdaec45325e08562" - integrity sha512-6n49xV8RF8ADQC5uS+vdLutZU0/3JJUgJa97OTi6zlHXFsBIjF5HDHfQy/wIvUY/y2Rnoge2XauX12tJBGm43Q== - dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - "@vueuse/core" "^9.12.0" + vuepress-plugin-sass-palette "2.0.0-beta.184" + vuepress-shared "2.0.0-beta.184" + +vuepress-plugin-copy-code2@2.0.0-beta.184: + version "2.0.0-beta.184" + resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.184.tgz#df5e259353cb8b85934452b3960673df5f7838a5" + integrity sha512-fZBPY4ZecFOu9WVY/EH8AODE2ufsr6wulfoybHU7vdzZHoI87pqgMnjSGUmy8aycq6M2VJ++fmLYPX1RXroSPw== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" balloon-css "^1.2.0" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.173" - vuepress-shared "2.0.0-beta.173" - -vuepress-plugin-md-enhance@^2.0.0-beta.173: - version "2.0.0-beta.173" - resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.173.tgz#a224341b05991dfa4201db814fd8bdb648a6c45b" - integrity sha512-uCLelL8W0zz0iQk3l2A8HaEifvwH+WVHdAQTpascZr1YyvcjLGF+ZYvQC4NZ8gKcOC1vrAHHv4RetXepVTb1ow== - dependencies: - "@babel/core" "^7.20.12" - "@mdit/plugin-align" "^0.2.3" - "@mdit/plugin-attrs" "^0.2.3" - "@mdit/plugin-container" "^0.2.3" - "@mdit/plugin-figure" "^0.2.3" - "@mdit/plugin-footnote" "^0.2.3" - "@mdit/plugin-img-lazyload" "^0.2.3" - "@mdit/plugin-img-mark" "^0.2.3" - "@mdit/plugin-img-size" "^0.2.3" - "@mdit/plugin-include" "^0.2.3" - "@mdit/plugin-katex" "^0.2.3" - "@mdit/plugin-mark" "^0.2.3" - "@mdit/plugin-mathjax" "^0.2.3" - "@mdit/plugin-stylize" "^0.2.3" - "@mdit/plugin-sub" "^0.2.3" - "@mdit/plugin-sup" "^0.2.3" - "@mdit/plugin-tab" "^0.2.3" - "@mdit/plugin-tasklist" "^0.2.3" - "@mdit/plugin-tex" "^0.2.3" - "@mdit/plugin-uml" "^0.2.3" - "@mermaid-js/mermaid-mindmap" "^9.3.0" + vuepress-plugin-sass-palette "2.0.0-beta.184" + vuepress-shared "2.0.0-beta.184" + +vuepress-plugin-md-enhance@2.0.0-beta.184: + version "2.0.0-beta.184" + resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.184.tgz#27dd0ed5156b4a79d8e732bc2f7d096e26e6fceb" + integrity sha512-3U2qt6xy4uJ0yBIL3ysCMCxW0crJBORgI8KHBDj5WDhGhvKRn2bMY1pmJURXGd5oIWvSO3DvWV2WkPeny29e4w== + dependencies: + "@babel/core" "^7.21.0" + "@mdit/plugin-align" "^0.3.0" + "@mdit/plugin-attrs" "^0.3.0" + "@mdit/plugin-container" "^0.3.0" + "@mdit/plugin-figure" "^0.3.0" + "@mdit/plugin-footnote" "^0.3.0" + "@mdit/plugin-img-lazyload" "^0.3.0" + "@mdit/plugin-img-mark" "^0.3.0" + "@mdit/plugin-img-size" "^0.3.0" + "@mdit/plugin-include" "^0.3.0" + "@mdit/plugin-katex" "^0.3.0" + "@mdit/plugin-mark" "^0.3.0" + "@mdit/plugin-mathjax" "^0.3.0" + "@mdit/plugin-stylize" "^0.3.0" + "@mdit/plugin-sub" "^0.3.0" + "@mdit/plugin-sup" "^0.3.0" + "@mdit/plugin-tab" "^0.3.0" + "@mdit/plugin-tasklist" "^0.3.0" + "@mdit/plugin-tex" "^0.3.0" + "@mdit/plugin-uml" "^0.3.0" "@types/markdown-it" "^12.2.3" "@vue/repl" "^1.3.2" - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - "@vueuse/core" "^9.12.0" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" balloon-css "^1.2.0" - chart.js "^4.2.0" + chart.js "^4.2.1" echarts "^5.4.1" flowchart.ts "^0.1.2" katex "^0.16.4" markdown-it "^13.0.1" - mermaid "^9.3.0" + mermaid "^10.0.0" reveal.js "^4.4.0" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.173" - vuepress-shared "2.0.0-beta.173" + vuepress-plugin-sass-palette "2.0.0-beta.184" + vuepress-shared "2.0.0-beta.184" -vuepress-plugin-sass-palette@2.0.0-beta.173: - version "2.0.0-beta.173" - resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.173.tgz#c3be6ee659709fa6f19a35f9cbe2a9dfda20132d" - integrity sha512-mZ636bWSVfAbkKHhbCyLZafAbA8p8KHjOahye+4aFDliA4y6p5l7+Znjmxg0QZZ8XpbXKRTLjGnJpSwTXwrfsA== +vuepress-plugin-sass-palette@2.0.0-beta.184: + version "2.0.0-beta.184" + resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.184.tgz#ed6a7923fb2062a07387169f162e3ffb9f8a8acd" + integrity sha512-k2lgxvZAN3NbqdonyxOa4Ipg17JzVYuuoYQYpP+gQQZLJpjK/KbniQ3UJGBGK1RGoXjPm2xIfosqi6m9Zdw1Bg== dependencies: - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" chokidar "^3.5.3" - sass "^1.58.0" - vuepress-shared "2.0.0-beta.173" - -vuepress-plugin-seo2@^2.0.0-beta.173: - version "2.0.0-beta.173" - resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.173.tgz#ed0c2ffd3d65ca3c1509bee99e098b10f732d2c8" - integrity sha512-P9v/Rjb1haagTOJptN38cJUT2h97AEl6h8DJGrKeylI2kjWpeK8cZTN9PrcKccd7L6YOsCEHX0wKKuMu4/3eeg== - dependencies: - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" - vuepress-shared "2.0.0-beta.173" - -vuepress-shared@2.0.0-beta.173: - version "2.0.0-beta.173" - resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.173.tgz#d326660f81adc514abb4545f9b6811f9ef8b0fe9" - integrity sha512-01QrCi609ovjNFAhtA7kAa+aBe0i9y7tS9Yuna6Fb1zEpw3n3yHoMWgq58x37egrOiBW0q/pUFXEbj9ZnOiN/A== - dependencies: - "@vuepress/client" "2.0.0-beta.60" - "@vuepress/shared" "2.0.0-beta.60" - "@vuepress/utils" "2.0.0-beta.60" + sass "^1.58.3" + vuepress-shared "2.0.0-beta.184" + +vuepress-plugin-seo2@2.0.0-beta.184: + version "2.0.0-beta.184" + resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.184.tgz#8df79fa5029391eda06cb0087d9eb8823cb6ff7d" + integrity sha512-dUErzGuzC+xcloOrKLrm44Gg7JH99QjCQ6CSJpWoO/AIc+ur0J8RcPLMiCYOYPz2XXSAds+N+23mLBNpS4Q92g== + dependencies: + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vuepress-shared "2.0.0-beta.184" + +vuepress-shared@2.0.0-beta.184: + version "2.0.0-beta.184" + resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.184.tgz#c8af539345208a2dfe1e24d011d7e69e4c47d88c" + integrity sha512-Ez9wm/X0wAoUUaRrz4/8p+mhK9QjQ9hLbBaMX3xGYy+QwIsaQR1iha62OdjQMq46xvAEldePJINOl+ZOjG1hwA== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" cheerio "1.0.0-rc.12" dayjs "^1.11.7" - execa "^6.1.0" + execa "^7.0.0" fflate "^0.7.4" gray-matter "^4.0.3" + semver "^7.3.8" striptags "^3.2.0" vue "^3.2.47" vue-router "^4.1.6" -vuepress-vite@2.0.0-beta.60: - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.60.tgz#844359283f18bbd638a059e3477388b8d2b73a1e" - integrity sha512-ljHvo419nbfYl/cQecVbYL4bwJjUOX0+z76v/4yX6ODeGIpdHIs7ARZ4t52mr0EEfwP6aZbZa+qFZTTQutxAuQ== +vuepress-vite@2.0.0-beta.61: + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.61.tgz#04058551e6be014e9f2dee14c5d8043b158e032d" + integrity sha512-4mcR8XSY5b36CYkPqF80WvoeGAEjTw6Cr9bMPHrPVSjG4qqyfVpdSdyRtXD+/5aLJB7r/L60J7PI1pKTci1+3w== dependencies: - "@vuepress/bundler-vite" "2.0.0-beta.60" - "@vuepress/cli" "2.0.0-beta.60" - "@vuepress/core" "2.0.0-beta.60" - "@vuepress/theme-default" "2.0.0-beta.60" + "@vuepress/bundler-vite" "2.0.0-beta.61" + "@vuepress/cli" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/theme-default" "2.0.0-beta.61" -vuepress@^2.0.0-beta.60: - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-2.0.0-beta.60.tgz#19205a971ecd6c14d6412564e16e613fcebd58e7" - integrity sha512-evkv5PtX5pdlEyY5EcEV+rN/HTmi8iG7ZcvAnMFfYKWdvKiUjE+/DPwZfmE8emx33FEE2htbAKgtruABTocEjA== +vuepress@2.0.0-beta.61: + version "2.0.0-beta.61" + resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-2.0.0-beta.61.tgz#f89741a505b71fbe49dba83d8319b1fd0d45116c" + integrity sha512-gpttL0x5ZvI9eTyR/pexBknIAcgrdjAWoiJc7OYd4bIVfwlXAb4GO4A2EwRSX+pIaNOWdcd+sfZA86EMEbrtNg== dependencies: - vuepress-vite "2.0.0-beta.60" + vuepress-vite "2.0.0-beta.61" wcwidth@^1.0.1: version "1.0.1" @@ -5830,6 +5995,11 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-worker@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -6076,6 +6246,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yaml@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" From b19a485f7e6ab026be99bea9b2f3ad7e18dd86c4 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 28 Feb 2023 21:08:35 +0800 Subject: [PATCH 20/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7vuepress?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=88=B02.0.0-beta.61?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 6caf082..c358566 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -5,11 +5,11 @@ import {pwaPlugin} from '@vuepress/plugin-pwa' import {pwaPopupPlugin} from '@vuepress/plugin-pwa-popup' import {gitPlugin} from '@vuepress/plugin-git' import {searchPlugin} from '@vuepress/plugin-search' -import {copyCodePlugin} from "vuepress-plugin-copy-code2" +import {copyCodePlugin} from 'vuepress-plugin-copy-code2' import {commentPlugin} from 'vuepress-plugin-comment2' -import {seoPlugin} from "vuepress-plugin-seo2" +import {seoPlugin} from 'vuepress-plugin-seo2' import {svgIconPlugin} from '@goy/vuepress-plugin-svg-icons' -import {mdEnhancePlugin} from "vuepress-plugin-md-enhance" +import {mdEnhancePlugin} from 'vuepress-plugin-md-enhance' import {head, navbarZh, sidebarZh,} from './configs' From 6074b066c32d2ae4bbaf6d1e272fb36b986cc1a2 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 28 Feb 2023 22:58:19 +0800 Subject: [PATCH 21/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84namesrv=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8E=9F=E7=90=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\212\250\345\216\237\347\220\206.md" | 994 ++---------------- ...41\347\220\206\346\234\272\345\210\266.md" | 891 +++++++++++++++- 2 files changed, 958 insertions(+), 927 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index b378de5..62ee460 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -335,16 +335,25 @@ public static NamesrvController createNamesrvController() { ``` 调用 NamesrvController 的构造方法创建对象,构造方法里面创建了 KVConfigManager、BrokerHousekeepingService、RouteInfoManager、Configuration 对象,这里简单介绍一下这四个类的作用。 -- KVConfigManager:该类是 NameServer 的配置存储类。会将配置信息存储在文件 `{user.home}/namesrv/kvConfig.json`。内部用来存储配置信息的是一个`HashMap>`结构,也就是两级结构。第一级是命名空间,第二集是 KV 对,都是字符串形式。该类的`load`方法可以从文件中加载数据到内存里,`persist`方法可以将内存中的数据再写入到文件中。 +- KVConfigManager:该类是 NameServer 的配置存储类。会将配置信息存储在文件 `{user.home}/namesrv/kvConfig.json`。内部用来存储配置信息的是一个`HashMap>`结构,也就是两级结构。第一级是命名空间,第二级是 KV 对,都是字符串形式。该类的`load`方法可以从文件中加载数据到内存里,`persist`方法可以将内存中的数据再写入到文件中。 - BrokerHousekeepingService:该类是用来处理 broker 连接发生变化的服务。可以看到这个类实现了ChannelEventListener 接口,除了onChannelConnect 外,其余各个方法均委托给 namesrvController 的 routeInfoManager 的 onChannelDestroy 方法。这里需要 netty 的一些基础,简单来说每一个 broker 与 namesrv通过一个“通道” channel 进行“沟通”。namesrv 通过监测这些通道是否发生某些事件,去做出相应的变动。可以点进 routeInfoManager 的 onChannelDestroy 方法看看,对于宕机的 broker 是如何处理的。这一块的内容将在路由原理中详细讲解,这里了解即可。 - RouteInfoManager:这就是 RocketMQ 的路由管理器,其内部维护了路由相关的所有元数据信信息,包括 topic 队列、Broker 地址信息、Broker 集群信息、Broker 活跃信息、Broker 上的 FilterServer 列表等。也因此,提供了扫描不活跃的 Broker、删除 topic、获取 topic 列表、注册 Broker、查询 Broker 的 Topic 配置等基础方法,由对应的网络请求或定时任务进行调用。 - Configuration:用于存储配置文件、命令行中的各项配置,将配置注册到Configuration中,并被controller持有,防止配置丢失。 #### 2.2.2 启动NameServerController对象 -start方法代码如下所示: +创建好 NameServerController 对象以后,接下来就是启动它,`NamesrvStartup#start()` 方法是启动 NameServerControler 的主要逻辑代码,主要流程分为三步: + +- 第一步:进行controller的初始化工作 +- 第二步:注册钩子函数,当 JVM 正常退出的时候,将执行该钩子函数,执行关闭 controller 释放资源 +- 第三步:启动 controller + +代码注释如下所示: ```java +/** + * 启动NameServerController + */ public static NamesrvController start(final NamesrvController controller) throws Exception { if (null == controller) { @@ -353,6 +362,7 @@ public static NamesrvController start(final NamesrvController controller) throws // 第一步:进行controller的初始化工作 boolean initResult = controller.initialize(); + // 如果初始化controller失败,则直接退出 if (!initResult) { // 关闭controller,释放资源 @@ -367,945 +377,77 @@ public static NamesrvController start(final NamesrvController controller) throws })); // 第三步:启动controller + // 启动remotingServer、remotingClient、fileWatchService、routeInfoManager服务 controller.start(); return controller; } ``` -在正式启动controller之前,controller进行了很多的初始化工作,主要如下所示: +对于注册了钩子函数,这里向我们展示了一种非常优雅的编程方式,对于代码中使用到了线程池等资源,建议为其注册钩子函数,每当 JVM 退出的时候,去执行钩子函数逻辑,去执行一些资源关闭的操作,这是一种比较优雅的方式。 -- 加载KV配置,主要流程是从本地文件中加载KV配置到内存中,默认加载路径是:`${user.home}/namesrv/kvConfig.json` -- 构建NettyRemotingServer对象 -- 创建一个用于网络交互的线程池`remotingExecutor`,默认固定线程数为8 -- 注册一个处理器,用于处理不同类型的请求 -- 注册两个定时任务线程池: - - NameServer定时每隔10秒钟扫描一次Broker列表,移除已经处于非激活状态的Broker; - - NameServer定时每隔10分钟打印一次KV的配置信息 -- 配置TSL协议,可选操作 +在正式启动 controller 之前,controller 进行了很多的初始化工作,主要如下所示: + +- 第一步:加载 KV 配置,主要流程是从本地文件中加载 KV 配置到内存中,默认加载路径是:`${user.home}/namesrv/kvConfig.json` +- 第二步:构建网络通讯组件:NettyRemotingServer 对象、NettyRemotingClient 对象 +- 第三步:初始化线程池,这里面初始化了两个线程池,一个(defaultExecutor)用于处理 Broker 相关请求的线程池,一个(clientRequestExecutor)用于处理客户端(生产者、消费者)相关请求的线程池 +- 第四步:注册处理器,用于处理不同类型的请求: + - ClusterTestRequestProcessor 用于处理测试请求 + - ClientRequestProcessor 用于处理客户端请求,目前包含根据Topic获取路由信息 + - DefaultRequestProcessor 用于处理其余 NameServer 的请求:比如 KV 配置管理、Broker 注册、Broker 心跳、更新/查询 Namesrv 配置等 + +- 第五步:注册三个定时任务线程池: + - NameServer 定时默认每隔 $5$ 秒钟(可通过配置文件修改)扫描一次 Broker 列表,移除已经处于非激活状态的 Broker + - NameServer 定时每隔 $10$ 分钟(可通过配置文件修改)打印一次 KV 的配置信息 + - NameServer 定时每秒钟打印水位信息,将 clientRequestThreadPoolQueue 和 defaultThreadPoolQueue 两个队列中的任务数和第一个未执行任务的延迟时间打印出来(当前时间戳减去任务的创建时间戳) + +- 第六步:配置 SSL(Secure Sockets Layer 安全套接字协议)协议,这里支持三种模式:disabled、permissive、enforcing + - disabled:不支持 SSL,所有 SSL 协议的挥手请求都将被拒绝,连接被关闭 + - permissive:SSL 是可以选的,服务端可以处理客户端的 SSL 的连接或者非 SSL 连接,该选项是默认值 + - enforcing:SSL 是必需的,非 SSL 的连接都将被拒绝 + +- 第七步:添加 ZoneRouteRPCHook,支持云特性:多 zone 部署和管理,ZoneRouteRPCHook 内部的主要逻辑是在请求(GET_ROUTEINFO_BY_TOPIC)的时候,通过 zone 配置,可以实现路由信息的过滤,然后返回给客户端,实现多 zone 部署和管理 具体代码分析如下所示: ```java public boolean initialize() { - // 第一步:加载KV配置,主要流程是从本地文件中加载KV配置到内存中 // 默认加载路径是:${user.home}/namesrv/kvConfig.json - this.kvConfigManager.load(); - - // 第二步:构建NettyRemotingServer对象 - this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService); - - // 第三步:创建一个用于网络交互的线程池,默认固定线程数为8 - this.remotingExecutor = - Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), - new ThreadFactoryImpl("RemotingExecutorThread_")); - - // 第四步:注册一个处理器,用于处理不同类型的请求 - this.registerProcessor(); - - // 第五步:注册两个定时任务线程池 - // 1.NameServer定时每隔10秒钟扫描一次Broker列表,移除已经处于非激活状态的Broker; - // 2.NameServer定时每隔10分钟打印一次KV的配置信息 - this.scheduledExecutorService.scheduleAtFixedRate( - NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, 10, TimeUnit.SECONDS); - - this.scheduledExecutorService - .scheduleAtFixedRate(NamesrvController.this.kvConfigManager::printAllPeriodically, 1, 10, - TimeUnit.MINUTES); - - // 第六步:配置TSL协议,可选操作 - if (TlsSystemConfig.tlsMode != TlsMode.DISABLED) { - // Register a listener to reload SslContext - try { - fileWatchService = new FileWatchService( - new String[] { - TlsSystemConfig.tlsServerCertPath, - TlsSystemConfig.tlsServerKeyPath, - TlsSystemConfig.tlsServerTrustCertPath - }, - new FileWatchService.Listener() { - boolean certChanged, keyChanged = false; - - @Override - public void onChanged(String path) { - if (path.equals(TlsSystemConfig.tlsServerTrustCertPath)) { - log.info("The trust certificate changed, reload the ssl context"); - reloadServerSslContext(); - } - if (path.equals(TlsSystemConfig.tlsServerCertPath)) { - certChanged = true; - } - if (path.equals(TlsSystemConfig.tlsServerKeyPath)) { - keyChanged = true; - } - if (certChanged && keyChanged) { - log.info("The certificate and private key changed, reload the ssl context"); - certChanged = keyChanged = false; - reloadServerSslContext(); - } - } - - private void reloadServerSslContext() { - ((NettyRemotingServer) remotingServer).loadSslContext(); - } - }); - } catch (Exception e) { - log.warn("FileWatchService created error, can't load the certificate dynamically"); - } - } - + loadConfig(); + + // 第二步:构建网络通讯组件:NettyRemotingServer对象、NettyRemotingClient对象 + initiateNetworkComponents(); + + // 第三步:初始化线程池,这里面初始化了两个线程池, + // 一个(defaultExecutor)用于处理Broker相关请求的线程池,一个(clientRequestExecutor)用于处理客户端(生产者、消费者)相关请求的线程池 + initiateThreadExecutors(); + + // 第四步:注册处理器,用于处理不同类型的请求 + // ClusterTestRequestProcessor用于处理测试请求 + // ClientRequestProcessor用于处理客户端请求,目前包含根据Topic获取路由信息 + // DefaultRequestProcessor用于处理其余NameServer的请求:比如KV配置管理、Broker注册、Broker心跳、更新/查询Namesrv配置 + registerProcessor(); + + // 第五步:注册三个定时任务线程池 + // 1.NameServer定时默认每隔5秒钟(可通过配置文件修改)扫描一次Broker列表,移除已经处于非激活状态的Broker + // 2.NameServer定时每隔10分钟(可通过配置文件修改)打印一次KV的配置信息 + // 3.NameServer定时每秒钟打印水位信息,将clientRequestThreadPoolQueue和defaultThreadPoolQueue + // 两个队列中的任务数和第一个未执行任务的延迟时间打印出来(当前时间戳减去任务的创建时间戳) + startScheduleService(); + + // 第六步:配置SSL(Secure Sockets Layer 安全套接字协议)协议,这里支持三种模式:disabled、permissive、enforcing + // disabled:不支持SSL,所有SSL协议的挥手请求都将被拒绝,连接被关闭 + // permissive:SSL是可以选的,服务端可以处理客户端的SSL的连接或者非SSL连接,该选项是默认值 + // enforcing:SSL是必需的,非SSL的连接都将被拒绝 + initiateSslContext(); + + // 第七步:添加ZoneRouteRPCHook,支持云特性:多zone部署和管理 + // ZoneRouteRPCHook内部的主要逻辑是在请求(GET_ROUTEINFO_BY_TOPIC)的时候, + // 通过zone配置,可以实现路由信息的过滤,然后返回给客户端,实现多zone部署和管理 + initiateRpcHooks(); return true; } ``` -对于注册了钩子函数,这里向我们展示了一种非常优雅的编程方式,对于代码中使用到了线程池等资源,建议为其注册钩子函数,每当JVM退出的时候,去执行钩子函数逻辑,去执行一些资源关闭的操作,这是一种比较优雅的方式。 - -## 三、NameServer的路由原理 - -文章一开始就提到,NameServer是保证消息正确地从生产者到消费者的“指挥官”,它提供了路由管理,服务注册与服务发现、故障剔除等机制,这些机制的背后原理都都依赖于NameServer的路由,本小节将着重介绍NameServer的路由原理。 - -### 3.1 路由信息管理器 - -NameServer有一个路由信息管理器`RouteInfoManager`,它位于`org.apache.rocketmq.namesrv.routeinfo`包内,其内部存储了topic与broker的各种信息与关系,是RocketMQ实现服务注册与发现、故障剔除的基础。 -RouteInfoManager内部维护了多个HashMap数据结构,用于存储路由信息,具体的内容如下所示: - -```java -/** - * 该Map存储的是Topic消息队列的路由信息,发送具体消息时可根据该Map来进行负载均衡 - */ -private final HashMap> topicQueueTable; - -/** - * Broker的基础信息表,键名是Broker的名称,BrokerData中存储了Broker的名称, - * 所属集群名称以及主Broker和备Broker的地址信息 - */ -private final HashMap brokerAddrTable; - -/** - * 集群与Broker名称的映射表,可以方便知道一个集群下有哪些Broker - */ -private final HashMap> clusterAddrTable; - -/** - * 该Map存储的是每个Broker的存活信息,Name Server每次收到心跳后会将此引用指向最新的表 - */ -private final HashMap brokerLiveTable; - -/** - * 该Map存储的是Broker与Filter Server之间的关系表 - */ -private final HashMap/* Filter Server */> filterServerTable; -``` -从上面的数据结构看来,维护NameServer的路由信息应该还是很简单的,没有太过于抽象的概念,从数据结构中也能得出以下几个结论: - -- 一个Topic包含多个消息队列,其数据是存储在`topicQueueTable`中。 -- 多个Broker拥有同一个Broker Name,它们之间使用BrokerId来进行区分,在BrokerData内部维护了一个HashMap结构来存储。 -- 一个RocketMQ集群可包含多个名称唯一的Broker。 -- 一个Broker可与多个Filter Server进行绑定。 - -其中QueueData、BrokerData、BrokerLiveInfo分别用于存储队列信息、Broker信息及Broker存活信息等数据,其类图如下所示: -```mermaid -classDiagram - class QueueData{ - -String brokerName - -int readQueueNums - -int writeQueueNums - -int perm - -int topicSynFlag - } - class BrokerData{ - -String cluster - -String brokerName - -int writeQueueNums - -HashMap brokerAddrs - } - class BrokerLiveInfo{ - -long lastUpdateTimestamp - -DataVersion dataVersion - -Channel channel - -String haServerAddr - } -``` -QueueData中各个属性含义如下所示: - -- brokerName:当前Queue所属的Broker的名称 -- readQueueNums:读Queue的数量 -- writeQueueNums:写Queue的数量 -- perm:读写权限,{@link org.apache.rocketmq.common.constant.PermName} -- topicSynFlag:topic同步标记,{@link org.apache.rocketmq.common.sysflag.TopicSysFlag} - -BrokerData中各个属性含义如下所示: - -- cluster:所属集群名称 -- brokerName:Broker名称 -- brokerAddrs:主备Broker信息表,键为BrokerID,值为Broker的地址 - -BrokerLiveInfo中各个属性含义如下所示: - -- lastUpdateTimestamp:上一次更新的时间戳,用于判断该Broker是否已经过期 -- dataVersion:Broker信息版本 -- channel:socket通道 -- haServerAddr:haServer的地址,是Slave从Master拉取数据时链接的地址 - -本文开始的第一张图是一个2主2从的RocketMQ集群部署方式,集群中包含2个Master的Broker和2个Slave的Broker,使用BrokerData存储上述部署方式,其表现为以下形式: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) -我们启动一个NameServer服务,并且启动四个Broker服务(分别是BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs),按照上面的图展示的方式来进行部署,一起验证一下RouteInfoManager内部的数据存储的内容。 -在本机IntelliJ IDEA中启动四个Broker,需要为四个Broker分别设置配置文件,我们参考《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,参考Broker的配置方式,分别配置四份,具体的配置文件参考代码中的[配置文件](https://github.com/itlemon/itlemon-rocketmq/tree/master/rocketmq_home),IntelliJ IDEA中的配置面板需要改成如下所示: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213215432215.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) -图中展示红框是设置了一个自定义的命令行参数,支持Broker自定义启动端口(默认是10911,需要在同一机器启动多个Broker服务,最好支持自定义端口设置),这需要修改一下`BrokerStartup`这个类的源码,具体可参考上面BrokerStartup的自定义启动端口的代码,这里给出[github地址](https://github.com/itlemon/itlemon-rocketmq/blob/master/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java),不再在文章中重复赘述了。需要注意的一点是,如果设置的broker-am的启动端口是10911,那么broker-as的不能设置为10912,因为每个每个broker启动后还会占用启动端口的后一个端口。 -我们继续按照顺序分别启动四个Broker服务,最后启动的broker-bs,并且给NameServer的RouteInfoManager中的registerBroker方法加上断点,因为Broker向NameServer发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 - -- topicQueueTable: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213231041621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) -上图中topicQueueTable对应于运行时的数据就是: -```json -{ - "testCluster": [ - { - "brokerName": "broker-a", - "readQueueNums": 16, - "writeQueueNums": 16, - "perm": 7, - "topicSynFlag": 0 - }, - { - "brokerName": "broker-b", - "readQueueNums": 16, - "writeQueueNums": 16, - "perm": 7, - "topicSynFlag": 0 - } - ] -} -``` -- brokerAddrTable: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213232601362.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) -上图中brokerAddrTable对应于运行时的数据就是: -```json -{ - "broker-a": { - "cluster": "testCluster", - "brokerName": "broker-a", - "brokerAddrs": { - "0": "172.20.192.218:10911", - "1": "172.20.192.218:10921" - } - }, - "broker-b": { - "cluster": "testCluster", - "brokerName": "broker-b", - "brokerAddrs": { - "0": "172.20.192.218:10931", - "1": "172.20.192.218:10941" - } - } -} -``` -- clusterAddrTable: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213223306896.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) -上图中clusterAddrTable对应于运行时的数据就是: -```json -{ - "testCluster": { - "broker-b": "DEFAULT_OBJECT", - "broker-a": "DEFAULT_OBJECT" - } -} -``` -这里需要说明一点,HashSet底层的实现结构仍然是HashMap,所以这里使用HashMap的方式来展示HashSet,读者关心Map的键即可。 -- brokerLiveTable: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213233041302.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) -上图中brokerLiveTable对应于运行时的数据就是: -```json -{ - "172.20.192.218:10921": { - "lastUpdateTimestamp": 1613230150507, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10922" - }, - "172.20.192.218:10911": { - "lastUpdateTimestamp": 1613230145828, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10912" - }, - "172.20.192.218:10941": { - "lastUpdateTimestamp": 1613230166459, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10942" - }, - "172.20.192.218:10931": { - "lastUpdateTimestamp": 1613230154587, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10932" - } -} -``` - -### 3.2 路由信息注册 - -路由信息注册通常是指,将自身的信息告诉服务注册中心,在RocketMQ中,这里的“自身”是指Broker,而服务注册中心指得就是NameServer。Broker在启动后,会向所有的NameServer注册自身的元信息,通常包括:集群名称(clusterName)、Broker地址(brokerAddr)、Broker名称(brokerName)、Broker ID(brokerId)、高可用地址(haServerAddr)、Topic相关信息(topicConfigWrapper)、过滤服务器列表、通信通道等信息等。这些元信息的注册,都是通过心跳机制来实现的,所谓的心跳机制,一般都是通过定时任务来实现的,按照一定的频率向NameServer发送元信息数据,从而实现续约。每个Broker会每隔30秒向NameServer发送心跳,NameServer接收到Broker心跳数据后,会去实时更新brokerLiveTable中BrokerLiveInfo的lastUpdateTimestamp字段(上一次心跳时间戳),当然,NameServer也有检查机制,会每隔10秒扫描brokerLiveTable,如果发现某个Broker的lastUpdateTimestamp字段超过2min没有更新,那么就认为该Broker存在故障,NameServer会主动将其从路由表中剔除,同时关闭通信通道。 -那么Broker是如何向NameServer进行注册的呢?下面的内容将一一揭秘。 - -从BrokerController的start()方法可以看出,Broker在启动的时候,会注册一个定时任务,每隔30s(默认值,可配置10~60s)向NameServer发送元数据信息。`brokerConfig.getRegisterNameServerPeriod()`的默认值是30s。 -```java -// 注册一个定时任务,默认每隔30s向NameServer发送元数据信息 -this.scheduledExecutorService.scheduleAtFixedRate(() -> { - try { - BrokerController.this.registerBrokerAll(true, - false, brokerConfig.isForceRegister()); - } catch (Throwable e) { - log.error("registerBrokerAll Exception", e); - } - }, 1000 * 10, Math.max(10000, - Math.min(brokerConfig.getRegisterNameServerPeriod(), 60000)), - TimeUnit.MILLISECONDS); -``` -具体的注册行为代码需要进入到registerBrokerAll方法中,这里将分析后的registerBrokerAll方法贴在下面: -```java -/** - * 注册Broker元信息到NameServer列表中 - * - * @param checkOrderConfig 是否检查顺序消息配置 - * @param oneway 是否是单向消息,如果是,那么就不需要知道注册结果,不同于同步和异步消息 - * @param forceRegister 是否是强制注册 - */ -public synchronized void registerBrokerAll(final boolean checkOrderConfig, boolean oneway, boolean forceRegister) { - // 将Topic配置进行包装,其实就是一些默认的topic信息 - TopicConfigSerializeWrapper topicConfigWrapper = - this.getTopicConfigManager().buildTopicConfigSerializeWrapper(); - - // 如果Broker只有读权限或者写权限,那么需要将Topic的权限设置为和Broker相同 - if (!PermName.isWriteable(this.getBrokerConfig().getBrokerPermission()) - || !PermName.isReadable(this.getBrokerConfig().getBrokerPermission())) { - ConcurrentHashMap topicConfigTable = new ConcurrentHashMap<>(); - for (TopicConfig topicConfig : topicConfigWrapper.getTopicConfigTable().values()) { - TopicConfig tmp = - new TopicConfig(topicConfig.getTopicName(), topicConfig.getReadQueueNums(), - topicConfig.getWriteQueueNums(), - this.brokerConfig.getBrokerPermission()); - topicConfigTable.put(topicConfig.getTopicName(), tmp); - } - topicConfigWrapper.setTopicConfigTable(topicConfigTable); - } - - // 判断是否需要注册,如果不满足强制注册,那么就需要调用needRegister来判断是否需要注册 - // needRegister内部逻辑也很简单,就是去请求NameServer,判断NameServer存储的Broker信息 - // 是否和当前的Broker版本信息是否一致,如果是一致的,那么就不需要注册 - if (forceRegister || needRegister(this.brokerConfig.getBrokerClusterName(), - this.getBrokerAddr(), - this.brokerConfig.getBrokerName(), - this.brokerConfig.getBrokerId(), - this.brokerConfig.getRegisterBrokerTimeoutMills())) { - // Broker向NameServer注册的主要方法 - doRegisterBrokerAll(checkOrderConfig, oneway, topicConfigWrapper); - } -} -``` -在doRegisterBrokerAll方法内,最主要的就是调用brokerOuterAPI的registerBrokerAll接口来向NameServer进行注册。 -```java -List registerBrokerResultList = this.brokerOuterAPI.registerBrokerAll( - this.brokerConfig.getBrokerClusterName(), - this.getBrokerAddr(), - this.brokerConfig.getBrokerName(), - this.brokerConfig.getBrokerId(), - this.getHAServerAddr(), - topicConfigWrapper, - this.filterServerManager.buildNewFilterServerList(), - oneway, - this.brokerConfig.getRegisterBrokerTimeoutMills(), - this.brokerConfig.isCompressedRegister()); -``` -接下来的操作就是遍历每一个NameServer服务地址,然后分别向每一个NameServer进行注册操作,具体代码如下所示: -```java -public List registerBrokerAll( - final String clusterName, - final String brokerAddr, - final String brokerName, - final long brokerId, - final String haServerAddr, - final TopicConfigSerializeWrapper topicConfigWrapper, - final List filterServerList, - final boolean oneway, - final int timeoutMills, - final boolean compressed) { - - // 封装注册结果的容器 - final List registerBrokerResultList = Lists.newArrayList(); - // 获取NameServer列表 - List nameServerAddressList = this.remotingClient.getNameServerAddressList(); - if (nameServerAddressList != null && !nameServerAddressList.isEmpty()) { - // 构建注册Broker的请求头对象 - final RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader(); - // 将Broker的主要元信息存储到请求头中 - requestHeader.setBrokerAddr(brokerAddr); - requestHeader.setBrokerId(brokerId); - requestHeader.setBrokerName(brokerName); - requestHeader.setClusterName(clusterName); - requestHeader.setHaServerAddr(haServerAddr); - requestHeader.setCompressed(compressed); - - // 构建请求体 - RegisterBrokerBody requestBody = new RegisterBrokerBody(); - // 将topic配置信息及过滤器服务信息数据封装到请求体中 - requestBody.setTopicConfigSerializeWrapper(topicConfigWrapper); - requestBody.setFilterServerList(filterServerList); - // 将请求体进行编码(是否进行gzip压缩,默认为false) - final byte[] body = requestBody.encode(compressed); - final int bodyCrc32 = UtilAll.crc32(body); - requestHeader.setBodyCrc32(bodyCrc32); - final CountDownLatch countDownLatch = new CountDownLatch(nameServerAddressList.size()); - // 遍历所有的NameServer地址,分别向每一个NameServer进行注册 - for (final String namesrvAddr : nameServerAddressList) { - brokerOuterExecutor.execute(() -> { - try { - RegisterBrokerResult result = - registerBroker(namesrvAddr, oneway, timeoutMills, requestHeader, body); - if (result != null) { - registerBrokerResultList.add(result); - } - - log.info("register broker[{}]to name server {} OK", brokerId, namesrvAddr); - } catch (Exception e) { - log.warn("registerBroker Exception, {}", namesrvAddr, e); - } finally { - countDownLatch.countDown(); - } - }); - } - - try { - countDownLatch.await(timeoutMills, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { - } - } - - return registerBrokerResultList; -} -``` -分别向每一个NameServer注册时候,调用的都是同一个方法:registerBroker,底层调用的都是由Netty封装的远程连接,通过请求码来获取远程调用连接,将注册信息发送过去。注册Broker使用到的请求码是`RequestCode.REGISTER_BROKER`,不同的需求使用的请求码是不一样的,比如注销Broker使用到的是`RequestCode.UNREGISTER_BROKER`。 -```java -private RegisterBrokerResult registerBroker( - final String namesrvAddr, - final boolean oneway, - final int timeoutMills, - final RegisterBrokerRequestHeader requestHeader, - final byte[] body -) throws RemotingCommandException, MQBrokerException, RemotingConnectException, RemotingSendRequestException, - RemotingTimeoutException, - InterruptedException { - // 根据请求码RequestCode.REGISTER_BROKER获取注册Broker信息的远程连接 - RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.REGISTER_BROKER, requestHeader); - request.setBody(body); - - // 如果是单向消息,也就是不管注册结果如何,那么就调用不同的方法来进行注册 - if (oneway) { - try { - this.remotingClient.invokeOneway(namesrvAddr, request, timeoutMills); - } catch (RemotingTooMuchRequestException e) { - // Ignore - } - return null; - } - - // 同步注册,也就是阻塞等待注册结果 - RemotingCommand response = this.remotingClient.invokeSync(namesrvAddr, request, timeoutMills); - assert response != null; - switch (response.getCode()) { - case ResponseCode.SUCCESS: { - // 解析注册结果 - RegisterBrokerResponseHeader responseHeader = - (RegisterBrokerResponseHeader) response - .decodeCommandCustomHeader(RegisterBrokerResponseHeader.class); - RegisterBrokerResult result = new RegisterBrokerResult(); - result.setMasterAddr(responseHeader.getMasterAddr()); - result.setHaServerAddr(responseHeader.getHaServerAddr()); - if (response.getBody() != null) { - result.setKvTable(KVTable.decode(response.getBody(), KVTable.class)); - } - return result; - } - default: - break; - } - - throw new MQBrokerException(response.getCode(), response.getRemark()); -} -``` -再往底层分析就是涉及到Netty的知识了,本文主要围绕RocketMQ来进行源码分析,对于Netty,后续将通过其他的文章来讨论。以上内容就是Broker在启动的过程中向指定的NameServer注册元信息的流程分析。 - -Broker向指定的NameServer发送了心跳,NameServer接收到心跳后是如何处理的呢?本节中第一小节路由信息管理器中阐述了Broker发送过来的心跳数据是以何种形式存储在路由管理器中,接下来将解析路由信息维护的源代码,方便大家弄清楚其中的原理。 - -NameServer在初始化的时候,注册了一个处理器DefaultRequestProcessor,专门用于处理网络请求,已经没有印象的读者可以去文章的开始处看NamesrvController的initialize方法。当远程的注册请求到达的时候,都会由DefaultRequestProcessor的processRequest方法来进行处理,该方法其实就是起到了路由的作用,内部根据请求码来判断该调用哪个API来进行具体的操作,对于Broker注册元信息,其实就是转发给RouteInfoManager的registerBroker方法来进行处理的。 -```java -/** - * 注册Broker - * - * @param clusterName broker集群名称,来自broker.conf中配置的属性brokerClusterName的值 - * @param brokerAddr broker地址 - * @param brokerName broker名称,来自broker.conf中配置的属性brokerName的值 - * @param brokerId broker ID,来自broker.conf中配置的属性brokerId的值 - * @param haServerAddr ha server地址 - * @param topicConfigWrapper topic配置包装类对象 - * @param filterServerList filter server列表 - * @param channel netty channel - * @return RegisterBrokerResult 注册Broker结果 - */ -public RegisterBrokerResult registerBroker( - final String clusterName, - final String brokerAddr, - final String brokerName, - final long brokerId, - final String haServerAddr, - final TopicConfigSerializeWrapper topicConfigWrapper, - final List filterServerList, - final Channel channel) { - // 封装注册Broker的结果实体类 - RegisterBrokerResult result = new RegisterBrokerResult(); - try { - try { - // 第一步:获取一个写锁,防止并发修改路由表中的数据导致异常 - this.lock.writeLock().lockInterruptibly(); - - // 第二步:维护集群与BrokerName的路由表(关系表) - // 如果clusterAddrTable中集群名对应的brokerName集合存在,那么就直接存入,否则创建一个新的HashSet后存入 - Set brokerNames = this.clusterAddrTable.computeIfAbsent(clusterName, k -> new HashSet<>()); - brokerNames.add(brokerName); - - // 标记是否为第一次注册为false - boolean registerFirst = false; - - // 第三步:维护brokerName和brokerData的路由表(关系表) - // 根据brokerName来获取brokerData数据,如果brokerData不存在,那么可认为该Broker这是第一次注册 - BrokerData brokerData = this.brokerAddrTable.get(brokerName); - if (null == brokerData) { - registerFirst = true; - brokerData = new BrokerData(clusterName, brokerName, new HashMap<>()); - this.brokerAddrTable.put(brokerName, brokerData); - } - // 下面的这段代码其实我个人更加愿意将其使用代码块封装起来,其作用就是如果注册的Broker的ID发生了变化, - // 那么将原有注册的brokerAddr删除,再重新将新的信息存入到brokerData中的brokerAddrs - // 具体的可看下面的英文描述,也就是切换slave的broker为master的操作 - Map brokerAddrsMap = brokerData.getBrokerAddrs(); - //Switch slave to master: first remove <1, IP:PORT> in namesrv, then add <0, IP:PORT> - //The same IP:PORT must only have one record in brokerAddrTable - brokerAddrsMap.entrySet().removeIf( - item -> null != brokerAddr && brokerAddr.equals(item.getValue()) && brokerId != item.getKey()); - - // 将broker信息存入到brokerData的表brokerAddrs中 - String oldAddr = brokerData.getBrokerAddrs().put(brokerId, brokerAddr); - // 如果返回的oldAddr为null,则说明新存入的,表brokerAddrs不存在键为brokerId的数据,这种也认为是第一次注册 - registerFirst = registerFirst || (null == oldAddr); - - // 第四步:判断是否需要更新topicConfig信息,只有主Broker注册的时候(topicConfigWrapper始终不为空)才会去进一步判断 - if (null != topicConfigWrapper - && MixAll.MASTER_ID == brokerId) { - // 如果是第一次注册,或者topicConfig的版本发生了变化,那么就需要更新 - // 第一次注册,其实带来的topic都是一些默认的topic信息,当生产者发送主题的时候,如果主题没有创建,且 - // brokerConfig中的字段autoCreateTopicEnable为true的时候,那么将返回默认的主题路由信息 - if (this.isBrokerTopicConfigChanged(brokerAddr, topicConfigWrapper.getDataVersion()) - || registerFirst) { - ConcurrentMap tcTable = - topicConfigWrapper.getTopicConfigTable(); - if (tcTable != null) { - for (Map.Entry entry : tcTable.entrySet()) { - // 第五步:维护topicQueueTable路由表,没有则创建QueueData,否则根据需要来更新 - this.createAndUpdateQueueData(brokerName, entry.getValue()); - } - } - } - } - - // 第六步:维护brokerLiveTable路由表,将broker的信息存入到表中 - BrokerLiveInfo prevBrokerLiveInfo = this.brokerLiveTable.put(brokerAddr, - new BrokerLiveInfo( - System.currentTimeMillis(), - topicConfigWrapper.getDataVersion(), - channel, - haServerAddr)); - // 如果返回的为null,则认为是将新的broker注册到表中 - if (null == prevBrokerLiveInfo) { - log.info("new broker registered, {} HAServer: {}", brokerAddr, haServerAddr); - } - - // 第七步:维护filterServerTable,这一块内容后续分析 - if (filterServerList != null) { - if (filterServerList.isEmpty()) { - this.filterServerTable.remove(brokerAddr); - } else { - this.filterServerTable.put(brokerAddr, filterServerList); - } - } - - // 第八步:如果是非master的broker注册,还需要将master的信息返回给broker端 - if (MixAll.MASTER_ID != brokerId) { - String masterAddr = brokerData.getBrokerAddrs().get(MixAll.MASTER_ID); - if (masterAddr != null) { - BrokerLiveInfo brokerLiveInfo = this.brokerLiveTable.get(masterAddr); - if (brokerLiveInfo != null) { - result.setHaServerAddr(brokerLiveInfo.getHaServerAddr()); - result.setMasterAddr(masterAddr); - } - } - } - } finally { - // 第九步:释放写锁 - this.lock.writeLock().unlock(); - } - } catch (Exception e) { - log.error("registerBroker Exception", e); - } - - return result; -} -``` -以上的代码就是NameServer接收到Broker注册信息后维护路由表的代码,逻辑清晰明了,简单,设计中加入了写锁,保证了并发情况下的线程安全。读者直接阅读上述的代码注释就可以明白路由信息维护的流程及原理。 -### 3.3 路由信息剔除 - -接下来我们继续一起探讨一下路由信息剔除的原理。在『3.2 路由信息注册』小节中,我们已经分析了部分路由信息剔除的原理:每个Broker会每隔30秒向NameServer发送心跳,NameServer接收到Broker心跳数据后,会去实时更新brokerLiveTable中BrokerLiveInfo的lastUpdateTimestamp字段(上一次心跳时间戳),当然,NameServer也有检查机制,会每隔10秒扫描brokerLiveTable,如果发现某个Broker的lastUpdateTimestamp字段超过2min没有更新,那么就认为该Broker存在故障,NameServer会主动将其从路由表中剔除,同时关闭通信通道。 -对于RocketMQ来说,剔除路由信息主要有两个方式: - -- 故障剔除:故障剔除就是某个Broker超过2min没有发送心跳给NameServer,那么NameServer就会认为该Broker发生了故障,就会主动将其剔除,并同时更新所有的路由表。 -- 主动注销:Broker正常下线,向NameServer发送注销的请求,那么NameServer就会去实时更新全部路由表。 - -对于故障剔除和主动注销,底层使用到的代码是一样的,区别是前者是NameServer通过定时扫描,定期检查的方式来主动发现的,后者是Broker下线时主动发送注销请求告知NameServer的,在NameServer端处理方式是一样的。 - -**从故障剔除的角度来分析:** -NameServer在初始化的时候注册了一个定时任务,每隔10s扫描一次brokerLiveTable表,超过2min没有更新的Broker将被其剔除。 -```java -// NameServer定时每隔10秒钟扫描一次Broker列表,移除已经处于非激活状态的Broker -this.scheduledExecutorService.scheduleAtFixedRate( - NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, 10, TimeUnit.SECONDS); -``` -这里需要重点关注RouteInfoManager的scanNotActiveBroker方法: -```java -/** - * 扫描brokerLiveTable,将超过2min没有更新的Broker移除 - */ -public void scanNotActiveBroker() { - Iterator> it = this.brokerLiveTable.entrySet().iterator(); - while (it.hasNext()) { - Entry next = it.next(); - long last = next.getValue().getLastUpdateTimestamp(); - // 上一次更新时间戳+120s小于当前时间戳说明Broker已经过期 - if ((last + BROKER_CHANNEL_EXPIRED_TIME) < System.currentTimeMillis()) { - // 关闭通信通道 - RemotingUtil.closeChannel(next.getValue().getChannel()); - // 剔除broker - it.remove(); - log.warn("The broker channel expired, {} {}ms", next.getKey(), BROKER_CHANNEL_EXPIRED_TIME); - // 维护其他几个路由表 - this.onChannelDestroy(next.getKey(), next.getValue().getChannel()); - } - } -} -``` -当过期后,NameServer将Broker从brokerLiveTable剔除,并关闭了通信通道,其他路由表的维护则依赖onChannelDestroy方法。 -```java -/** - * 移除topicQueueTable brokerAddrTable clusterAddrTable中关于制定Broker的路由信息 - * - * @param remoteAddr Broker的地址 - * @param channel 通信通道 - */ -public void onChannelDestroy(String remoteAddr, Channel channel) { - String brokerAddrFound = null; - // 该方法不仅仅是在清理路由表的信息的时候调用,NameServer在定期检查长连接的时候也会去调用 - // 所以下面的这个if代码块是在定期检查长连接的时候用到 - if (channel != null) { - try { - try { - this.lock.readLock().lockInterruptibly(); - Iterator> itBrokerLiveTable = - this.brokerLiveTable.entrySet().iterator(); - while (itBrokerLiveTable.hasNext()) { - Entry entry = itBrokerLiveTable.next(); - if (entry.getValue().getChannel() == channel) { - brokerAddrFound = entry.getKey(); - break; - } - } - } finally { - this.lock.readLock().unlock(); - } - } catch (Exception e) { - log.error("onChannelDestroy Exception", e); - } - } - - // 如果brokerAddrFound为null,那么说明brokerLiveTable已经不存在指定的Broker信息了 - if (null == brokerAddrFound) { - brokerAddrFound = remoteAddr; - } else { - log.info("the broker's channel destroyed, {}, clean it's data structure at once", brokerAddrFound); - } - - if (brokerAddrFound != null && brokerAddrFound.length() > 0) { - - try { - try { - // 正式清理路由表信息 - // 第一步:获取写锁,防止并发异常 - this.lock.writeLock().lockInterruptibly(); - // 第二步:根据brokerAddr,移除路由表brokerLiveTable和filterServerTable中指定的Broker信息 - this.brokerLiveTable.remove(brokerAddrFound); - this.filterServerTable.remove(brokerAddrFound); - String brokerNameFound = null; - boolean removeBrokerName = false; - // 第三步:开始清理brokerAddrTable中关于指定brokerAddr的信息 - // 如果brokerName对应的BrokerData中没有Broker的信息,也就是BrokerData中的Map的brokerAddrs - // 为空,那么也要移除该brokerName对应的信息 - Iterator> itBrokerAddrTable = - this.brokerAddrTable.entrySet().iterator(); - while (itBrokerAddrTable.hasNext() && (null == brokerNameFound)) { - BrokerData brokerData = itBrokerAddrTable.next().getValue(); - - Iterator> it = brokerData.getBrokerAddrs().entrySet().iterator(); - while (it.hasNext()) { - Entry entry = it.next(); - Long brokerId = entry.getKey(); - String brokerAddr = entry.getValue(); - if (brokerAddr.equals(brokerAddrFound)) { - brokerNameFound = brokerData.getBrokerName(); - it.remove(); - log.info("remove brokerAddr[{}, {}] from brokerAddrTable, because channel destroyed", - brokerId, brokerAddr); - break; - } - } - - if (brokerData.getBrokerAddrs().isEmpty()) { - removeBrokerName = true; - itBrokerAddrTable.remove(); - log.info("remove brokerName[{}] from brokerAddrTable, because channel destroyed", - brokerData.getBrokerName()); - } - } - - // 第四步:清理clusterAddrTable中的brokerName信息,如果brokerName对应的没有存活的broker信息 - // 那么就需要在clusterAddrTable移除brokerName的信息 - if (brokerNameFound != null && removeBrokerName) { - Iterator>> it = this.clusterAddrTable.entrySet().iterator(); - while (it.hasNext()) { - Entry> entry = it.next(); - String clusterName = entry.getKey(); - Set brokerNames = entry.getValue(); - boolean removed = brokerNames.remove(brokerNameFound); - if (removed) { - log.info( - "remove brokerName[{}], clusterName[{}] from clusterAddrTable, because " - + "channel destroyed", - brokerNameFound, clusterName); - - if (brokerNames.isEmpty()) { - log.info( - "remove the clusterName[{}] from clusterAddrTable, because channel " - + "destroyed and no broker in this cluster", - clusterName); - it.remove(); - } - - break; - } - } - } - - // 第五步:清理topicQueueTable中对应的QueueData信息,如果brokerName对应的 - // broker都已经被移除,那么就需要清理对应的Queue的信息 - if (removeBrokerName) { - Iterator>> itTopicQueueTable = - this.topicQueueTable.entrySet().iterator(); - while (itTopicQueueTable.hasNext()) { - Entry> entry = itTopicQueueTable.next(); - String topic = entry.getKey(); - List queueDataList = entry.getValue(); - - Iterator itQueueData = queueDataList.iterator(); - while (itQueueData.hasNext()) { - QueueData queueData = itQueueData.next(); - if (queueData.getBrokerName().equals(brokerNameFound)) { - itQueueData.remove(); - log.info("remove topic[{} {}], from topicQueueTable, because channel destroyed", - topic, queueData); - } - } - - if (queueDataList.isEmpty()) { - itTopicQueueTable.remove(); - log.info("remove topic[{}] all queue, from topicQueueTable, because channel destroyed", - topic); - } - } - } - } finally { - // 第六步:必须释放锁资源 - this.lock.writeLock().unlock(); - } - } catch (Exception e) { - log.error("onChannelDestroy Exception", e); - } - } -} -``` -从上面的代码看来逻辑思路还是非常简单明了的,NameServer的设计初衷就是为了让系统更加简单。 - -**从主动注销的角度来分析:** -在Broker正常启动的时候会注册一个shutDown的钩子函数,代码如下所示: -```java -// Broker在启动的时候会注册一个钩子函数,当Broker的进程收到退出进程的信号后会指定该函数 -// 主要是执行controller.shutdown();来关闭资源链接已经清理NameServer中的路由信息等 -Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - private volatile boolean hasShutdown = false; - private final AtomicInteger shutdownTimes = new AtomicInteger(0); - - @Override - public void run() { - synchronized (this) { - log.info("Shutdown hook was invoked, {}", this.shutdownTimes.incrementAndGet()); - if (!this.hasShutdown) { - this.hasShutdown = true; - long beginTime = System.currentTimeMillis(); - controller.shutdown(); - long consumingTimeTotal = System.currentTimeMillis() - beginTime; - log.info("Shutdown hook over, consuming total time(ms): {}", consumingTimeTotal); - } - } - } - }, "ShutdownHook")); -``` -`controller.shutdown();`中会执行`this.unregisterBrokerAll();`方法,主要是去主动注销NameServer中的路由信息,底层调用的还是`brokerOuterAPI.unregisterBrokerAll`的方法: -```java -/** - * 注销NameServer中的路由信息 - * - * @param clusterName 集群名称 - * @param brokerAddr broker地址 - * @param brokerName broker名称 - * @param brokerId broker ID - */ -public void unregisterBrokerAll( - final String clusterName, - final String brokerAddr, - final String brokerName, - final long brokerId -) { - // 获取所有的NameServer列表 - List nameServerAddressList = this.remotingClient.getNameServerAddressList(); - if (nameServerAddressList != null) { - // 遍历NameServer列表并分别注销 - for (String namesrvAddr : nameServerAddressList) { - try { - this.unregisterBroker(namesrvAddr, clusterName, brokerAddr, brokerName, brokerId); - log.info("unregisterBroker OK, NamesrvAddr: {}", namesrvAddr); - } catch (Exception e) { - log.warn("unregisterBroker Exception, {}", namesrvAddr, e); - } - } - } -} -``` -具体的注销逻辑和注册逻辑是类似的,首先构建请求头,将必要信息进行封装,然后根据请求码来获取连接,然后执行连接获取执行结果,具体代码如下所示: -```java -public void unregisterBroker( - final String namesrvAddr, - final String clusterName, - final String brokerAddr, - final String brokerName, - final long brokerId -) throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException, - MQBrokerException { - // 第一步:封装注销Broker的请求头 - UnRegisterBrokerRequestHeader requestHeader = new UnRegisterBrokerRequestHeader(); - requestHeader.setBrokerAddr(brokerAddr); - requestHeader.setBrokerId(brokerId); - requestHeader.setBrokerName(brokerName); - requestHeader.setClusterName(clusterName); - // 第二步:根据请求码来获取连接 - RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.UNREGISTER_BROKER, requestHeader); - - // 第三步:执行连接请求 - RemotingCommand response = this.remotingClient.invokeSync(namesrvAddr, request, 3000); - assert response != null; - // 第四步:分析结果 - switch (response.getCode()) { - case ResponseCode.SUCCESS: { - return; - } - default: - break; - } - - throw new MQBrokerException(response.getCode(), response.getRemark()); -} -``` -这是Broker端主动注销的源码分析,当NameServer接收到注销请求后,会由NameServer的DefaultRequestProcessor根据请求码转发给RouteInfoManager的unregisterBroker方法来进行路由的删除维护操作,就和NameServer定期扫描的在底层使用的方法是一致的了。 - -### 3.4 路由信息发现 - -NameServer在设计之初就考虑将其设计得更加简单,NameServer中的路由信息在发生变化后,并不会主动推送给客户端(包括生产者和消费者),而是需要客户端主动拉取最新的路由信息。具体的请求码是`RequestCode.GET_ROUTEINFO_BY_TOPIC`,请求到达NameServer的DefaultRequestProcessor后,将转发给getRouteInfoByTopic方法来执行,具体的源码如下所示: -```java -/** - * 根据Topic来获取路由信息 - * - * @param ctx 上下文环境 - * @param request 请求内容 - * @return RemotingCommand对象 - * @throws RemotingCommandException 异常 - */ -public RemotingCommand getRouteInfoByTopic(ChannelHandlerContext ctx, - RemotingCommand request) throws RemotingCommandException { - // 封装返回体和解析请求头 - final RemotingCommand response = RemotingCommand.createResponseCommand(null); - final GetRouteInfoRequestHeader requestHeader = - (GetRouteInfoRequestHeader) request.decodeCommandCustomHeader(GetRouteInfoRequestHeader.class); - - // 从RouteInfoManager中获取路由信息,并封装为TopicRouteData对象 - TopicRouteData topicRouteData = - this.namesrvController.getRouteInfoManager().pickupTopicRouteData(requestHeader.getTopic()); - - if (topicRouteData != null) { - // 如果路由信息存在,且该主题配置的是顺序消息,那么就从NameServer的KVconfig中获取顺序消息相关的配置 - if (this.namesrvController.getNamesrvConfig().isOrderMessageEnable()) { - String orderTopicConf = - this.namesrvController.getKvConfigManager() - .getKVConfig(NamesrvUtil.NAMESPACE_ORDER_TOPIC_CONFIG, - requestHeader.getTopic()); - topicRouteData.setOrderTopicConf(orderTopicConf); - } - - // 返回体编码并返回 - byte[] content = topicRouteData.encode(); - response.setBody(content); - response.setCode(ResponseCode.SUCCESS); - response.setRemark(null); - return response; - } - - // 在未找到路由信息的情况下返回如下信息 - response.setCode(ResponseCode.TOPIC_NOT_EXIST); - response.setRemark("No topic route info in name server for the topic: " + requestHeader.getTopic() - + FAQUrl.suggestTodo(FAQUrl.APPLY_TOPIC_URL)); - return response; -} -``` -以上代码中主要的一行代码是: -```java -// 从RouteInfoManager中获取路由信息,并封装为TopicRouteData对象 -TopicRouteData topicRouteData = - this.namesrvController.getRouteInfoManager().pickupTopicRouteData(requestHeader.getTopic()); -``` -底层还是需要从RouteInfoManager获取路由表信息,最后将其封装为TopicRouteData返回给客户端。由于`pickupTopicRouteData`方法简单明了,读者可自行阅读并理解。 - -## 四、文章小结 - -本文从NameServer的启动流程开始分析,一步一步分析到本文的主要内容——路由管理器(RouteInfoManager),主要围绕路由信息的注册、剔除与发现,一步步分析后,我们发现原理其实很简单,RocketMQ就是这么喜人,性能强大的同时,让所有喜欢源码的朋友都能阅读得懂。总结来说就是: - -- Broker在启动的时候向指定的NameServer进行注册,发送自身的元信息到NameServer的路由管理器; -- 路由信息的剔除则有主动注销和异常剔除两种情况,都是将路由信息从路由管理器中删除,NameServer端的底层处理方式都是一致的,只是触发的方式不一样而已,前者是NameServer主动扫描,后者是Broker主动发送注销请求; -- 获取路由信息则由客户端主动拉取,NameServer并不会主动推送。 - -思考:如果某个Broker发生了故障,并没有主动发起注销的请求,那么NameServer最少要等待2min才会得知并进行故障剔除,在这期间,生产者将消息发送到故障的Broker,那么就会造成发送失败,其实这是分布式系统中常见的高可用问题,那么RocketMQ是如何解决这种问题的呢?我们可以带着这个问题进入到下一节的源码分析《[RocketMQ源码之路(三)消息发送源码分析](https://itlemon.blog.csdn.net/article/details/113879541)》,欢迎来撩。 +上述代码都给出了详细的注释说明,每个步骤对应的代码内部也基本给出了注释说明,读者可以根据需要去阅读我注释后的 [源代码](https://github.com/itlemon/rocketmq-5.0.0) 。 了解更多干货,欢迎关注我的微信公众号:爪哇论剑(微信号:itlemon) ![微信公众号-爪哇论剑-itlemon](https://img-blog.csdnimg.cn/20190917130526135.jpeg) \ No newline at end of file diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index 093c008..572e393 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -1,3 +1,892 @@ # 第2节 NameServer的路由管理机制 -![image-20230214233259510](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230214233259510.png) \ No newline at end of file +![image-20230214233259510](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230214233259510.png) + +## 三、NameServer的路由原理 + +文章一开始就提到,NameServer是保证消息正确地从生产者到消费者的“指挥官”,它提供了路由管理,服务注册与服务发现、故障剔除等机制,这些机制的背后原理都都依赖于NameServer的路由,本小节将着重介绍NameServer的路由原理。 + +### 3.1 路由信息管理器 + +NameServer有一个路由信息管理器`RouteInfoManager`,它位于`org.apache.rocketmq.namesrv.routeinfo`包内,其内部存储了topic与broker的各种信息与关系,是RocketMQ实现服务注册与发现、故障剔除的基础。 +RouteInfoManager内部维护了多个HashMap数据结构,用于存储路由信息,具体的内容如下所示: + +```java +/** + * 该Map存储的是Topic消息队列的路由信息,发送具体消息时可根据该Map来进行负载均衡 + */ +private final HashMap> topicQueueTable; + +/** + * Broker的基础信息表,键名是Broker的名称,BrokerData中存储了Broker的名称, + * 所属集群名称以及主Broker和备Broker的地址信息 + */ +private final HashMap brokerAddrTable; + +/** + * 集群与Broker名称的映射表,可以方便知道一个集群下有哪些Broker + */ +private final HashMap> clusterAddrTable; + +/** + * 该Map存储的是每个Broker的存活信息,Name Server每次收到心跳后会将此引用指向最新的表 + */ +private final HashMap brokerLiveTable; + +/** + * 该Map存储的是Broker与Filter Server之间的关系表 + */ +private final HashMap/* Filter Server */> filterServerTable; +``` + +从上面的数据结构看来,维护NameServer的路由信息应该还是很简单的,没有太过于抽象的概念,从数据结构中也能得出以下几个结论: + +- 一个Topic包含多个消息队列,其数据是存储在`topicQueueTable`中。 +- 多个Broker拥有同一个Broker Name,它们之间使用BrokerId来进行区分,在BrokerData内部维护了一个HashMap结构来存储。 +- 一个RocketMQ集群可包含多个名称唯一的Broker。 +- 一个Broker可与多个Filter Server进行绑定。 + +其中QueueData、BrokerData、BrokerLiveInfo分别用于存储队列信息、Broker信息及Broker存活信息等数据,其类图如下所示: + +```mermaid +classDiagram + class QueueData{ + -String brokerName + -int readQueueNums + -int writeQueueNums + -int perm + -int topicSynFlag + } + class BrokerData{ + -String cluster + -String brokerName + -int writeQueueNums + -HashMap brokerAddrs + } + class BrokerLiveInfo{ + -long lastUpdateTimestamp + -DataVersion dataVersion + -Channel channel + -String haServerAddr + } +``` + +QueueData中各个属性含义如下所示: + +- brokerName:当前Queue所属的Broker的名称 +- readQueueNums:读Queue的数量 +- writeQueueNums:写Queue的数量 +- perm:读写权限,{@link org.apache.rocketmq.common.constant.PermName} +- topicSynFlag:topic同步标记,{@link org.apache.rocketmq.common.sysflag.TopicSysFlag} + +BrokerData中各个属性含义如下所示: + +- cluster:所属集群名称 +- brokerName:Broker名称 +- brokerAddrs:主备Broker信息表,键为BrokerID,值为Broker的地址 + +BrokerLiveInfo中各个属性含义如下所示: + +- lastUpdateTimestamp:上一次更新的时间戳,用于判断该Broker是否已经过期 +- dataVersion:Broker信息版本 +- channel:socket通道 +- haServerAddr:haServer的地址,是Slave从Master拉取数据时链接的地址 + +本文开始的第一张图是一个2主2从的RocketMQ集群部署方式,集群中包含2个Master的Broker和2个Slave的Broker,使用BrokerData存储上述部署方式,其表现为以下形式: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) +我们启动一个NameServer服务,并且启动四个Broker服务(分别是BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs),按照上面的图展示的方式来进行部署,一起验证一下RouteInfoManager内部的数据存储的内容。 +在本机IntelliJ IDEA中启动四个Broker,需要为四个Broker分别设置配置文件,我们参考《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,参考Broker的配置方式,分别配置四份,具体的配置文件参考代码中的[配置文件](https://github.com/itlemon/itlemon-rocketmq/tree/master/rocketmq_home),IntelliJ IDEA中的配置面板需要改成如下所示: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213215432215.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) +图中展示红框是设置了一个自定义的命令行参数,支持Broker自定义启动端口(默认是10911,需要在同一机器启动多个Broker服务,最好支持自定义端口设置),这需要修改一下`BrokerStartup`这个类的源码,具体可参考上面BrokerStartup的自定义启动端口的代码,这里给出[github地址](https://github.com/itlemon/itlemon-rocketmq/blob/master/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java),不再在文章中重复赘述了。需要注意的一点是,如果设置的broker-am的启动端口是10911,那么broker-as的不能设置为10912,因为每个每个broker启动后还会占用启动端口的后一个端口。 +我们继续按照顺序分别启动四个Broker服务,最后启动的broker-bs,并且给NameServer的RouteInfoManager中的registerBroker方法加上断点,因为Broker向NameServer发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 + +- topicQueueTable: + ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213231041621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) + 上图中topicQueueTable对应于运行时的数据就是: + +```json +{ + "testCluster": [ + { + "brokerName": "broker-a", + "readQueueNums": 16, + "writeQueueNums": 16, + "perm": 7, + "topicSynFlag": 0 + }, + { + "brokerName": "broker-b", + "readQueueNums": 16, + "writeQueueNums": 16, + "perm": 7, + "topicSynFlag": 0 + } + ] +} +``` + +- brokerAddrTable: + ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213232601362.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) + 上图中brokerAddrTable对应于运行时的数据就是: + +```json +{ + "broker-a": { + "cluster": "testCluster", + "brokerName": "broker-a", + "brokerAddrs": { + "0": "172.20.192.218:10911", + "1": "172.20.192.218:10921" + } + }, + "broker-b": { + "cluster": "testCluster", + "brokerName": "broker-b", + "brokerAddrs": { + "0": "172.20.192.218:10931", + "1": "172.20.192.218:10941" + } + } +} +``` + +- clusterAddrTable: + ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213223306896.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) + 上图中clusterAddrTable对应于运行时的数据就是: + +```json +{ + "testCluster": { + "broker-b": "DEFAULT_OBJECT", + "broker-a": "DEFAULT_OBJECT" + } +} +``` + +这里需要说明一点,HashSet底层的实现结构仍然是HashMap,所以这里使用HashMap的方式来展示HashSet,读者关心Map的键即可。 + +- brokerLiveTable: + ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213233041302.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) + 上图中brokerLiveTable对应于运行时的数据就是: + +```json +{ + "172.20.192.218:10921": { + "lastUpdateTimestamp": 1613230150507, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10922" + }, + "172.20.192.218:10911": { + "lastUpdateTimestamp": 1613230145828, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10912" + }, + "172.20.192.218:10941": { + "lastUpdateTimestamp": 1613230166459, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10942" + }, + "172.20.192.218:10931": { + "lastUpdateTimestamp": 1613230154587, + "dataVersion": "dataVersionObject", + "channel": "channelObject", + "haServerAddr": "172.20.192.218:10932" + } +} +``` + +### 3.2 路由信息注册 + +路由信息注册通常是指,将自身的信息告诉服务注册中心,在RocketMQ中,这里的“自身”是指Broker,而服务注册中心指得就是NameServer。Broker在启动后,会向所有的NameServer注册自身的元信息,通常包括:集群名称(clusterName)、Broker地址(brokerAddr)、Broker名称(brokerName)、Broker ID(brokerId)、高可用地址(haServerAddr)、Topic相关信息(topicConfigWrapper)、过滤服务器列表、通信通道等信息等。这些元信息的注册,都是通过心跳机制来实现的,所谓的心跳机制,一般都是通过定时任务来实现的,按照一定的频率向NameServer发送元信息数据,从而实现续约。每个Broker会每隔30秒向NameServer发送心跳,NameServer接收到Broker心跳数据后,会去实时更新brokerLiveTable中BrokerLiveInfo的lastUpdateTimestamp字段(上一次心跳时间戳),当然,NameServer也有检查机制,会每隔10秒扫描brokerLiveTable,如果发现某个Broker的lastUpdateTimestamp字段超过2min没有更新,那么就认为该Broker存在故障,NameServer会主动将其从路由表中剔除,同时关闭通信通道。 +那么Broker是如何向NameServer进行注册的呢?下面的内容将一一揭秘。 + +从BrokerController的start()方法可以看出,Broker在启动的时候,会注册一个定时任务,每隔30s(默认值,可配置10~60s)向NameServer发送元数据信息。`brokerConfig.getRegisterNameServerPeriod()`的默认值是30s。 + +```java +// 注册一个定时任务,默认每隔30s向NameServer发送元数据信息 +this.scheduledExecutorService.scheduleAtFixedRate(() -> { + try { + BrokerController.this.registerBrokerAll(true, + false, brokerConfig.isForceRegister()); + } catch (Throwable e) { + log.error("registerBrokerAll Exception", e); + } + }, 1000 * 10, Math.max(10000, + Math.min(brokerConfig.getRegisterNameServerPeriod(), 60000)), + TimeUnit.MILLISECONDS); +``` + +具体的注册行为代码需要进入到registerBrokerAll方法中,这里将分析后的registerBrokerAll方法贴在下面: + +```java +/** + * 注册Broker元信息到NameServer列表中 + * + * @param checkOrderConfig 是否检查顺序消息配置 + * @param oneway 是否是单向消息,如果是,那么就不需要知道注册结果,不同于同步和异步消息 + * @param forceRegister 是否是强制注册 + */ +public synchronized void registerBrokerAll(final boolean checkOrderConfig, boolean oneway, boolean forceRegister) { + // 将Topic配置进行包装,其实就是一些默认的topic信息 + TopicConfigSerializeWrapper topicConfigWrapper = + this.getTopicConfigManager().buildTopicConfigSerializeWrapper(); + + // 如果Broker只有读权限或者写权限,那么需要将Topic的权限设置为和Broker相同 + if (!PermName.isWriteable(this.getBrokerConfig().getBrokerPermission()) + || !PermName.isReadable(this.getBrokerConfig().getBrokerPermission())) { + ConcurrentHashMap topicConfigTable = new ConcurrentHashMap<>(); + for (TopicConfig topicConfig : topicConfigWrapper.getTopicConfigTable().values()) { + TopicConfig tmp = + new TopicConfig(topicConfig.getTopicName(), topicConfig.getReadQueueNums(), + topicConfig.getWriteQueueNums(), + this.brokerConfig.getBrokerPermission()); + topicConfigTable.put(topicConfig.getTopicName(), tmp); + } + topicConfigWrapper.setTopicConfigTable(topicConfigTable); + } + + // 判断是否需要注册,如果不满足强制注册,那么就需要调用needRegister来判断是否需要注册 + // needRegister内部逻辑也很简单,就是去请求NameServer,判断NameServer存储的Broker信息 + // 是否和当前的Broker版本信息是否一致,如果是一致的,那么就不需要注册 + if (forceRegister || needRegister(this.brokerConfig.getBrokerClusterName(), + this.getBrokerAddr(), + this.brokerConfig.getBrokerName(), + this.brokerConfig.getBrokerId(), + this.brokerConfig.getRegisterBrokerTimeoutMills())) { + // Broker向NameServer注册的主要方法 + doRegisterBrokerAll(checkOrderConfig, oneway, topicConfigWrapper); + } +} +``` + +在doRegisterBrokerAll方法内,最主要的就是调用brokerOuterAPI的registerBrokerAll接口来向NameServer进行注册。 + +```java +List registerBrokerResultList = this.brokerOuterAPI.registerBrokerAll( + this.brokerConfig.getBrokerClusterName(), + this.getBrokerAddr(), + this.brokerConfig.getBrokerName(), + this.brokerConfig.getBrokerId(), + this.getHAServerAddr(), + topicConfigWrapper, + this.filterServerManager.buildNewFilterServerList(), + oneway, + this.brokerConfig.getRegisterBrokerTimeoutMills(), + this.brokerConfig.isCompressedRegister()); +``` + +接下来的操作就是遍历每一个NameServer服务地址,然后分别向每一个NameServer进行注册操作,具体代码如下所示: + +```java +public List registerBrokerAll( + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId, + final String haServerAddr, + final TopicConfigSerializeWrapper topicConfigWrapper, + final List filterServerList, + final boolean oneway, + final int timeoutMills, + final boolean compressed) { + + // 封装注册结果的容器 + final List registerBrokerResultList = Lists.newArrayList(); + // 获取NameServer列表 + List nameServerAddressList = this.remotingClient.getNameServerAddressList(); + if (nameServerAddressList != null && !nameServerAddressList.isEmpty()) { + // 构建注册Broker的请求头对象 + final RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader(); + // 将Broker的主要元信息存储到请求头中 + requestHeader.setBrokerAddr(brokerAddr); + requestHeader.setBrokerId(brokerId); + requestHeader.setBrokerName(brokerName); + requestHeader.setClusterName(clusterName); + requestHeader.setHaServerAddr(haServerAddr); + requestHeader.setCompressed(compressed); + + // 构建请求体 + RegisterBrokerBody requestBody = new RegisterBrokerBody(); + // 将topic配置信息及过滤器服务信息数据封装到请求体中 + requestBody.setTopicConfigSerializeWrapper(topicConfigWrapper); + requestBody.setFilterServerList(filterServerList); + // 将请求体进行编码(是否进行gzip压缩,默认为false) + final byte[] body = requestBody.encode(compressed); + final int bodyCrc32 = UtilAll.crc32(body); + requestHeader.setBodyCrc32(bodyCrc32); + final CountDownLatch countDownLatch = new CountDownLatch(nameServerAddressList.size()); + // 遍历所有的NameServer地址,分别向每一个NameServer进行注册 + for (final String namesrvAddr : nameServerAddressList) { + brokerOuterExecutor.execute(() -> { + try { + RegisterBrokerResult result = + registerBroker(namesrvAddr, oneway, timeoutMills, requestHeader, body); + if (result != null) { + registerBrokerResultList.add(result); + } + + log.info("register broker[{}]to name server {} OK", brokerId, namesrvAddr); + } catch (Exception e) { + log.warn("registerBroker Exception, {}", namesrvAddr, e); + } finally { + countDownLatch.countDown(); + } + }); + } + + try { + countDownLatch.await(timeoutMills, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + } + } + + return registerBrokerResultList; +} +``` + +分别向每一个NameServer注册时候,调用的都是同一个方法:registerBroker,底层调用的都是由Netty封装的远程连接,通过请求码来获取远程调用连接,将注册信息发送过去。注册Broker使用到的请求码是`RequestCode.REGISTER_BROKER`,不同的需求使用的请求码是不一样的,比如注销Broker使用到的是`RequestCode.UNREGISTER_BROKER`。 + +```java +private RegisterBrokerResult registerBroker( + final String namesrvAddr, + final boolean oneway, + final int timeoutMills, + final RegisterBrokerRequestHeader requestHeader, + final byte[] body +) throws RemotingCommandException, MQBrokerException, RemotingConnectException, RemotingSendRequestException, + RemotingTimeoutException, + InterruptedException { + // 根据请求码RequestCode.REGISTER_BROKER获取注册Broker信息的远程连接 + RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.REGISTER_BROKER, requestHeader); + request.setBody(body); + + // 如果是单向消息,也就是不管注册结果如何,那么就调用不同的方法来进行注册 + if (oneway) { + try { + this.remotingClient.invokeOneway(namesrvAddr, request, timeoutMills); + } catch (RemotingTooMuchRequestException e) { + // Ignore + } + return null; + } + + // 同步注册,也就是阻塞等待注册结果 + RemotingCommand response = this.remotingClient.invokeSync(namesrvAddr, request, timeoutMills); + assert response != null; + switch (response.getCode()) { + case ResponseCode.SUCCESS: { + // 解析注册结果 + RegisterBrokerResponseHeader responseHeader = + (RegisterBrokerResponseHeader) response + .decodeCommandCustomHeader(RegisterBrokerResponseHeader.class); + RegisterBrokerResult result = new RegisterBrokerResult(); + result.setMasterAddr(responseHeader.getMasterAddr()); + result.setHaServerAddr(responseHeader.getHaServerAddr()); + if (response.getBody() != null) { + result.setKvTable(KVTable.decode(response.getBody(), KVTable.class)); + } + return result; + } + default: + break; + } + + throw new MQBrokerException(response.getCode(), response.getRemark()); +} +``` + +再往底层分析就是涉及到Netty的知识了,本文主要围绕RocketMQ来进行源码分析,对于Netty,后续将通过其他的文章来讨论。以上内容就是Broker在启动的过程中向指定的NameServer注册元信息的流程分析。 + +Broker向指定的NameServer发送了心跳,NameServer接收到心跳后是如何处理的呢?本节中第一小节路由信息管理器中阐述了Broker发送过来的心跳数据是以何种形式存储在路由管理器中,接下来将解析路由信息维护的源代码,方便大家弄清楚其中的原理。 + +NameServer在初始化的时候,注册了一个处理器DefaultRequestProcessor,专门用于处理网络请求,已经没有印象的读者可以去文章的开始处看NamesrvController的initialize方法。当远程的注册请求到达的时候,都会由DefaultRequestProcessor的processRequest方法来进行处理,该方法其实就是起到了路由的作用,内部根据请求码来判断该调用哪个API来进行具体的操作,对于Broker注册元信息,其实就是转发给RouteInfoManager的registerBroker方法来进行处理的。 + +```java +/** + * 注册Broker + * + * @param clusterName broker集群名称,来自broker.conf中配置的属性brokerClusterName的值 + * @param brokerAddr broker地址 + * @param brokerName broker名称,来自broker.conf中配置的属性brokerName的值 + * @param brokerId broker ID,来自broker.conf中配置的属性brokerId的值 + * @param haServerAddr ha server地址 + * @param topicConfigWrapper topic配置包装类对象 + * @param filterServerList filter server列表 + * @param channel netty channel + * @return RegisterBrokerResult 注册Broker结果 + */ +public RegisterBrokerResult registerBroker( + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId, + final String haServerAddr, + final TopicConfigSerializeWrapper topicConfigWrapper, + final List filterServerList, + final Channel channel) { + // 封装注册Broker的结果实体类 + RegisterBrokerResult result = new RegisterBrokerResult(); + try { + try { + // 第一步:获取一个写锁,防止并发修改路由表中的数据导致异常 + this.lock.writeLock().lockInterruptibly(); + + // 第二步:维护集群与BrokerName的路由表(关系表) + // 如果clusterAddrTable中集群名对应的brokerName集合存在,那么就直接存入,否则创建一个新的HashSet后存入 + Set brokerNames = this.clusterAddrTable.computeIfAbsent(clusterName, k -> new HashSet<>()); + brokerNames.add(brokerName); + + // 标记是否为第一次注册为false + boolean registerFirst = false; + + // 第三步:维护brokerName和brokerData的路由表(关系表) + // 根据brokerName来获取brokerData数据,如果brokerData不存在,那么可认为该Broker这是第一次注册 + BrokerData brokerData = this.brokerAddrTable.get(brokerName); + if (null == brokerData) { + registerFirst = true; + brokerData = new BrokerData(clusterName, brokerName, new HashMap<>()); + this.brokerAddrTable.put(brokerName, brokerData); + } + // 下面的这段代码其实我个人更加愿意将其使用代码块封装起来,其作用就是如果注册的Broker的ID发生了变化, + // 那么将原有注册的brokerAddr删除,再重新将新的信息存入到brokerData中的brokerAddrs + // 具体的可看下面的英文描述,也就是切换slave的broker为master的操作 + Map brokerAddrsMap = brokerData.getBrokerAddrs(); + //Switch slave to master: first remove <1, IP:PORT> in namesrv, then add <0, IP:PORT> + //The same IP:PORT must only have one record in brokerAddrTable + brokerAddrsMap.entrySet().removeIf( + item -> null != brokerAddr && brokerAddr.equals(item.getValue()) && brokerId != item.getKey()); + + // 将broker信息存入到brokerData的表brokerAddrs中 + String oldAddr = brokerData.getBrokerAddrs().put(brokerId, brokerAddr); + // 如果返回的oldAddr为null,则说明新存入的,表brokerAddrs不存在键为brokerId的数据,这种也认为是第一次注册 + registerFirst = registerFirst || (null == oldAddr); + + // 第四步:判断是否需要更新topicConfig信息,只有主Broker注册的时候(topicConfigWrapper始终不为空)才会去进一步判断 + if (null != topicConfigWrapper + && MixAll.MASTER_ID == brokerId) { + // 如果是第一次注册,或者topicConfig的版本发生了变化,那么就需要更新 + // 第一次注册,其实带来的topic都是一些默认的topic信息,当生产者发送主题的时候,如果主题没有创建,且 + // brokerConfig中的字段autoCreateTopicEnable为true的时候,那么将返回默认的主题路由信息 + if (this.isBrokerTopicConfigChanged(brokerAddr, topicConfigWrapper.getDataVersion()) + || registerFirst) { + ConcurrentMap tcTable = + topicConfigWrapper.getTopicConfigTable(); + if (tcTable != null) { + for (Map.Entry entry : tcTable.entrySet()) { + // 第五步:维护topicQueueTable路由表,没有则创建QueueData,否则根据需要来更新 + this.createAndUpdateQueueData(brokerName, entry.getValue()); + } + } + } + } + + // 第六步:维护brokerLiveTable路由表,将broker的信息存入到表中 + BrokerLiveInfo prevBrokerLiveInfo = this.brokerLiveTable.put(brokerAddr, + new BrokerLiveInfo( + System.currentTimeMillis(), + topicConfigWrapper.getDataVersion(), + channel, + haServerAddr)); + // 如果返回的为null,则认为是将新的broker注册到表中 + if (null == prevBrokerLiveInfo) { + log.info("new broker registered, {} HAServer: {}", brokerAddr, haServerAddr); + } + + // 第七步:维护filterServerTable,这一块内容后续分析 + if (filterServerList != null) { + if (filterServerList.isEmpty()) { + this.filterServerTable.remove(brokerAddr); + } else { + this.filterServerTable.put(brokerAddr, filterServerList); + } + } + + // 第八步:如果是非master的broker注册,还需要将master的信息返回给broker端 + if (MixAll.MASTER_ID != brokerId) { + String masterAddr = brokerData.getBrokerAddrs().get(MixAll.MASTER_ID); + if (masterAddr != null) { + BrokerLiveInfo brokerLiveInfo = this.brokerLiveTable.get(masterAddr); + if (brokerLiveInfo != null) { + result.setHaServerAddr(brokerLiveInfo.getHaServerAddr()); + result.setMasterAddr(masterAddr); + } + } + } + } finally { + // 第九步:释放写锁 + this.lock.writeLock().unlock(); + } + } catch (Exception e) { + log.error("registerBroker Exception", e); + } + + return result; +} +``` + +以上的代码就是NameServer接收到Broker注册信息后维护路由表的代码,逻辑清晰明了,简单,设计中加入了写锁,保证了并发情况下的线程安全。读者直接阅读上述的代码注释就可以明白路由信息维护的流程及原理。 + +### 3.3 路由信息剔除 + +接下来我们继续一起探讨一下路由信息剔除的原理。在『3.2 路由信息注册』小节中,我们已经分析了部分路由信息剔除的原理:每个Broker会每隔30秒向NameServer发送心跳,NameServer接收到Broker心跳数据后,会去实时更新brokerLiveTable中BrokerLiveInfo的lastUpdateTimestamp字段(上一次心跳时间戳),当然,NameServer也有检查机制,会每隔10秒扫描brokerLiveTable,如果发现某个Broker的lastUpdateTimestamp字段超过2min没有更新,那么就认为该Broker存在故障,NameServer会主动将其从路由表中剔除,同时关闭通信通道。 +对于RocketMQ来说,剔除路由信息主要有两个方式: + +- 故障剔除:故障剔除就是某个Broker超过2min没有发送心跳给NameServer,那么NameServer就会认为该Broker发生了故障,就会主动将其剔除,并同时更新所有的路由表。 +- 主动注销:Broker正常下线,向NameServer发送注销的请求,那么NameServer就会去实时更新全部路由表。 + +对于故障剔除和主动注销,底层使用到的代码是一样的,区别是前者是NameServer通过定时扫描,定期检查的方式来主动发现的,后者是Broker下线时主动发送注销请求告知NameServer的,在NameServer端处理方式是一样的。 + +**从故障剔除的角度来分析:** +NameServer在初始化的时候注册了一个定时任务,每隔10s扫描一次brokerLiveTable表,超过2min没有更新的Broker将被其剔除。 + +```java +// NameServer定时每隔10秒钟扫描一次Broker列表,移除已经处于非激活状态的Broker +this.scheduledExecutorService.scheduleAtFixedRate( + NamesrvController.this.routeInfoManager::scanNotActiveBroker, 5, 10, TimeUnit.SECONDS); +``` + +这里需要重点关注RouteInfoManager的scanNotActiveBroker方法: + +```java +/** + * 扫描brokerLiveTable,将超过2min没有更新的Broker移除 + */ +public void scanNotActiveBroker() { + Iterator> it = this.brokerLiveTable.entrySet().iterator(); + while (it.hasNext()) { + Entry next = it.next(); + long last = next.getValue().getLastUpdateTimestamp(); + // 上一次更新时间戳+120s小于当前时间戳说明Broker已经过期 + if ((last + BROKER_CHANNEL_EXPIRED_TIME) < System.currentTimeMillis()) { + // 关闭通信通道 + RemotingUtil.closeChannel(next.getValue().getChannel()); + // 剔除broker + it.remove(); + log.warn("The broker channel expired, {} {}ms", next.getKey(), BROKER_CHANNEL_EXPIRED_TIME); + // 维护其他几个路由表 + this.onChannelDestroy(next.getKey(), next.getValue().getChannel()); + } + } +} +``` + +当过期后,NameServer将Broker从brokerLiveTable剔除,并关闭了通信通道,其他路由表的维护则依赖onChannelDestroy方法。 + +```java +/** + * 移除topicQueueTable brokerAddrTable clusterAddrTable中关于制定Broker的路由信息 + * + * @param remoteAddr Broker的地址 + * @param channel 通信通道 + */ +public void onChannelDestroy(String remoteAddr, Channel channel) { + String brokerAddrFound = null; + // 该方法不仅仅是在清理路由表的信息的时候调用,NameServer在定期检查长连接的时候也会去调用 + // 所以下面的这个if代码块是在定期检查长连接的时候用到 + if (channel != null) { + try { + try { + this.lock.readLock().lockInterruptibly(); + Iterator> itBrokerLiveTable = + this.brokerLiveTable.entrySet().iterator(); + while (itBrokerLiveTable.hasNext()) { + Entry entry = itBrokerLiveTable.next(); + if (entry.getValue().getChannel() == channel) { + brokerAddrFound = entry.getKey(); + break; + } + } + } finally { + this.lock.readLock().unlock(); + } + } catch (Exception e) { + log.error("onChannelDestroy Exception", e); + } + } + + // 如果brokerAddrFound为null,那么说明brokerLiveTable已经不存在指定的Broker信息了 + if (null == brokerAddrFound) { + brokerAddrFound = remoteAddr; + } else { + log.info("the broker's channel destroyed, {}, clean it's data structure at once", brokerAddrFound); + } + + if (brokerAddrFound != null && brokerAddrFound.length() > 0) { + + try { + try { + // 正式清理路由表信息 + // 第一步:获取写锁,防止并发异常 + this.lock.writeLock().lockInterruptibly(); + // 第二步:根据brokerAddr,移除路由表brokerLiveTable和filterServerTable中指定的Broker信息 + this.brokerLiveTable.remove(brokerAddrFound); + this.filterServerTable.remove(brokerAddrFound); + String brokerNameFound = null; + boolean removeBrokerName = false; + // 第三步:开始清理brokerAddrTable中关于指定brokerAddr的信息 + // 如果brokerName对应的BrokerData中没有Broker的信息,也就是BrokerData中的Map的brokerAddrs + // 为空,那么也要移除该brokerName对应的信息 + Iterator> itBrokerAddrTable = + this.brokerAddrTable.entrySet().iterator(); + while (itBrokerAddrTable.hasNext() && (null == brokerNameFound)) { + BrokerData brokerData = itBrokerAddrTable.next().getValue(); + + Iterator> it = brokerData.getBrokerAddrs().entrySet().iterator(); + while (it.hasNext()) { + Entry entry = it.next(); + Long brokerId = entry.getKey(); + String brokerAddr = entry.getValue(); + if (brokerAddr.equals(brokerAddrFound)) { + brokerNameFound = brokerData.getBrokerName(); + it.remove(); + log.info("remove brokerAddr[{}, {}] from brokerAddrTable, because channel destroyed", + brokerId, brokerAddr); + break; + } + } + + if (brokerData.getBrokerAddrs().isEmpty()) { + removeBrokerName = true; + itBrokerAddrTable.remove(); + log.info("remove brokerName[{}] from brokerAddrTable, because channel destroyed", + brokerData.getBrokerName()); + } + } + + // 第四步:清理clusterAddrTable中的brokerName信息,如果brokerName对应的没有存活的broker信息 + // 那么就需要在clusterAddrTable移除brokerName的信息 + if (brokerNameFound != null && removeBrokerName) { + Iterator>> it = this.clusterAddrTable.entrySet().iterator(); + while (it.hasNext()) { + Entry> entry = it.next(); + String clusterName = entry.getKey(); + Set brokerNames = entry.getValue(); + boolean removed = brokerNames.remove(brokerNameFound); + if (removed) { + log.info( + "remove brokerName[{}], clusterName[{}] from clusterAddrTable, because " + + "channel destroyed", + brokerNameFound, clusterName); + + if (brokerNames.isEmpty()) { + log.info( + "remove the clusterName[{}] from clusterAddrTable, because channel " + + "destroyed and no broker in this cluster", + clusterName); + it.remove(); + } + + break; + } + } + } + + // 第五步:清理topicQueueTable中对应的QueueData信息,如果brokerName对应的 + // broker都已经被移除,那么就需要清理对应的Queue的信息 + if (removeBrokerName) { + Iterator>> itTopicQueueTable = + this.topicQueueTable.entrySet().iterator(); + while (itTopicQueueTable.hasNext()) { + Entry> entry = itTopicQueueTable.next(); + String topic = entry.getKey(); + List queueDataList = entry.getValue(); + + Iterator itQueueData = queueDataList.iterator(); + while (itQueueData.hasNext()) { + QueueData queueData = itQueueData.next(); + if (queueData.getBrokerName().equals(brokerNameFound)) { + itQueueData.remove(); + log.info("remove topic[{} {}], from topicQueueTable, because channel destroyed", + topic, queueData); + } + } + + if (queueDataList.isEmpty()) { + itTopicQueueTable.remove(); + log.info("remove topic[{}] all queue, from topicQueueTable, because channel destroyed", + topic); + } + } + } + } finally { + // 第六步:必须释放锁资源 + this.lock.writeLock().unlock(); + } + } catch (Exception e) { + log.error("onChannelDestroy Exception", e); + } + } +} +``` + +从上面的代码看来逻辑思路还是非常简单明了的,NameServer的设计初衷就是为了让系统更加简单。 + +**从主动注销的角度来分析:** +在Broker正常启动的时候会注册一个shutDown的钩子函数,代码如下所示: + +```java +// Broker在启动的时候会注册一个钩子函数,当Broker的进程收到退出进程的信号后会指定该函数 +// 主要是执行controller.shutdown();来关闭资源链接已经清理NameServer中的路由信息等 +Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { + private volatile boolean hasShutdown = false; + private final AtomicInteger shutdownTimes = new AtomicInteger(0); + + @Override + public void run() { + synchronized (this) { + log.info("Shutdown hook was invoked, {}", this.shutdownTimes.incrementAndGet()); + if (!this.hasShutdown) { + this.hasShutdown = true; + long beginTime = System.currentTimeMillis(); + controller.shutdown(); + long consumingTimeTotal = System.currentTimeMillis() - beginTime; + log.info("Shutdown hook over, consuming total time(ms): {}", consumingTimeTotal); + } + } + } + }, "ShutdownHook")); +``` + +`controller.shutdown();`中会执行`this.unregisterBrokerAll();`方法,主要是去主动注销NameServer中的路由信息,底层调用的还是`brokerOuterAPI.unregisterBrokerAll`的方法: + +```java +/** + * 注销NameServer中的路由信息 + * + * @param clusterName 集群名称 + * @param brokerAddr broker地址 + * @param brokerName broker名称 + * @param brokerId broker ID + */ +public void unregisterBrokerAll( + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId +) { + // 获取所有的NameServer列表 + List nameServerAddressList = this.remotingClient.getNameServerAddressList(); + if (nameServerAddressList != null) { + // 遍历NameServer列表并分别注销 + for (String namesrvAddr : nameServerAddressList) { + try { + this.unregisterBroker(namesrvAddr, clusterName, brokerAddr, brokerName, brokerId); + log.info("unregisterBroker OK, NamesrvAddr: {}", namesrvAddr); + } catch (Exception e) { + log.warn("unregisterBroker Exception, {}", namesrvAddr, e); + } + } + } +} +``` + +具体的注销逻辑和注册逻辑是类似的,首先构建请求头,将必要信息进行封装,然后根据请求码来获取连接,然后执行连接获取执行结果,具体代码如下所示: + +```java +public void unregisterBroker( + final String namesrvAddr, + final String clusterName, + final String brokerAddr, + final String brokerName, + final long brokerId +) throws RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException, + MQBrokerException { + // 第一步:封装注销Broker的请求头 + UnRegisterBrokerRequestHeader requestHeader = new UnRegisterBrokerRequestHeader(); + requestHeader.setBrokerAddr(brokerAddr); + requestHeader.setBrokerId(brokerId); + requestHeader.setBrokerName(brokerName); + requestHeader.setClusterName(clusterName); + // 第二步:根据请求码来获取连接 + RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.UNREGISTER_BROKER, requestHeader); + + // 第三步:执行连接请求 + RemotingCommand response = this.remotingClient.invokeSync(namesrvAddr, request, 3000); + assert response != null; + // 第四步:分析结果 + switch (response.getCode()) { + case ResponseCode.SUCCESS: { + return; + } + default: + break; + } + + throw new MQBrokerException(response.getCode(), response.getRemark()); +} +``` + +这是Broker端主动注销的源码分析,当NameServer接收到注销请求后,会由NameServer的DefaultRequestProcessor根据请求码转发给RouteInfoManager的unregisterBroker方法来进行路由的删除维护操作,就和NameServer定期扫描的在底层使用的方法是一致的了。 + +### 3.4 路由信息发现 + +NameServer在设计之初就考虑将其设计得更加简单,NameServer中的路由信息在发生变化后,并不会主动推送给客户端(包括生产者和消费者),而是需要客户端主动拉取最新的路由信息。具体的请求码是`RequestCode.GET_ROUTEINFO_BY_TOPIC`,请求到达NameServer的DefaultRequestProcessor后,将转发给getRouteInfoByTopic方法来执行,具体的源码如下所示: + +```java +/** + * 根据Topic来获取路由信息 + * + * @param ctx 上下文环境 + * @param request 请求内容 + * @return RemotingCommand对象 + * @throws RemotingCommandException 异常 + */ +public RemotingCommand getRouteInfoByTopic(ChannelHandlerContext ctx, + RemotingCommand request) throws RemotingCommandException { + // 封装返回体和解析请求头 + final RemotingCommand response = RemotingCommand.createResponseCommand(null); + final GetRouteInfoRequestHeader requestHeader = + (GetRouteInfoRequestHeader) request.decodeCommandCustomHeader(GetRouteInfoRequestHeader.class); + + // 从RouteInfoManager中获取路由信息,并封装为TopicRouteData对象 + TopicRouteData topicRouteData = + this.namesrvController.getRouteInfoManager().pickupTopicRouteData(requestHeader.getTopic()); + + if (topicRouteData != null) { + // 如果路由信息存在,且该主题配置的是顺序消息,那么就从NameServer的KVconfig中获取顺序消息相关的配置 + if (this.namesrvController.getNamesrvConfig().isOrderMessageEnable()) { + String orderTopicConf = + this.namesrvController.getKvConfigManager() + .getKVConfig(NamesrvUtil.NAMESPACE_ORDER_TOPIC_CONFIG, + requestHeader.getTopic()); + topicRouteData.setOrderTopicConf(orderTopicConf); + } + + // 返回体编码并返回 + byte[] content = topicRouteData.encode(); + response.setBody(content); + response.setCode(ResponseCode.SUCCESS); + response.setRemark(null); + return response; + } + + // 在未找到路由信息的情况下返回如下信息 + response.setCode(ResponseCode.TOPIC_NOT_EXIST); + response.setRemark("No topic route info in name server for the topic: " + requestHeader.getTopic() + + FAQUrl.suggestTodo(FAQUrl.APPLY_TOPIC_URL)); + return response; +} +``` + +以上代码中主要的一行代码是: + +```java +// 从RouteInfoManager中获取路由信息,并封装为TopicRouteData对象 +TopicRouteData topicRouteData = + this.namesrvController.getRouteInfoManager().pickupTopicRouteData(requestHeader.getTopic()); +``` + +底层还是需要从RouteInfoManager获取路由表信息,最后将其封装为TopicRouteData返回给客户端。由于`pickupTopicRouteData`方法简单明了,读者可自行阅读并理解。 + +## 四、文章小结 + +本文从NameServer的启动流程开始分析,一步一步分析到本文的主要内容——路由管理器(RouteInfoManager),主要围绕路由信息的注册、剔除与发现,一步步分析后,我们发现原理其实很简单,RocketMQ就是这么喜人,性能强大的同时,让所有喜欢源码的朋友都能阅读得懂。总结来说就是: + +- Broker在启动的时候向指定的NameServer进行注册,发送自身的元信息到NameServer的路由管理器; +- 路由信息的剔除则有主动注销和异常剔除两种情况,都是将路由信息从路由管理器中删除,NameServer端的底层处理方式都是一致的,只是触发的方式不一样而已,前者是NameServer主动扫描,后者是Broker主动发送注销请求; +- 获取路由信息则由客户端主动拉取,NameServer并不会主动推送。 + +思考:如果某个Broker发生了故障,并没有主动发起注销的请求,那么NameServer最少要等待2min才会得知并进行故障剔除,在这期间,生产者将消息发送到故障的Broker,那么就会造成发送失败,其实这是分布式系统中常见的高可用问题,那么RocketMQ是如何解决这种问题的呢?我们可以带着这个问题进入到下一节的源码分析《[RocketMQ源码之路(三)消息发送源码分析](https://itlemon.blog.csdn.net/article/details/113879541)》,欢迎来撩。 \ No newline at end of file From 78a9614283af7f47a8d0cc491c9da0999445b7a3 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 28 Feb 2023 23:17:56 +0800 Subject: [PATCH 22/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84namesrv=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8E=9F=E7=90=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\347\216\257\345\242\203\346\220\255\345\273\272.md" | 2 +- ...\204\345\220\257\345\212\250\345\216\237\347\220\206.md" | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git "a/docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" "b/docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" index 0c4b150..1b099f5 100644 --- "a/docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" +++ "b/docs/resources/middleware/rocketmq/1-2RocketMQ\346\272\220\347\240\201\351\230\205\350\257\273\347\216\257\345\242\203\346\220\255\345\273\272.md" @@ -145,7 +145,7 @@ consumer.setNamesrvAddr("127.0.0.1:9876"); 然后分别启动 `Consumer` 和 `Producer` 就可以正常进行消息消费了。 -## 五、总结 +## 五、文章小结 本文言简意赅,和我以前的文章风格大有不同,以前是面面俱到,全文翔实。原因是这篇文章是帮助大家尽快搭建起源码环境,对于一些基础知识,比如 RocketMQ 的发展史,什么是 `Namesrv`、什么是 `Broker`,这些基础知识大家可以去阅读 RocketMQ 官网文档或者其他博客可以了解到,所以这里就没有过多介绍。接下来,欢迎大家订阅我的 `RocketMQ源码之路` 系列文章,让我们一起去遨游 RocketMQ 源码世界吧! diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index 62ee460..d5b902e 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -449,5 +449,11 @@ public boolean initialize() { ``` 上述代码都给出了详细的注释说明,每个步骤对应的代码内部也基本给出了注释说明,读者可以根据需要去阅读我注释后的 [源代码](https://github.com/itlemon/rocketmq-5.0.0) 。 +## 三、文章小结 + +本文主要讲解的是 NameServer 的启动流程,在启动过程中,首先是解析各种配置,并将配置装配到配置类对象中,这些配置类对象,其实都是有默认值的,正常情况下,不需要用户去自定义这些配置,如果有需要,也可以针对各个配置项去单独配置到配置文件中。配置解析完毕之后,就是开始创建 NameServerController 对象,创建的过程中,其实就是去创建了 KVConfigManager、BrokerHousekeepingService、RouteInfoManager、Configuration 对象,这些组件都是重要组件,NameServer 的主要功能都依靠它们,对象创建完毕后就是初始化必要的线程池、处理器等,待所有必备组件都初始化好了以后,就是启动 NettyServer 了,整个 NameServer 也就启动起来了。 + +本文并没有对 Netty 进行深入讲解,Netty 不仅仅扮演着 RocketMQ 底层的网络交互组件,它同样也是很多重要 RPC 服务的基础网络组件,感兴趣的读者可以深入去学习和了解 Netty,本系列文章将不着重讲解 Netty,后续将通过发 Netty 系列文章来讲。 + 了解更多干货,欢迎关注我的微信公众号:爪哇论剑(微信号:itlemon) ![微信公众号-爪哇论剑-itlemon](https://img-blog.csdnimg.cn/20190917130526135.jpeg) \ No newline at end of file From ac437bd97cb965f7ef6256254d90ea462cfc761c Mon Sep 17 00:00:00 2001 From: itlemon Date: Fri, 3 Mar 2023 00:01:58 +0800 Subject: [PATCH 23/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84namesrv=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8E=9F=E7=90=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\346\234\272\345\210\266.md" | 95 +++++++++++-------- 1 file changed, 55 insertions(+), 40 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index 572e393..f6369c9 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -2,55 +2,66 @@ ![image-20230214233259510](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230214233259510.png) -## 三、NameServer的路由原理 +> 生产者在生产消息、消费者在消费消息之前,都需要连接到 NameServer 上,从 NameServer 拉取路由信息,从而实现消息的生产、存储与消费。为生产者和消费者提供路由信息,是 NameServer 的主要功能之一,NameServer 内部由一个路由管理器维护着路由信息,并且可以动态地管理 Broker 节点信息,包含注册、剔除、发现及心跳等。本文将着重介绍 NameServer 的路由管理机制,文章中使用到的代码均来自 RocketMQ 5.0 版本,感兴趣的读者可以 clone 下来阅读源码与注释。文中的代码仓库地址:[点击跳转](https://github.com/itlemon/rocketmq-5.0.0)。 -文章一开始就提到,NameServer是保证消息正确地从生产者到消费者的“指挥官”,它提供了路由管理,服务注册与服务发现、故障剔除等机制,这些机制的背后原理都都依赖于NameServer的路由,本小节将着重介绍NameServer的路由原理。 +## 一、路由信息数据结构分析 -### 3.1 路由信息管理器 +NameServer 是保证消息正确地从生产者到消费者的“指挥官”,它提供了路由管理,服务注册与服务发现、故障剔除等机制,这些机制的背后原理都都依赖于 NameServer 的路由功能,接下来,将详细介绍路由信息的数据结构,并按照 2m-2s 部署方式部署两组 Broker,通过打断点的形式一起看看 Broker 数据在路由管理器中是如何存储的,方便大家理解 NameServer 的路由原理。 -NameServer有一个路由信息管理器`RouteInfoManager`,它位于`org.apache.rocketmq.namesrv.routeinfo`包内,其内部存储了topic与broker的各种信息与关系,是RocketMQ实现服务注册与发现、故障剔除的基础。 -RouteInfoManager内部维护了多个HashMap数据结构,用于存储路由信息,具体的内容如下所示: +### 1.1 路由信息管理器 + +NameServer 有一个路由信息管理器 `RouteInfoManager`,它位于 `org.apache.rocketmq.namesrv.routeinfo` 包内,其内部存储了 topic 与 broker 的各种信息与关系,是 NameServer 实现服务注册与发现、故障剔除的基础。RouteInfoManager 内部维护了多个 Map 数据结构,用于存储路由信息,具体的内容如下所示: ```java /** - * 该Map存储的是Topic消息队列的路由信息,发送具体消息时可根据该Map来进行负载均衡 + * 该容器存储的是topic与该topic相关的broker的Queue的数据 + * 例如某个RocketMQ集群是按照2m-2s部署的,那么这个集群上所有的topic,它对应的Map,在集群正常的情况下, + * 都将有两条数据,键分别是broker-a、broker-b,QueueData记录topic在broker上的分区数等信息 + */ +private final Map> topicQueueTable; + +/** + * 该容器存储的是每个brokerName与broker的关系,例如某个RocketMQ集群是按照2m-2s部署的,那么有两组broker,brokerName分别 + * 是:broker-a、broker-b,这两组broker各有一个主和从,主的ID是0,从的ID是1,那么BrokerData里将记录集群名、主从broker实例 + * 的地址,zone名称等 */ -private final HashMap> topicQueueTable; +private final Map brokerAddrTable; /** - * Broker的基础信息表,键名是Broker的名称,BrokerData中存储了Broker的名称, - * 所属集群名称以及主Broker和备Broker的地址信息 + * 该容器存储的是集群名与brokerName的关系,也就是集群与Broker名称的映射表,可以方便知道一个集群下有哪些Broker */ -private final HashMap brokerAddrTable; +private final Map> clusterAddrTable; /** - * 集群与Broker名称的映射表,可以方便知道一个集群下有哪些Broker + * 该容器存储的是每个broker实例的存活信息,NameServer每次收到心跳后会将此引用指向最新的表 */ -private final HashMap> clusterAddrTable; +private final Map brokerLiveTable; /** - * 该Map存储的是每个Broker的存活信息,Name Server每次收到心跳后会将此引用指向最新的表 + * 该容器存储的是Broker与Filter Server之间的关系 */ -private final HashMap brokerLiveTable; +private final Map/* Filter Server */> filterServerTable; /** - * 该Map存储的是Broker与Filter Server之间的关系表 + * 该容器存储的是topic与该topic相关的broker中的Queue的映射信息 */ -private final HashMap/* Filter Server */> filterServerTable; +private final Map> topicQueueMappingInfoTable; ``` -从上面的数据结构看来,维护NameServer的路由信息应该还是很简单的,没有太过于抽象的概念,从数据结构中也能得出以下几个结论: +从上面的数据结构看来,维护 NameServer 的路由信息应该还是很简单的,没有太过于抽象的概念,从数据结构中可以分析出来如下内容: -- 一个Topic包含多个消息队列,其数据是存储在`topicQueueTable`中。 -- 多个Broker拥有同一个Broker Name,它们之间使用BrokerId来进行区分,在BrokerData内部维护了一个HashMap结构来存储。 -- 一个RocketMQ集群可包含多个名称唯一的Broker。 -- 一个Broker可与多个Filter Server进行绑定。 +- 一个 Topic 包含多少个队列(Queue,有时候也成为分区,Partition),这个是和部署了多少组 Broker (主从算一组)有关,例如本文的案例部署方式是 2m-2s,就是两组 Broker,那么一个 Topic 拥有的分区数一定是 $2$ 的整数倍,一个 Broker 默认为每一个 Topic 创建 $4$ 个读队列和 $4$ 个写队列,Topic 的分区信息是存储在 `topicQueueTable` 中。 +- 一组 Broker 有一个主,可以有多个从,它们拥有同样的 BrokerName,主从之间使用 brokerId 来进行区分,`brokerId=0` 代表主节点,`brokerId>0` 表示从节点,`brokerAddrTable` 维护了 BrokerName 对应的一组 Broker 集群信息,在 BrokerData 内部维护了一个 HashMap 结构来存储主从 Broker 节点,键是 brokerId,值是 Broker 节点的 IP 地址及端口信息。 +- `clusterAddrTable` 维护了群名与 BrokerName 的关系,也就是集群与 Broker 名称的映射表,可以方便知道一个集群下有哪些 Broker。 +- `brokerLiveTable` 存储的是每个 Broker 实例的存活信息,NameServer 每次收到心跳后会将此引用指向最新的表,该数据结构用来维护 Broker 的存活信息。 +- `filterServerTable` 是 Broker 与 Filter Server 之间的关系。 +- `topicQueueMappingInfoTable` 存储的是 Topic 与该 Topic 相关的 Broker 中的 Queue 的映射信息。 -其中QueueData、BrokerData、BrokerLiveInfo分别用于存储队列信息、Broker信息及Broker存活信息等数据,其类图如下所示: +其中 QueueData、BrokerData、BrokerLiveInfo、TopicQueueMappingInfo 分别用于存储队列信息、Broker 信息、Broker 存活信息以及 Topic 与 Queue 映射信息等数据,其类图如下所示: ```mermaid classDiagram - class QueueData{ + class QueueData{ -String brokerName -int readQueueNums -int writeQueueNums @@ -60,42 +71,46 @@ classDiagram class BrokerData{ -String cluster -String brokerName - -int writeQueueNums -HashMap brokerAddrs + -String zoneName } class BrokerLiveInfo{ -long lastUpdateTimestamp + -long heartbeatTimeoutMillis -DataVersion dataVersion -Channel channel -String haServerAddr } ``` -QueueData中各个属性含义如下所示: +QueueData 中各个属性含义如下所示: -- brokerName:当前Queue所属的Broker的名称 -- readQueueNums:读Queue的数量 -- writeQueueNums:写Queue的数量 +- brokerName:当前 Queue 所属的 Broker 的名称 +- readQueueNums:读 Queue 的数量 +- writeQueueNums:写 Queue 的数量 - perm:读写权限,{@link org.apache.rocketmq.common.constant.PermName} -- topicSynFlag:topic同步标记,{@link org.apache.rocketmq.common.sysflag.TopicSysFlag} +- topicSynFlag:Topic 同步标记,{@link org.apache.rocketmq.common.sysflag.TopicSysFlag} -BrokerData中各个属性含义如下所示: +BrokerData 中各个属性含义如下所示: - cluster:所属集群名称 -- brokerName:Broker名称 -- brokerAddrs:主备Broker信息表,键为BrokerID,值为Broker的地址 +- brokerName:Broker 名称 +- brokerAddrs:主备 Broker 信息表,键为 BrokerID,值为 Broker 的地址 +- zoneName:RocketMQ 5.0 新特性,支持多 zone 部署 -BrokerLiveInfo中各个属性含义如下所示: +BrokerLiveInfo 中各个属性含义如下所示: -- lastUpdateTimestamp:上一次更新的时间戳,用于判断该Broker是否已经过期 -- dataVersion:Broker信息版本 -- channel:socket通道 -- haServerAddr:haServer的地址,是Slave从Master拉取数据时链接的地址 +- lastUpdateTimestamp:上一次更新的时间戳,用于判断该 Broker 是否已经过期,默认的 Broker 心跳过期时间是 $2$ 分钟 +- heartbeatTimeoutMillis:心跳超时时间,默认是 $2$ 分钟,如果上一次更新时间戳加上心跳超时时间小于当前时间戳,那么说明该 Broker 过期了,需要被剔除。 +- dataVersion:Broker 信息版本,记录 Broker 的状态 +- channel:Socket 通道 +- haServerAddr:haServer 的地址,是 Slave 从 Master 拉取数据时链接的地址 -本文开始的第一张图是一个2主2从的RocketMQ集群部署方式,集群中包含2个Master的Broker和2个Slave的Broker,使用BrokerData存储上述部署方式,其表现为以下形式: +文章 [NameServer的启动原理](./2-1NameServer的启动原理.md) 第一张图是一个 $2$ 主 $2$ 从的集群部署方式,集群中包含 $2$ 个 Master 的 Broker 和 $2$ 个 Slave 的 Broker,使用 BrokerData 存储上述部署方式,其表现为以下形式: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) -我们启动一个NameServer服务,并且启动四个Broker服务(分别是BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs),按照上面的图展示的方式来进行部署,一起验证一下RouteInfoManager内部的数据存储的内容。 -在本机IntelliJ IDEA中启动四个Broker,需要为四个Broker分别设置配置文件,我们参考《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,参考Broker的配置方式,分别配置四份,具体的配置文件参考代码中的[配置文件](https://github.com/itlemon/itlemon-rocketmq/tree/master/rocketmq_home),IntelliJ IDEA中的配置面板需要改成如下所示: +我们启动一个 NameServer 服务,并且启动四个 Broker 服务(分别是 BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs ),按照上面的图展示的方式来进行部署,一起验证一下 RouteInfoManager 内部的数据存储的内容。 + +在本机 IntelliJ IDEA 中启动四个 Broker 实例,需要为四个 Broker 实例分别设置配置文件,我们参考《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,参考Broker的配置方式,分别配置四份,具体的配置文件参考代码中的[配置文件](https://github.com/itlemon/itlemon-rocketmq/tree/master/rocketmq_home),IntelliJ IDEA中的配置面板需要改成如下所示: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213215432215.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) 图中展示红框是设置了一个自定义的命令行参数,支持Broker自定义启动端口(默认是10911,需要在同一机器启动多个Broker服务,最好支持自定义端口设置),这需要修改一下`BrokerStartup`这个类的源码,具体可参考上面BrokerStartup的自定义启动端口的代码,这里给出[github地址](https://github.com/itlemon/itlemon-rocketmq/blob/master/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java),不再在文章中重复赘述了。需要注意的一点是,如果设置的broker-am的启动端口是10911,那么broker-as的不能设置为10912,因为每个每个broker启动后还会占用启动端口的后一个端口。 我们继续按照顺序分别启动四个Broker服务,最后启动的broker-bs,并且给NameServer的RouteInfoManager中的registerBroker方法加上断点,因为Broker向NameServer发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 From aa4647b257acff9e95c39b46836d2966b7733f9f Mon Sep 17 00:00:00 2001 From: itlemon Date: Sat, 4 Mar 2023 02:03:18 +0800 Subject: [PATCH 24/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84namesrv=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\346\234\272\345\210\266.md" | 71 ++++++++++++++++--- 1 file changed, 62 insertions(+), 9 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index f6369c9..5db3bc4 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -4,11 +4,11 @@ > 生产者在生产消息、消费者在消费消息之前,都需要连接到 NameServer 上,从 NameServer 拉取路由信息,从而实现消息的生产、存储与消费。为生产者和消费者提供路由信息,是 NameServer 的主要功能之一,NameServer 内部由一个路由管理器维护着路由信息,并且可以动态地管理 Broker 节点信息,包含注册、剔除、发现及心跳等。本文将着重介绍 NameServer 的路由管理机制,文章中使用到的代码均来自 RocketMQ 5.0 版本,感兴趣的读者可以 clone 下来阅读源码与注释。文中的代码仓库地址:[点击跳转](https://github.com/itlemon/rocketmq-5.0.0)。 -## 一、路由信息数据结构分析 +## 一、路由信息数据结构原理 NameServer 是保证消息正确地从生产者到消费者的“指挥官”,它提供了路由管理,服务注册与服务发现、故障剔除等机制,这些机制的背后原理都都依赖于 NameServer 的路由功能,接下来,将详细介绍路由信息的数据结构,并按照 2m-2s 部署方式部署两组 Broker,通过打断点的形式一起看看 Broker 数据在路由管理器中是如何存储的,方便大家理解 NameServer 的路由原理。 -### 1.1 路由信息管理器 +### 1.1 路由信息数据结构分析 NameServer 有一个路由信息管理器 `RouteInfoManager`,它位于 `org.apache.rocketmq.namesrv.routeinfo` 包内,其内部存储了 topic 与 broker 的各种信息与关系,是 NameServer 实现服务注册与发现、故障剔除的基础。RouteInfoManager 内部维护了多个 Map 数据结构,用于存储路由信息,具体的内容如下所示: @@ -106,14 +106,67 @@ BrokerLiveInfo 中各个属性含义如下所示: - channel:Socket 通道 - haServerAddr:haServer 的地址,是 Slave 从 Master 拉取数据时链接的地址 -文章 [NameServer的启动原理](./2-1NameServer的启动原理.md) 第一张图是一个 $2$ 主 $2$ 从的集群部署方式,集群中包含 $2$ 个 Master 的 Broker 和 $2$ 个 Slave 的 Broker,使用 BrokerData 存储上述部署方式,其表现为以下形式: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) -我们启动一个 NameServer 服务,并且启动四个 Broker 服务(分别是 BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs ),按照上面的图展示的方式来进行部署,一起验证一下 RouteInfoManager 内部的数据存储的内容。 +### 1.2 路由信息真实存储状况 -在本机 IntelliJ IDEA 中启动四个 Broker 实例,需要为四个 Broker 实例分别设置配置文件,我们参考《[RocketMQ源码之路(一)搭建RocketMQ源码环境](1-1RocketMQ源码阅读环境搭建.md)》中,参考Broker的配置方式,分别配置四份,具体的配置文件参考代码中的[配置文件](https://github.com/itlemon/itlemon-rocketmq/tree/master/rocketmq_home),IntelliJ IDEA中的配置面板需要改成如下所示: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213215432215.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) -图中展示红框是设置了一个自定义的命令行参数,支持Broker自定义启动端口(默认是10911,需要在同一机器启动多个Broker服务,最好支持自定义端口设置),这需要修改一下`BrokerStartup`这个类的源码,具体可参考上面BrokerStartup的自定义启动端口的代码,这里给出[github地址](https://github.com/itlemon/itlemon-rocketmq/blob/master/broker/src/main/java/org/apache/rocketmq/broker/BrokerStartup.java),不再在文章中重复赘述了。需要注意的一点是,如果设置的broker-am的启动端口是10911,那么broker-as的不能设置为10912,因为每个每个broker启动后还会占用启动端口的后一个端口。 -我们继续按照顺序分别启动四个Broker服务,最后启动的broker-bs,并且给NameServer的RouteInfoManager中的registerBroker方法加上断点,因为Broker向NameServer发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 +文章《[NameServer的启动原理](./2-1NameServer的启动原理.md)》第一张图是一个 $2$ 主 $2$ 从的集群部署方式,集群中包含 $2$ 个 Master 的 Broker 和 $2$ 个 Slave 的 Broker,使用 BrokerData 存储上述部署方式,其表现为以下形式: +![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) +我们启动一个 NameServer 服务,并且启动四个 Broker 服务(分别是 BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs ),按照上面的图展示的方式来进行部署,一起验证一下 RouteInfoManager 内部的数据存储的内容。 + +为了可以在本机 IntelliJ IDEA 中启动四个 Broker 实例,我们需要为这四个 Broker 实例设置独立的 `ROCKETMQ_HOME`,一般企业生产环境,各个 Broker 基本独立部署在独立的物理机中,真实生产环境, `ROCKETMQ_HOME` 可以是一样的,但是本篇文章的验证案例,是需要在同一台机器上部署,所以各个 Broker 实例的 `ROCKETMQ_HOME` 要设置为不一样的。另外,Broker 默认的监听端口是 $10911$,我们也需要稍微改造一下 Broker 的启动代码,将其改造成支持在命令参数中配置监听端口,这样的话,可以在启动 Broker 的时候设置监听的端口,防止各个 Broker 因端口占用而无法启动。 + +- 对于各个 Broker 独立的 `ROCKETMQ_HOME`,我们可以在之前配置的目录下新建四个目录 broker-am、broker-as、broker-bm、broker-bs,作为四个 Broker 实例的 `ROCKETMQ_HOME`,再在每个目录下新建 conf 目录用于存储 Broker 配置文件,新建 logs 目录用于存放日志,新建 store 目录用于存储 Broker 数据。笔者已按照上图的配置方式配置四个配置文件,这四个配置文件我已经放在 [Github](https://github.com/itlemon/rocketmq-5.0.0/tree/master/distribution/conf/custom) 上,读者可以拷贝下来,修改一下 `ROCKETMQ_HOME` 路径即可使用。 + +- 对于支持在命令行中设置自定义监听端口,我们可以仿照文章《[NameServer的启动原理](./2-1NameServer的启动原理.md)》中对 NameServer 自定义端口的改造,来完成对 Broker 的改造,从而支持从命令行中通过`-l`或者`--listenPort`来指定端口,这里直接贴出代码。 + + :::: code-group + ::: code-group-item 改造代码1 + + ```java{11-14} + // 这里改造的是org.apache.rocketmq.broker.BrokerStartup#buildCommandlineOptions方法 + public static Options buildCommandlineOptions(final Options options) { + Option opt = new Option("c", "configFile", true, "Name server config properties file"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("p", "printConfigItem", false, "Print all config items"); + opt.setRequired(false); + options.addOption(opt); + + // 这里额外加一个选项,支持配置自定义监听端口 + opt = new Option("l", "listenPort", true, "Name server custom listening port"); + opt.setRequired(false); + options.addOption(opt); + return options; + } + ``` + + ::: + ::: code-group-item 改造代码2 + + ```java + // 这里改造的是org.apache.rocketmq.broker.BrokerStartup#createBrokerController方法 + // 这里默认启动监听的端口是10911,其实可以在上面的命令行选项中加入一个自定义的选型,并设置一个端口选项 + // 这样就可以在启动的时候通过命令行传入监听端口 + String listenPort; + if (commandLine.hasOption('l') && (StringUtils.isNumeric(listenPort = commandLine.getOptionValue('l')))) { + nettyServerConfig.setListenPort(Integer.parseInt(listenPort)); + } else { + nettyServerConfig.setListenPort(10911); + } + ``` + + ::: + :::: + +到目前为止,我们四个 Broker 实例的配置文件、ROCKETMQ_HOME、自定义端口改造都已经完成,接下来在 IDEA 中配置启动面板,这里给出一个示例: + +![image-20230304015223935](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230304015223935.png) + +尤其要注意图中展示红框标记的地方,每个 Broker 要指向对应的配置文件,需要使用不同的端口,这里设置了一个自定义的命令行参数,支持 Broker 自定义启动端口(默认是 $10911$,需要在同一机器启动多个 Broker 服务,最好支持自定义端口设置),需要注意的一点是,如果设置的 broker-am 的启动端口是 $10911$,那么 broker-as 的不能设置为 $10912$,因为每个每个 Broker 启动后还会占用启动端口的后一个端口。笔者使用端口分别是 $10911$、$10921$、$10931$、$10941$,读者可以根据自己的想法设置即可。 + +我们首先启动 NameServer,这里为了演示方便,启动一个 NameServer 即可,然后依次启动四个 Broker 服务,最后启动 broker-bs 的时候,给 NameServer 的 RouteInfoManager 中的 registerBroker 方法加上断点,因为 Broker 向 NameServer 发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 + +#### 1.2.1 topicQueueTable的数据状况 - topicQueueTable: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213231041621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) From 58cde789ab288f0f81d79a8c48cd3fdc361d37b2 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 5 Mar 2023 01:24:40 +0800 Subject: [PATCH 25/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\346\234\272\345\210\266.md" | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index 5db3bc4..4d7ea26 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -164,13 +164,39 @@ BrokerLiveInfo 中各个属性含义如下所示: 尤其要注意图中展示红框标记的地方,每个 Broker 要指向对应的配置文件,需要使用不同的端口,这里设置了一个自定义的命令行参数,支持 Broker 自定义启动端口(默认是 $10911$,需要在同一机器启动多个 Broker 服务,最好支持自定义端口设置),需要注意的一点是,如果设置的 broker-am 的启动端口是 $10911$,那么 broker-as 的不能设置为 $10912$,因为每个每个 Broker 启动后还会占用启动端口的后一个端口。笔者使用端口分别是 $10911$、$10921$、$10931$、$10941$,读者可以根据自己的想法设置即可。 -我们首先启动 NameServer,这里为了演示方便,启动一个 NameServer 即可,然后依次启动四个 Broker 服务,最后启动 broker-bs 的时候,给 NameServer 的 RouteInfoManager 中的 registerBroker 方法加上断点,因为 Broker 向 NameServer 发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 +我们首先启动 NameServer,这里为了演示方便,启动一个 NameServer 即可,然后依次启动四个 Broker 服务,最后在启动完 broker-bs 后,给 NameServer 的 RouteInfoManager 中的 registerBroker 方法加上断点,因为 Broker 向 NameServer 发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 #### 1.2.1 topicQueueTable的数据状况 - topicQueueTable: - ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213231041621.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) - 上图中topicQueueTable对应于运行时的数据就是: + +![image-20230305002712927](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305002712927.png) + +这是在四个 Broker 实例启动后,向 NameServer 注册的 Topic 信息,这些 Topic 除了 testCluster、broker-a、broker-b 以外,其他的都是系统预定义的 Topic,例如 `RMQ_SYS_TRANS_OP_HALF_TOPIC` 用来存放半事务消息,`SCHEDULE_TOPIC_XXXX` 用来存放延时消息等等。 + +上面有一个特殊 Topic:`TBW102`,我们在这里简单介绍一下它,后面在 Producer 发送消息的文章中还会提到它。它的作用很重要,当 Producer 在发送消息时,默认情况下,不需要提前创建好 Topic,如果 Topic 不存在,Broker 会自动创建 Topic。但是新创建的 Topic 它的权限是什么?读写队列数是多少呢?这个时候就需要用到 `TBW102` 了,RocketMQ会基于该 Topic 的配置创建新的 Topic。这里基本的时序图如下所示: + +```sequence +DefaultMQProducer ->> DefaultMQProducer: 发送消息send(Topic, Message) +DefaultMQProducer ->> NameServer: 第一次拉取TopicPublishInfo +NameServer -->> DefaultMQProducer: Topic不存在 +DefaultMQProducer -> NameServer: 第二次拉取TopicPublishiInfo,
此时拉取的是TBW102的路由信息 +NameServer -->> DefaultMQProducer: 返回TBW102的路由信息 +Note left of DefaultMQProducer: 1.Producer根据TBW102的路由信息构建TopicPublishInfo
2.将TopicPublishInfo缓存到本地
3.按照路由信息发送消息 +DefaultMQProducer -> SendMessageProcessor: 发送消息,并携带defaultTopic=TBW102 +SendMessageProcessor ->> SendMessageProcessor: 消息检查msgCheck() +Note left of SendMessageProcessor: 消息校验:
1.Topic合法性校验
2.Topic不存在,自动创建 +SendMessageProcessor ->> TopicConfigManager: 创建Topic +TopicConfigManager ->> TopicConfigManager: createTopicInSendMessageMethod() +Note left of TopicConfigManger: 1.基于TBW102的配置创建Topic
2.发送心跳信息给NameServer,携带上新的Topic信息完成注册 +DefaultMQProducer -> SendMessageProcessor: 后续再发送消息,Topic路由信息就已经有了 +``` + +根据时序图,我们一起总结下流程:Producer 发送一个不存在的 Topic 消息时,首先会从 NameServer 拉取 Topic 的路由信息,第一次拉取必然失败,第二次会直接拉取 TBW102 的路由数据,基于它创建 TopicPublishInfo 并缓存到本地,进行正常的消息发送,在 Header 里将 defaultTopic 设置为 TBW102。Broker 接收到消息时,先对消息做见检查,检查到 Topic 不存在,会基于 defaultTopic 的配置去创建该 Topic,然后注册到 NameServer 上,这样一个全新的Topic就被自动创建了。 + +我们理解了 Topic:TBW102 的作用,那么我们接下来就使用这个 Topic 来描述 NameServer 的路由信息。 + +上图中 topicQueueTable 对应于运行时的数据就是: ```json { From f4757ee9bcafdc0d607a4d542d1121965ec6f024 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 5 Mar 2023 19:01:31 +0800 Subject: [PATCH 26/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...61\347\256\241\347\220\206\346\234\272\345\210\266.md" | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index 4d7ea26..ec6c725 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -180,16 +180,16 @@ BrokerLiveInfo 中各个属性含义如下所示: DefaultMQProducer ->> DefaultMQProducer: 发送消息send(Topic, Message) DefaultMQProducer ->> NameServer: 第一次拉取TopicPublishInfo NameServer -->> DefaultMQProducer: Topic不存在 -DefaultMQProducer -> NameServer: 第二次拉取TopicPublishiInfo,
此时拉取的是TBW102的路由信息 +DefaultMQProducer ->> NameServer: 第二次拉取TopicPublishiInfo,
此时拉取的是TBW102的路由信息 NameServer -->> DefaultMQProducer: 返回TBW102的路由信息 Note left of DefaultMQProducer: 1.Producer根据TBW102的路由信息构建TopicPublishInfo
2.将TopicPublishInfo缓存到本地
3.按照路由信息发送消息 -DefaultMQProducer -> SendMessageProcessor: 发送消息,并携带defaultTopic=TBW102 +DefaultMQProducer ->> SendMessageProcessor: 发送消息,并携带defaultTopic=TBW102 SendMessageProcessor ->> SendMessageProcessor: 消息检查msgCheck() Note left of SendMessageProcessor: 消息校验:
1.Topic合法性校验
2.Topic不存在,自动创建 SendMessageProcessor ->> TopicConfigManager: 创建Topic TopicConfigManager ->> TopicConfigManager: createTopicInSendMessageMethod() -Note left of TopicConfigManger: 1.基于TBW102的配置创建Topic
2.发送心跳信息给NameServer,携带上新的Topic信息完成注册 -DefaultMQProducer -> SendMessageProcessor: 后续再发送消息,Topic路由信息就已经有了 +Note right of TopicConfigManager: 1.基于TBW102的配置创建Topic
2.发送心跳信息给NameServer,携带上新的Topic信息完成注册 +DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由信息就已经有了 ``` 根据时序图,我们一起总结下流程:Producer 发送一个不存在的 Topic 消息时,首先会从 NameServer 拉取 Topic 的路由信息,第一次拉取必然失败,第二次会直接拉取 TBW102 的路由数据,基于它创建 TopicPublishInfo 并缓存到本地,进行正常的消息发送,在 Header 里将 defaultTopic 设置为 TBW102。Broker 接收到消息时,先对消息做见检查,检查到 Topic 不存在,会基于 defaultTopic 的配置去创建该 Topic,然后注册到 NameServer 上,这样一个全新的Topic就被自动创建了。 From 06343a79d087950692172ac8602b3aac19aa6d3d Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 5 Mar 2023 19:07:01 +0800 Subject: [PATCH 27/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index ec6c725..ccb51bc 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -188,7 +188,7 @@ SendMessageProcessor ->> SendMessageProcessor: 消息检查msgCheck() Note left of SendMessageProcessor: 消息校验:
1.Topic合法性校验
2.Topic不存在,自动创建 SendMessageProcessor ->> TopicConfigManager: 创建Topic TopicConfigManager ->> TopicConfigManager: createTopicInSendMessageMethod() -Note right of TopicConfigManager: 1.基于TBW102的配置创建Topic
2.发送心跳信息给NameServer,携带上新的Topic信息完成注册 +Note left of TopicConfigManager: 1.基于TBW102的配置创建Topic
2.发送心跳信息给NameServer,
携带上新的Topic信息完成注册 DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由信息就已经有了 ``` From 7feba368cb7af9b88b174921f989e21dd31dfed0 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 5 Mar 2023 22:08:13 +0800 Subject: [PATCH 28/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\346\234\272\345\210\266.md" | 92 ++++++++++--------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index ccb51bc..0dd2c29 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -168,8 +168,6 @@ BrokerLiveInfo 中各个属性含义如下所示: #### 1.2.1 topicQueueTable的数据状况 -- topicQueueTable: - ![image-20230305002712927](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305002712927.png) 这是在四个 Broker 实例启动后,向 NameServer 注册的 Topic 信息,这些 Topic 除了 testCluster、broker-a、broker-b 以外,其他的都是系统预定义的 Topic,例如 `RMQ_SYS_TRANS_OP_HALF_TOPIC` 用来存放半事务消息,`SCHEDULE_TOPIC_XXXX` 用来存放延时消息等等。 @@ -196,57 +194,60 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 我们理解了 Topic:TBW102 的作用,那么我们接下来就使用这个 Topic 来描述 NameServer 的路由信息。 -上图中 topicQueueTable 对应于运行时的数据就是: +上图中 topicQueueTable 对应于运行时的数据结构如下所示(这里只列出 TBW102 的数据): ```json { - "testCluster": [ - { - "brokerName": "broker-a", - "readQueueNums": 16, - "writeQueueNums": 16, - "perm": 7, - "topicSynFlag": 0 - }, - { - "brokerName": "broker-b", - "readQueueNums": 16, - "writeQueueNums": 16, - "perm": 7, - "topicSynFlag": 0 - } - ] + "TBW102":{ + "broker-b":{ + "brokerName":"broker-b", + "readQueueNums":8, + "writeQueueNums":8, + "perm":7, + "topicSysFlag":0 + }, + "broker-a":{ + "brokerName":"broker-a", + "readQueueNums":8, + "writeQueueNums":8, + "perm":7, + "topicSysFlag":0 + } + } } ``` -- brokerAddrTable: - ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213232601362.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) - 上图中brokerAddrTable对应于运行时的数据就是: +#### 1.2.2 brokerAddrTable的数据状况 + +![image-20230305215131614](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305215131614.png) +上图中 brokerAddrTable 对应于运行时的数据结构如下所示: ```json { - "broker-a": { - "cluster": "testCluster", - "brokerName": "broker-a", - "brokerAddrs": { - "0": "172.20.192.218:10911", - "1": "172.20.192.218:10921" - } - }, - "broker-b": { - "cluster": "testCluster", - "brokerName": "broker-b", - "brokerAddrs": { - "0": "172.20.192.218:10931", - "1": "172.20.192.218:10941" - } - } + "broker-b":{ + "cluster":"testCluster", + "brokerName":"broker-b", + "brokerAddrs":{ + "0":"192.168.3.113:10931", + "1":"192.168.3.113:10941" + }, + "enableActingMaster":false + }, + "broker-a":{ + "cluster":"testCluster", + "brokerName":"broker-a", + "brokerAddrs":{ + "0":"192.168.3.113:10911", + "1":"192.168.3.113:10921" + }, + "enableActingMaster":false + } } ``` -- clusterAddrTable: - ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213223306896.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) - 上图中clusterAddrTable对应于运行时的数据就是: +#### 1.2.3 clusterAddrTable的数据状况 + +![image-20230305202146687](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305202146687.png)上图中 clusterAddrTable 对应于运行时的数据结构如下所示: ```json { @@ -257,11 +258,12 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 } ``` -这里需要说明一点,HashSet底层的实现结构仍然是HashMap,所以这里使用HashMap的方式来展示HashSet,读者关心Map的键即可。 +这里需要说明一点,HashSet 底层的实现结构仍然是 HashMap,所以这里使用 HashMap 的方式来展示 HashSet,读者关心 Map 的键即可。 + +#### 1.2.4 brokerLiveTable的数据状况 -- brokerLiveTable: - ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213233041302.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xhbW1vbnBldGVy,size_16,color_FFFFFF,t_70) - 上图中brokerLiveTable对应于运行时的数据就是: +![image-20230305220646605](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305220646605.png) +上图中 brokerLiveTable 对应于运行时的数据结构如下所示: ```json { From df54536847fa24cf83524d534a5b156d68261fc4 Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 6 Mar 2023 11:26:12 +0800 Subject: [PATCH 29/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84namesrv=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E5=8E=9F=E7=90=86=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/public/huangnanmeng.html | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 docs/.vuepress/public/huangnanmeng.html diff --git a/docs/.vuepress/public/huangnanmeng.html b/docs/.vuepress/public/huangnanmeng.html new file mode 100644 index 0000000..d3c82a6 --- /dev/null +++ b/docs/.vuepress/public/huangnanmeng.html @@ -0,0 +1,9 @@ + + + + 证书查询 + + + \ No newline at end of file From 9ffa770ea6d1fe44f2e1760f1090898b2949878f Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 7 Mar 2023 22:46:00 +0800 Subject: [PATCH 30/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84broker=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\346\234\272\345\210\266.md" | 79 ++++++++++++------- 1 file changed, 49 insertions(+), 30 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index 0dd2c29..c05a358 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -4,7 +4,7 @@ > 生产者在生产消息、消费者在消费消息之前,都需要连接到 NameServer 上,从 NameServer 拉取路由信息,从而实现消息的生产、存储与消费。为生产者和消费者提供路由信息,是 NameServer 的主要功能之一,NameServer 内部由一个路由管理器维护着路由信息,并且可以动态地管理 Broker 节点信息,包含注册、剔除、发现及心跳等。本文将着重介绍 NameServer 的路由管理机制,文章中使用到的代码均来自 RocketMQ 5.0 版本,感兴趣的读者可以 clone 下来阅读源码与注释。文中的代码仓库地址:[点击跳转](https://github.com/itlemon/rocketmq-5.0.0)。 -## 一、路由信息数据结构原理 +## 一、路由信息数据结构分析 NameServer 是保证消息正确地从生产者到消费者的“指挥官”,它提供了路由管理,服务注册与服务发现、故障剔除等机制,这些机制的背后原理都都依赖于 NameServer 的路由功能,接下来,将详细介绍路由信息的数据结构,并按照 2m-2s 部署方式部署两组 Broker,通过打断点的形式一起看看 Broker 数据在路由管理器中是如何存储的,方便大家理解 NameServer 的路由原理。 @@ -263,43 +263,62 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 #### 1.2.4 brokerLiveTable的数据状况 ![image-20230305220646605](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305220646605.png) -上图中 brokerLiveTable 对应于运行时的数据结构如下所示: +上图中 brokerLiveTable,它是一个 Map 结构,Map 的键是 BrokerAddrInfo 对象,Map 的值是 BrokerLiveInfo 对象,在运行时,键的数据结构为: ```json { - "172.20.192.218:10921": { - "lastUpdateTimestamp": 1613230150507, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10922" - }, - "172.20.192.218:10911": { - "lastUpdateTimestamp": 1613230145828, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10912" - }, - "172.20.192.218:10941": { - "lastUpdateTimestamp": 1613230166459, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10942" - }, - "172.20.192.218:10931": { - "lastUpdateTimestamp": 1613230154587, - "dataVersion": "dataVersionObject", - "channel": "channelObject", - "haServerAddr": "172.20.192.218:10932" - } + "clusterName":"testCluster", + "brokerAddr":"192.168.3.113:10911", + "hash":-1481157086 +} +``` + +为了方便展示,将键简化展示在下面的运行时数据结构中: + +```json +{ + "192.168.3.113:10911":{ + "lastUpdateTimestamp":1678025133747, + "heartbeatTimeoutMillis":120000, + "dataVersion":"dataVersionObject", + "channel":"channelObject", + "haServerAddr":"192.168.3.113:10912" + }, + "192.168.3.113:10941":{ + "lastUpdateTimestamp":1678025138611, + "heartbeatTimeoutMillis":120000, + "dataVersion":"dataVersionObject", + "channel":"channelObject", + "haServerAddr":"192.168.3.113:10942" + }, + "192.168.3.113:10931":{ + "lastUpdateTimestamp":1678025130572, + "heartbeatTimeoutMillis":120000, + "dataVersion":"dataVersionObject", + "channel":"channelObject", + "haServerAddr":"192.168.3.113:10932" + }, + "192.168.3.113:10921":{ + "lastUpdateTimestamp":1678025130599, + "heartbeatTimeoutMillis":120000, + "dataVersion":"dataVersionObject", + "channel":"channelObject", + "haServerAddr":"192.168.3.113:10922" + } } ``` -### 3.2 路由信息注册 +上面的 brokerLiveTable 中,存储的就是两组 Broker 共 $4$ 个实例注册到 NameServer 的存活信息,在探活机制中,NameServer 会检查每一个 Broker 实例,上一次更新时间戳(lastUpdateTimestamp)加上心跳超时时间(heartbeatTimeoutMillis,默认值为 $2$ 分钟),如果结果小于当前时间戳,则认为该 Broker 实例不再活跃了,将触发剔除操作,关闭通道等。 + +## 二、路由信息管理原理分析 + +### 2.1 路由信息注册 + +路由信息注册通常是指,将自身的信息告诉服务注册中心,在 RocketMQ 中,这里的“自身”是指 Broker,而服务注册中心指得就是 NameServer。Broker 在启动后,会向所有的 NameServer 注册自身的元信息,通常包括:集群名称(clusterName)、Broker 地址(brokerAddr)、Broker 名称(brokerName)、Broker ID(brokerId)、高可用地址(haServerAddr)、Topic相关信息(topicConfigWrapper)、过滤服务器列表、通信通道等信息等。这些元信息的注册,都是通过心跳机制来实现的,所谓的心跳机制,一般都是通过定时任务来实现的,按照一定的频率向NameServer 发送元信息数据,从而实现续约。每个 Broker 会每隔 $30$ 秒向 NameServer 发送心跳,NameServer 接收到 Broker 心跳数据后,会去实时更新 brokerLiveTable 中 BrokerLiveInfo 的 lastUpdateTimestamp 字段(上一次心跳时间戳),当然,NameServer 也有检查机制,会每隔 $10$ 秒扫描 brokerLiveTable,如果发现某个 Broker 的 lastUpdateTimestamp 字段超过 $2$min 没有更新,那么就认为该 Broker 存在故障,NameServer 会主动将其从路由表中剔除,同时关闭通信通道。 -路由信息注册通常是指,将自身的信息告诉服务注册中心,在RocketMQ中,这里的“自身”是指Broker,而服务注册中心指得就是NameServer。Broker在启动后,会向所有的NameServer注册自身的元信息,通常包括:集群名称(clusterName)、Broker地址(brokerAddr)、Broker名称(brokerName)、Broker ID(brokerId)、高可用地址(haServerAddr)、Topic相关信息(topicConfigWrapper)、过滤服务器列表、通信通道等信息等。这些元信息的注册,都是通过心跳机制来实现的,所谓的心跳机制,一般都是通过定时任务来实现的,按照一定的频率向NameServer发送元信息数据,从而实现续约。每个Broker会每隔30秒向NameServer发送心跳,NameServer接收到Broker心跳数据后,会去实时更新brokerLiveTable中BrokerLiveInfo的lastUpdateTimestamp字段(上一次心跳时间戳),当然,NameServer也有检查机制,会每隔10秒扫描brokerLiveTable,如果发现某个Broker的lastUpdateTimestamp字段超过2min没有更新,那么就认为该Broker存在故障,NameServer会主动将其从路由表中剔除,同时关闭通信通道。 -那么Broker是如何向NameServer进行注册的呢?下面的内容将一一揭秘。 +那么 Broker 是如何向 NameServer 进行注册的呢?下面的内容将一一揭秘。 -从BrokerController的start()方法可以看出,Broker在启动的时候,会注册一个定时任务,每隔30s(默认值,可配置10~60s)向NameServer发送元数据信息。`brokerConfig.getRegisterNameServerPeriod()`的默认值是30s。 +从 BrokerController 的 start() 方法可以看出,Broker 在启动的时候,会注册一个定时任务,每隔 $30$s(默认值,可配置 $10$~$60$s)向 NameServer 发送元数据信息。`brokerConfig.getRegisterNameServerPeriod()`的默认值是 $30$s。 ```java // 注册一个定时任务,默认每隔30s向NameServer发送元数据信息 From c87de9bd8552f3d26a5f258c05ea21f6a0385906 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 8 Mar 2023 23:51:47 +0800 Subject: [PATCH 31/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84broker=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\212\250\345\216\237\347\220\206.md" | 49 +-------- ...41\347\220\206\346\234\272\345\210\266.md" | 102 ++++++------------ 2 files changed, 33 insertions(+), 118 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" index d5b902e..764a855 100644 --- "a/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" +++ "b/docs/resources/middleware/rocketmq/2-1NameServer\347\232\204\345\220\257\345\212\250\345\216\237\347\220\206.md" @@ -157,8 +157,7 @@ public static void parseCommandlineAndConfigFile(String[] args) throws Exception nettyServerConfig = new NettyServerConfig(); nettyClientConfig = new NettyClientConfig(); - // 这里默认启动监听的端口是9876,其实可以在上面的命令行选项中加入一个自定义的选型,并设置一个端口选项 - // 这样就可以在启动的时候通过命令行传入监听端口 + // 这里默认启动监听的端口是9876 nettyServerConfig.setListenPort(9876); controllerConfig = new ControllerConfig(); @@ -236,51 +235,7 @@ public static void parseCommandlineAndConfigFile(String[] args) throws Exception - 第三步:创建配置对象; -- 第四步:设置 NameServer 的启动监听端口,默认是 9876,读者可以直接修改这里的端口号,但是笔者建议额外在 `NamesrvStartup#buildCommandlineOptions` 方法中添加一个命令行选项,例如 `listenPort`,从而支持从命令行中通过`-l`或者`--listenPort`来指定端口,示例代码如下高亮部分: - - :::: code-group - ::: code-group-item 改造代码1 - - ```java{10-13} - public static Options buildCommandlineOptions(final Options options) { - Option opt = new Option("c", "configFile", true, "Name server config properties file"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("p", "printConfigItem", false, "Print all config items"); - opt.setRequired(false); - options.addOption(opt); - - // 这里额外加一个选项,支持配置自定义监听端口 - opt = new Option("l", "listenPort", true, "Name server custom listening port"); - opt.setRequired(false); - options.addOption(opt); - return options; - } - ``` - - ::: - ::: code-group-item 改造代码2 - - ```java{8-13} - // 创建配置对象 - namesrvConfig = new NamesrvConfig(); - nettyServerConfig = new NettyServerConfig(); - nettyClientConfig = new NettyClientConfig(); - - // 这里默认启动监听的端口是9876,其实可以在上面的命令行选项中加入一个自定义的选型,并设置一个端口选项 - // 这样就可以在启动的时候通过命令行传入监听端口 - String listenPort; - if (commandLine.hasOption('l') && (StringUtils.isNumeric(listenPort = commandLine.getOptionValue('l')))) { - nettyServerConfig.setListenPort(Integer.parseInt(listenPort)); - } else { - nettyServerConfig.setListenPort(9876); - } - controllerConfig = new ControllerConfig(); - ``` - - ::: - :::: +- 第四步:设置 NameServer 的启动监听端口,默认是 9876,可以在 NameServer 配置文件中设置参数 `listenPort`,从而实现默认端口的覆盖; - 第五步:获取命令行中configFile的值,这个值是配置文件的绝对路径,如果命令行参数中没有配置,那么将采用默认值,默认值是 `{user.home}/namesrv/namesrv.properties`,解析该配置文件(注意配置文件中的要使用键值对的形式,例如: key=value,且 key 要保持和上述配置对象中的属性名称一致),将配置加载到各配置对象中。并且检查命令行参数中是否包含选项 `p` ,如果包含,那么将打印所有配置信息并退出进程; diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index c05a358..fbff94b 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -112,57 +112,15 @@ BrokerLiveInfo 中各个属性含义如下所示: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) 我们启动一个 NameServer 服务,并且启动四个 Broker 服务(分别是 BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs ),按照上面的图展示的方式来进行部署,一起验证一下 RouteInfoManager 内部的数据存储的内容。 -为了可以在本机 IntelliJ IDEA 中启动四个 Broker 实例,我们需要为这四个 Broker 实例设置独立的 `ROCKETMQ_HOME`,一般企业生产环境,各个 Broker 基本独立部署在独立的物理机中,真实生产环境, `ROCKETMQ_HOME` 可以是一样的,但是本篇文章的验证案例,是需要在同一台机器上部署,所以各个 Broker 实例的 `ROCKETMQ_HOME` 要设置为不一样的。另外,Broker 默认的监听端口是 $10911$,我们也需要稍微改造一下 Broker 的启动代码,将其改造成支持在命令参数中配置监听端口,这样的话,可以在启动 Broker 的时候设置监听的端口,防止各个 Broker 因端口占用而无法启动。 - -- 对于各个 Broker 独立的 `ROCKETMQ_HOME`,我们可以在之前配置的目录下新建四个目录 broker-am、broker-as、broker-bm、broker-bs,作为四个 Broker 实例的 `ROCKETMQ_HOME`,再在每个目录下新建 conf 目录用于存储 Broker 配置文件,新建 logs 目录用于存放日志,新建 store 目录用于存储 Broker 数据。笔者已按照上图的配置方式配置四个配置文件,这四个配置文件我已经放在 [Github](https://github.com/itlemon/rocketmq-5.0.0/tree/master/distribution/conf/custom) 上,读者可以拷贝下来,修改一下 `ROCKETMQ_HOME` 路径即可使用。 - -- 对于支持在命令行中设置自定义监听端口,我们可以仿照文章《[NameServer的启动原理](./2-1NameServer的启动原理.md)》中对 NameServer 自定义端口的改造,来完成对 Broker 的改造,从而支持从命令行中通过`-l`或者`--listenPort`来指定端口,这里直接贴出代码。 - - :::: code-group - ::: code-group-item 改造代码1 - - ```java{11-14} - // 这里改造的是org.apache.rocketmq.broker.BrokerStartup#buildCommandlineOptions方法 - public static Options buildCommandlineOptions(final Options options) { - Option opt = new Option("c", "configFile", true, "Name server config properties file"); - opt.setRequired(false); - options.addOption(opt); - - opt = new Option("p", "printConfigItem", false, "Print all config items"); - opt.setRequired(false); - options.addOption(opt); - - // 这里额外加一个选项,支持配置自定义监听端口 - opt = new Option("l", "listenPort", true, "Name server custom listening port"); - opt.setRequired(false); - options.addOption(opt); - return options; - } - ``` - - ::: - ::: code-group-item 改造代码2 - - ```java - // 这里改造的是org.apache.rocketmq.broker.BrokerStartup#createBrokerController方法 - // 这里默认启动监听的端口是10911,其实可以在上面的命令行选项中加入一个自定义的选型,并设置一个端口选项 - // 这样就可以在启动的时候通过命令行传入监听端口 - String listenPort; - if (commandLine.hasOption('l') && (StringUtils.isNumeric(listenPort = commandLine.getOptionValue('l')))) { - nettyServerConfig.setListenPort(Integer.parseInt(listenPort)); - } else { - nettyServerConfig.setListenPort(10911); - } - ``` - - ::: - :::: - -到目前为止,我们四个 Broker 实例的配置文件、ROCKETMQ_HOME、自定义端口改造都已经完成,接下来在 IDEA 中配置启动面板,这里给出一个示例: - -![image-20230304015223935](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230304015223935.png) - -尤其要注意图中展示红框标记的地方,每个 Broker 要指向对应的配置文件,需要使用不同的端口,这里设置了一个自定义的命令行参数,支持 Broker 自定义启动端口(默认是 $10911$,需要在同一机器启动多个 Broker 服务,最好支持自定义端口设置),需要注意的一点是,如果设置的 broker-am 的启动端口是 $10911$,那么 broker-as 的不能设置为 $10912$,因为每个每个 Broker 启动后还会占用启动端口的后一个端口。笔者使用端口分别是 $10911$、$10921$、$10931$、$10941$,读者可以根据自己的想法设置即可。 +为了可以在本机 IntelliJ IDEA 中启动四个 Broker 实例,我们需要为这四个 Broker 实例设置独立的 `ROCKETMQ_HOME`,一般企业生产环境,各个 Broker 基本独立部署在独立的物理机中,真实生产环境, `ROCKETMQ_HOME` 可以是一样的,但是本篇文章的验证案例,是需要在同一台机器上部署,所以各个 Broker 实例的 `ROCKETMQ_HOME` 要设置为不一样的。另外,Broker 默认的监听端口是 $10911$,我们也需要在配置文件 `broker.conf` 配置一下启动端口,将将每个 Broker 实例配置成不同的端口,这样可以防止各个 Broker 因端口占用而无法启动。 + +对于各个 Broker 独立的 `ROCKETMQ_HOME`,我们可以在之前配置的目录下新建四个目录 broker-am、broker-as、broker-bm、broker-bs,作为四个 Broker 实例的 `ROCKETMQ_HOME`,再在每个目录下新建 conf 目录用于存储 Broker 配置文件,新建 logs 目录用于存放日志,新建 store 目录用于存储 Broker 数据。笔者已按照上图的配置方式配置四个配置文件,这四个配置文件我已经放在 [Github](https://github.com/itlemon/rocketmq-5.0.0/tree/master/distribution/conf/custom) 上,读者可以拷贝下来,修改一下 `ROCKETMQ_HOME` 路径即可使用。 + +到目前为止,我们四个 Broker 实例的配置文件、ROCKETMQ_HOME、自定义端口都已经完成,接下来在 IDEA 中配置启动面板,这里给出一个示例: + +![image-20230308224638170](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230308224638170.png) + +尤其要注意图中展示红框标记的地方,每个 Broker 要指向对应的配置文件,配置文件中 Broker 自定义启动端口(默认是 $10911$,需要在同一机器启动多个 Broker 服务,需要自定义端口设置),需要注意的一点是,如果设置的 broker-am 的启动端口是 $10911$,那么 broker-as 的不能设置为 $10912$,因每个 Broker 启动后还会占用启动端口的后一个端口。笔者使用端口分别是 $10911$、$10921$、$10931$、$10941$,读者可以根据自己的想法设置即可。 我们首先启动 NameServer,这里为了演示方便,启动一个 NameServer 即可,然后依次启动四个 Broker 服务,最后在启动完 broker-bs 后,给 NameServer 的 RouteInfoManager 中的 registerBroker 方法加上断点,因为 Broker 向 NameServer 发送心跳的时候会调用这个方法来维护路由表,加上断点后可以很方便地查看运行时数据。 @@ -219,7 +177,8 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 #### 1.2.2 brokerAddrTable的数据状况 -![image-20230305215131614](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305215131614.png) +![image-20230308232203392](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230308232203392.png) + 上图中 brokerAddrTable 对应于运行时的数据结构如下所示: ```json @@ -228,8 +187,8 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 "cluster":"testCluster", "brokerName":"broker-b", "brokerAddrs":{ - "0":"192.168.3.113:10931", - "1":"192.168.3.113:10941" + "0":"192.168.1.25:10931", + "1":"192.168.1.25:10941" }, "enableActingMaster":false }, @@ -237,8 +196,8 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 "cluster":"testCluster", "brokerName":"broker-a", "brokerAddrs":{ - "0":"192.168.3.113:10911", - "1":"192.168.3.113:10921" + "0":"192.168.1.25:10911", + "1":"192.168.1.25:10921" }, "enableActingMaster":false } @@ -262,14 +221,15 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 #### 1.2.4 brokerLiveTable的数据状况 -![image-20230305220646605](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230305220646605.png) +![image-20230308232446507](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20230308232446507.png) + 上图中 brokerLiveTable,它是一个 Map 结构,Map 的键是 BrokerAddrInfo 对象,Map 的值是 BrokerLiveInfo 对象,在运行时,键的数据结构为: ```json { "clusterName":"testCluster", - "brokerAddr":"192.168.3.113:10911", - "hash":-1481157086 + "brokerAddr":"192.168.1.25:10911", + "hash":-1235770154 } ``` @@ -277,33 +237,33 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 ```json { - "192.168.3.113:10911":{ - "lastUpdateTimestamp":1678025133747, + "192.168.1.25:10911":{ + "lastUpdateTimestamp":1678288800134, "heartbeatTimeoutMillis":120000, "dataVersion":"dataVersionObject", "channel":"channelObject", - "haServerAddr":"192.168.3.113:10912" + "haServerAddr":"192.168.1.25:10912" }, - "192.168.3.113:10941":{ - "lastUpdateTimestamp":1678025138611, + "192.168.1.25:10921":{ + "lastUpdateTimestamp":1678288807815, "heartbeatTimeoutMillis":120000, "dataVersion":"dataVersionObject", "channel":"channelObject", - "haServerAddr":"192.168.3.113:10942" + "haServerAddr":"192.168.1.25:10922" }, - "192.168.3.113:10931":{ - "lastUpdateTimestamp":1678025130572, + "192.168.1.25:10931":{ + "lastUpdateTimestamp":1678288813012, "heartbeatTimeoutMillis":120000, "dataVersion":"dataVersionObject", "channel":"channelObject", - "haServerAddr":"192.168.3.113:10932" + "haServerAddr":"192.168.1.25:10932" }, - "192.168.3.113:10921":{ - "lastUpdateTimestamp":1678025130599, + "192.168.1.25:10941":{ + "lastUpdateTimestamp":1678288816376, "heartbeatTimeoutMillis":120000, "dataVersion":"dataVersionObject", "channel":"channelObject", - "haServerAddr":"192.168.3.113:10922" + "haServerAddr":"192.168.1.25:10942" } } ``` From b371f41bc78a3d5d84a250f7acae9c848ff5a029 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 14 Mar 2023 22:36:58 +0800 Subject: [PATCH 32/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84broker=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 16 + ...41\347\220\206\346\234\272\345\210\266.md" | 39 ++- package.json | 1 + yarn.lock | 301 +++++++++++++++++- 4 files changed, 343 insertions(+), 14 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index c358566..1b1a7fa 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -10,6 +10,7 @@ import {commentPlugin} from 'vuepress-plugin-comment2' import {seoPlugin} from 'vuepress-plugin-seo2' import {svgIconPlugin} from '@goy/vuepress-plugin-svg-icons' import {mdEnhancePlugin} from 'vuepress-plugin-md-enhance' +import {componentsPlugin} from 'vuepress-plugin-components' import {head, navbarZh, sidebarZh,} from './configs' @@ -64,6 +65,8 @@ export default defineUserConfig({ git: true, // use shiki plugin in production mode instead prismjs: true, + // 这里关闭默认主题的返回顶端 + backToTop: false, }, }), @@ -143,5 +146,18 @@ export default defineUserConfig({ // 启用 mermaid mermaid: true, }), + + // componentsPlugin + componentsPlugin({ + components: ['FontIcon'], + componentOptions: { + fontIcon: { + assets: '//at.alicdn.com/t/c/font_2154804_snaqmfegfdf.css', + }, + }, + rootComponents: { + backToTop: true, + } + }), ], }) \ No newline at end of file diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index fbff94b..ce22863 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -274,27 +274,40 @@ DefaultMQProducer ->> SendMessageProcessor: 后续再发送消息,Topic路由 ### 2.1 路由信息注册 -路由信息注册通常是指,将自身的信息告诉服务注册中心,在 RocketMQ 中,这里的“自身”是指 Broker,而服务注册中心指得就是 NameServer。Broker 在启动后,会向所有的 NameServer 注册自身的元信息,通常包括:集群名称(clusterName)、Broker 地址(brokerAddr)、Broker 名称(brokerName)、Broker ID(brokerId)、高可用地址(haServerAddr)、Topic相关信息(topicConfigWrapper)、过滤服务器列表、通信通道等信息等。这些元信息的注册,都是通过心跳机制来实现的,所谓的心跳机制,一般都是通过定时任务来实现的,按照一定的频率向NameServer 发送元信息数据,从而实现续约。每个 Broker 会每隔 $30$ 秒向 NameServer 发送心跳,NameServer 接收到 Broker 心跳数据后,会去实时更新 brokerLiveTable 中 BrokerLiveInfo 的 lastUpdateTimestamp 字段(上一次心跳时间戳),当然,NameServer 也有检查机制,会每隔 $10$ 秒扫描 brokerLiveTable,如果发现某个 Broker 的 lastUpdateTimestamp 字段超过 $2$min 没有更新,那么就认为该 Broker 存在故障,NameServer 会主动将其从路由表中剔除,同时关闭通信通道。 +路由信息注册通常是指,将自身的信息告诉服务注册中心,这里的“自身”是指 Broker,而服务注册中心指得就是 NameServer。Broker 在启动后,会向所有的 NameServer 注册自身的元信息,通常包括:集群名称(clusterName)、Broker 地址(brokerAddr)、Broker 名称(brokerName)、Broker ID(brokerId)、高可用地址(haServerAddr)、Topic相关信息(topicConfigWrapper)、过滤服务器列表、通信通道等信息等。这些元信息的注册,都是通过心跳机制来实现的,所谓的心跳机制,一般都是通过定时任务来实现的,按照一定的频率向NameServer 发送元信息数据,从而实现续约。每个 Broker 会每隔 $30$ 秒向 NameServer 发送心跳,NameServer 接收到 Broker 心跳数据后,会去实时更新 brokerLiveTable 中 BrokerLiveInfo 的 lastUpdateTimestamp 字段(上一次心跳时间戳),当然,NameServer 也有检查机制,会每隔 $10$ 秒扫描 brokerLiveTable,如果发现某个 Broker 的 lastUpdateTimestamp 字段超过 $2$min 没有更新,那么就认为该 Broker 存在故障,NameServer 会主动将其从路由表中剔除,同时关闭通信通道。 -那么 Broker 是如何向 NameServer 进行注册的呢?下面的内容将一一揭秘。 +那么 Broker 是如何向 NameServer 进行注册的呢?下面的内容将一一揭秘。本文中代码片段均来自 [代码仓库](https://github.com/itlemon/rocketmq-5.0.0),Broker 启动相关代码不再全量引入进来,启动原理主要部分代码均有注释,读者可以自行前往阅读。 从 BrokerController 的 start() 方法可以看出,Broker 在启动的时候,会注册一个定时任务,每隔 $30$s(默认值,可配置 $10$~$60$s)向 NameServer 发送元数据信息。`brokerConfig.getRegisterNameServerPeriod()`的默认值是 $30$s。 ```java -// 注册一个定时任务,默认每隔30s向NameServer发送元数据信息 -this.scheduledExecutorService.scheduleAtFixedRate(() -> { - try { - BrokerController.this.registerBrokerAll(true, - false, brokerConfig.isForceRegister()); - } catch (Throwable e) { - log.error("registerBrokerAll Exception", e); +// 注册一个定时任务,默认每隔30s向NameServer发送元数据信息,发送元数据信息的间隔可以设置10s到60s +scheduledFutures.add(this.scheduledExecutorService.scheduleAtFixedRate(new AbstractBrokerRunnable(this.getBrokerIdentity()) { + @Override + public void run2() { + try { + // broker支持延迟注册到NameServer,如果还没到时间,那么将不会去注册 + if (System.currentTimeMillis() < shouldStartTime) { + BrokerController.LOG.info("Register to namesrv after {}", shouldStartTime); + return; + } + + // 如果broker是独立的,那么无需注册到NameServer + if (isIsolated) { + BrokerController.LOG.info("Skip register for broker is isolated"); + return; } - }, 1000 * 10, Math.max(10000, - Math.min(brokerConfig.getRegisterNameServerPeriod(), 60000)), - TimeUnit.MILLISECONDS); + + // 注册逻辑在registerBrokerAll方法中 + BrokerController.this.registerBrokerAll(true, false, brokerConfig.isForceRegister()); + } catch (Throwable e) { + BrokerController.LOG.error("registerBrokerAll Exception", e); + } + } +}, 1000 * 10, Math.max(10000, Math.min(brokerConfig.getRegisterNameServerPeriod(), 60000)), TimeUnit.MILLISECONDS)); ``` -具体的注册行为代码需要进入到registerBrokerAll方法中,这里将分析后的registerBrokerAll方法贴在下面: +具体的注册行为代码需要进入到 registerBrokerAll 方法中,这里将分析后的 registerBrokerAll 方法贴在下面: ```java /** diff --git a/package.json b/package.json index a05c17e..c2231bf 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@vuepress/plugin-search": "2.0.0-beta.61", "vuepress": "2.0.0-beta.61", "vuepress-plugin-comment2": "2.0.0-beta.184", + "vuepress-plugin-components": "2.0.0-beta.193", "vuepress-plugin-copy-code2": "2.0.0-beta.184", "vuepress-plugin-md-enhance": "2.0.0-beta.184", "vuepress-plugin-seo2": "2.0.0-beta.184" diff --git a/yarn.lock b/yarn.lock index 38190d1..2af173c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1493,6 +1493,11 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@stackblitz/sdk@^1.8.2": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@stackblitz/sdk/-/sdk-1.8.2.tgz#f91c7b35cd5c4523fcacb74b51cee4ec92b608e0" + integrity sha512-3aTg0Tb9dNs1huPkpdYxPEX/yc8A28eZneUMOEJzOLi7EJwl5onr9gCAVjIOkN4WLYu1iBSiJiGBYT629bZIJQ== + "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" @@ -2170,6 +2175,13 @@ artalk@^2.4.4: insane "^2.6.2" marked "^4.0.19" +artplayer@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/artplayer/-/artplayer-4.6.2.tgz#d56c2887c10086f339722e025e9ece881561aaa9" + integrity sha512-9RMfFFy2wGgHUCnrwk+M2Z5OiLWQcBL+YzkSBwSi6IuJG6oM+TlfJJZt09RL2iag6DNQ+AUYtB879WUHxbqfIQ== + dependencies: + option-validator "^2.0.6" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -2269,6 +2281,28 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +bcp-47-match@^1.0.0, bcp-47-match@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-1.0.3.tgz#cb8d03071389a10aff2062b862d6575ffd7cd7ef" + integrity sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w== + +bcp-47-normalize@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz#d2c76218d132f223c44e4a06a7224be3030f8ec3" + integrity sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A== + dependencies: + bcp-47 "^1.0.0" + bcp-47-match "^1.0.0" + +bcp-47@^1.0.0: + version "1.0.8" + resolved "https://registry.yarnpkg.com/bcp-47/-/bcp-47-1.0.8.tgz#bf63ae4269faabe7c100deac0811121a48b6a561" + integrity sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag== + dependencies: + is-alphabetical "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2502,6 +2536,11 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== +codem-isoboxer@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/codem-isoboxer/-/codem-isoboxer-0.3.6.tgz#867f670459b881d44f39168d5ff2a8f14c16151d" + integrity sha512-LuO8/7LW6XuR5ERn1yavXAfodGRhuY2yP60JTZIw5yNYMCE5lUVbk3NFUCJxjnphQH+Xemp5hOGb1LgUXm00Xw== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2613,6 +2652,11 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.4" +core-js@^3.26.1: + version "3.29.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.29.1.tgz#40ff3b41588b091aaed19ca1aa5cb111803fa9a6" + integrity sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -2667,6 +2711,11 @@ csstype@^2.6.8: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== +custom-event-polyfill@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz#9bc993ddda937c1a30ccd335614c6c58c4f87aee" + integrity sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w== + cytoscape-cose-bilkent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" @@ -2941,6 +2990,22 @@ dagre-d3-es@7.0.8: d3 "^7.8.2" lodash-es "^4.17.21" +dashjs@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/dashjs/-/dashjs-4.6.0.tgz#124c8371e192f1218746ce60b6aa0f175d4dcda4" + integrity sha512-0PDoSBM9PXb+Io0pRnw2CmO7aV9W8FC/BqBRNhLxzM3/e5Kfj7BLy0OWkkSB58ULg6Md6r+6jkGOTUhut/35rg== + dependencies: + bcp-47-match "^1.0.3" + bcp-47-normalize "^1.1.1" + codem-isoboxer "0.3.6" + es6-promise "^4.2.8" + fast-deep-equal "2.0.1" + html-entities "^1.2.1" + imsc "^1.0.2" + localforage "^1.7.1" + path-browserify "^1.0.1" + ua-parser-js "^1.0.2" + dayjs@^1.11.7: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" @@ -3024,6 +3089,11 @@ delaunator@5: dependencies: robust-predicates "^3.0.0" +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3134,6 +3204,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -3223,6 +3298,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.2.5, es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + esbuild@^0.16.14, esbuild@~0.16.17: version "0.16.17" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" @@ -3306,6 +3386,21 @@ execa@^7.0.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +execa@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.0.tgz#50c6f39438b7ce407e8c7a6829c72b074778238d" + integrity sha512-T6nIJO3LHxUZ6ahVRaxXz9WLEruXLqdcluA+UuTptXmLM7nDAn9lx9IfkxPyzEL21583qSt4RmL44pO71EHaJQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -3348,6 +3443,11 @@ extglob@^2.0.2, extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +fast-deep-equal@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3745,6 +3845,16 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== +hls.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.3.4.tgz#8212a3f95c3321f64a586f20e67876f3a9d09488" + integrity sha512-iFEwVqtEDk6sKotcTwtJ5OMo/nuDTk9PrpB8FI2J2WYf8EriTVfR4FaK0aNyYtwbYeRSWCXJKlz23xeREdlNYg== + +html-entities@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + htmlparser2@^3.9.2: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -3794,11 +3904,23 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immutable@^4.0.0: version "4.2.4" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== +imsc@^1.0.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/imsc/-/imsc-1.1.3.tgz#e96a60a50d4000dd7b44097272768b9fd6a4891d" + integrity sha512-IY0hMkVTNoqoYwKEp5UvNNKp/A5jeJUOrIO7judgOyhHT+xC6PA4VBOMAOhdtAYbMRHx9DTgI8p6Z6jhYQPFDA== + dependencies: + sax "1.2.1" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3853,6 +3975,19 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-array-buffer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" @@ -3922,6 +4057,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -4243,7 +4383,7 @@ kind-of@^5.0.0, kind-of@^5.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -4263,6 +4403,13 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + lilconfig@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" @@ -4299,6 +4446,18 @@ lit@^2.6.1: lit-element "^3.2.0" lit-html "^2.6.0" +loadjs@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loadjs/-/loadjs-4.2.0.tgz#2a0336376397a6a43edf98c9ec3229ddd5abb6f6" + integrity sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA== + +localforage@^1.7.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -4571,6 +4730,14 @@ moment-mini@^2.29.4: resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.29.4.tgz#cbbcdc58ce1b267506f28ea6668dbe060a32758f" integrity sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg== +mpegts.js@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/mpegts.js/-/mpegts.js-1.7.2.tgz#4bbb7f813fb87514466d74d0dfb75f801b3b117b" + integrity sha512-qQ1ELBDC4IAqpULFuFzp3hoQeKwD5BCR3UM9Lk2+kj9jCWcXl19spF7PdzX0ZljghPHAj/VL2ajBbGyMWk2fgA== + dependencies: + es6-promise "^4.2.5" + webworkify-webpack "^2.1.5" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4715,6 +4882,13 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +option-validator@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/option-validator/-/option-validator-2.0.6.tgz#a314dae65e26db5f948ef0ff96fc88f18bb76ed6" + integrity sha512-tmZDan2LRIRQyhUGvkff68/O0R8UmF+Btmiiz0SmSw2ng3CfPZB9wJlIjHpe/MKUZqyIZkVIXCrwr1tIN+0Dzg== + dependencies: + kind-of "^6.0.3" + ora@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/ora/-/ora-6.1.2.tgz#7b3c1356b42fd90fb1dad043d5dbe649388a0bf5" @@ -4769,6 +4943,11 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4809,6 +4988,22 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +plyr@^3.7.7: + version "3.7.7" + resolved "https://registry.yarnpkg.com/plyr/-/plyr-3.7.7.tgz#f7d20ab9297645d1ad3f68c7c66db6c3d8eef9a8" + integrity sha512-8B2b0HP+j/jKM7GrYdEuSi1hIF3BnNzjaBsBa3bx4/SO9omX3EfhCi78ZFh/0QuCKlwpTBusTMMZ3Hq6bJ5d/g== + dependencies: + core-js "^3.26.1" + custom-event-polyfill "^1.0.7" + loadjs "^4.2.0" + rangetouch "^2.0.1" + url-polyfill "^1.1.12" + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -4945,6 +5140,16 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +qrcode@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" + integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== + dependencies: + dijkstrajs "^1.0.1" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" + query-string@^6.0.0: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -4967,6 +5172,11 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +rangetouch@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/rangetouch/-/rangetouch-2.0.1.tgz#c01105110fd3afca2adcb1a580692837d883cb70" + integrity sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA== + raphael@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/raphael/-/raphael-2.3.0.tgz#eabeb09dba861a1d4cee077eaafb8c53f3131f89" @@ -5216,6 +5426,20 @@ sass@^1.58.3: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sass@^1.59.2: + version "1.59.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.59.2.tgz#537f6d11614d4f20f97696f23ad358ee398b1937" + integrity sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -5686,6 +5910,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +ua-parser-js@^1.0.2: + version "1.0.34" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.34.tgz#b33f41c415325839f354005d25a2f588be296976" + integrity sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -5799,6 +6028,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== +url-polyfill@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/url-polyfill/-/url-polyfill-1.1.12.tgz#6cdaa17f6b022841b3aec0bf8dbd87ac0cd33331" + integrity sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A== + url-slug@^2.0.0: version "2.3.2" resolved "https://registry.yarnpkg.com/url-slug/-/url-slug-2.3.2.tgz#eab21da0e227deba10610c7b01ec4af20babea21" @@ -5873,6 +6107,29 @@ vuepress-plugin-comment2@2.0.0-beta.184: vuepress-plugin-sass-palette "2.0.0-beta.184" vuepress-shared "2.0.0-beta.184" +vuepress-plugin-components@^2.0.0-beta.193: + version "2.0.0-beta.193" + resolved "https://registry.yarnpkg.com/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.193.tgz#caa3670516aa43956be25756e61d120a6707d3d2" + integrity sha512-0QzcS/0wRAPIsE5b2fXStAzX3mZqkAlVPNsgggSvlkZgNQq2AGmDz6zt7syH+k58dnL8IxV+7rOS6iIsQQTDNQ== + dependencies: + "@stackblitz/sdk" "^1.8.2" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" + artplayer "^4.6.2" + balloon-css "^1.2.0" + dashjs "^4.6.0" + hls.js "^1.3.4" + mpegts.js "^1.7.2" + plyr "^3.7.7" + qrcode "^1.5.1" + vue "^3.2.47" + vue-router "^4.1.6" + vuepress-plugin-reading-time2 "2.0.0-beta.193" + vuepress-plugin-sass-palette "2.0.0-beta.193" + vuepress-shared "2.0.0-beta.193" + vuepress-plugin-copy-code2@2.0.0-beta.184: version "2.0.0-beta.184" resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.184.tgz#df5e259353cb8b85934452b3960673df5f7838a5" @@ -5932,6 +6189,13 @@ vuepress-plugin-md-enhance@2.0.0-beta.184: vuepress-plugin-sass-palette "2.0.0-beta.184" vuepress-shared "2.0.0-beta.184" +vuepress-plugin-reading-time2@2.0.0-beta.193: + version "2.0.0-beta.193" + resolved "https://registry.yarnpkg.com/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.193.tgz#34efedcb16a51edeb1ae9a9b2fcc0a1db91f3035" + integrity sha512-3EM0lUD2l5rRvX6POLSH7k8JnZWzeD4qSoBKTz0HlD5KuRk/u+dpiRvaLM7jdvwv8O9fciXpddSH3j9JTJ+Kfg== + dependencies: + vuepress-shared "2.0.0-beta.193" + vuepress-plugin-sass-palette@2.0.0-beta.184: version "2.0.0-beta.184" resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.184.tgz#ed6a7923fb2062a07387169f162e3ffb9f8a8acd" @@ -5943,6 +6207,17 @@ vuepress-plugin-sass-palette@2.0.0-beta.184: sass "^1.58.3" vuepress-shared "2.0.0-beta.184" +vuepress-plugin-sass-palette@2.0.0-beta.193: + version "2.0.0-beta.193" + resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.193.tgz#810047c91779883cf63a6ead8388b4991d0fcb4f" + integrity sha512-HxaKz1kXx4eG98t+plOiQa4ZOZmZK/HEvPsIaaX/w2wIvqBNF+n5tRRKiFmf1bfue0bdseTjAad36P9276MZUQ== + dependencies: + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + chokidar "^3.5.3" + sass "^1.59.2" + vuepress-shared "2.0.0-beta.193" + vuepress-plugin-seo2@2.0.0-beta.184: version "2.0.0-beta.184" resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.184.tgz#8df79fa5029391eda06cb0087d9eb8823cb6ff7d" @@ -5971,6 +6246,25 @@ vuepress-shared@2.0.0-beta.184: vue "^3.2.47" vue-router "^4.1.6" +vuepress-shared@2.0.0-beta.193: + version "2.0.0-beta.193" + resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.193.tgz#6f4b75f3fbaa1394067dbf42d93ae792a8602268" + integrity sha512-ytJhikAPx2p8TyDr1RAy/rz6dP3VKHbXKHmdY4qH4dPxSlABHNBADNbHv0lnMBIZJxBB4V9tbIBKh7Ut+Xy/Aw== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" + cheerio "1.0.0-rc.12" + dayjs "^1.11.7" + execa "^7.1.0" + fflate "^0.7.4" + gray-matter "^4.0.3" + semver "^7.3.8" + striptags "^3.2.0" + vue "^3.2.47" + vue-router "^4.1.6" + vuepress-vite@2.0.0-beta.61: version "2.0.0-beta.61" resolved "https://registry.yarnpkg.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.61.tgz#04058551e6be014e9f2dee14c5d8043b158e032d" @@ -6005,6 +6299,11 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webworkify-webpack@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/webworkify-webpack/-/webworkify-webpack-2.1.5.tgz#bf4336624c0626cbe85cf1ffde157f7aa90b1d1c" + integrity sha512-2akF8FIyUvbiBBdD+RoHpoTbHMQF2HwjcxfDvgztAX5YwbZNyrtfUMgvfgFVsgDhDPVTlkbb5vyasqDHfIDPQw== + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" From 8a6cdc72b8adee99172918150492fa808b9aa3bb Mon Sep 17 00:00:00 2001 From: itlemon Date: Thu, 16 Mar 2023 22:35:49 +0800 Subject: [PATCH 33/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84broker=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\346\234\272\345\210\266.md" | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index ce22863..d7a659b 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -318,33 +318,42 @@ scheduledFutures.add(this.scheduledExecutorService.scheduleAtFixedRate(new Abstr * @param forceRegister 是否是强制注册 */ public synchronized void registerBrokerAll(final boolean checkOrderConfig, boolean oneway, boolean forceRegister) { - // 将Topic配置进行包装,其实就是一些默认的topic信息 - TopicConfigSerializeWrapper topicConfigWrapper = - this.getTopicConfigManager().buildTopicConfigSerializeWrapper(); + + // 创建一个TopicConfig和TopicQueueMapping相关的包装类对象 + TopicConfigAndMappingSerializeWrapper topicConfigWrapper = new TopicConfigAndMappingSerializeWrapper(); + + // 包装版本对象和系统自带的一些Topic配置信息,具体有哪些Topic,可以从TopicValidator类中看到 + topicConfigWrapper.setDataVersion(this.getTopicConfigManager().getDataVersion()); + topicConfigWrapper.setTopicConfigTable(this.getTopicConfigManager().getTopicConfigTable()); + + // 包装TopicQueueMapping相关的映射信息 + topicConfigWrapper.setTopicQueueMappingInfoMap(this.getTopicQueueMappingManager().getTopicQueueMappingTable().entrySet().stream().map( + entry -> new AbstractMap.SimpleImmutableEntry<>(entry.getKey(), TopicQueueMappingDetail.cloneAsMappingInfo(entry.getValue())) + ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); // 如果Broker只有读权限或者写权限,那么需要将Topic的权限设置为和Broker相同 if (!PermName.isWriteable(this.getBrokerConfig().getBrokerPermission()) - || !PermName.isReadable(this.getBrokerConfig().getBrokerPermission())) { + || !PermName.isReadable(this.getBrokerConfig().getBrokerPermission())) { ConcurrentHashMap topicConfigTable = new ConcurrentHashMap<>(); for (TopicConfig topicConfig : topicConfigWrapper.getTopicConfigTable().values()) { TopicConfig tmp = - new TopicConfig(topicConfig.getTopicName(), topicConfig.getReadQueueNums(), - topicConfig.getWriteQueueNums(), - this.brokerConfig.getBrokerPermission()); + new TopicConfig(topicConfig.getTopicName(), topicConfig.getReadQueueNums(), topicConfig.getWriteQueueNums(), + topicConfig.getPerm() & this.brokerConfig.getBrokerPermission(), topicConfig.getTopicSysFlag()); topicConfigTable.put(topicConfig.getTopicName(), tmp); } topicConfigWrapper.setTopicConfigTable(topicConfigTable); } - // 判断是否需要注册,如果不满足强制注册,那么就需要调用needRegister来判断是否需要注册 - // needRegister内部逻辑也很简单,就是去请求NameServer,判断NameServer存储的Broker信息 + // forceRegister默认情况下是true,如果为false,那么就需要调用needRegister来判断是否需要注册 + // needRegister内部逻辑也很简单,就是去请求所有的NameServer,判断NameServer存储的Broker信息 // 是否和当前的Broker版本信息是否一致,如果是一致的,那么就不需要注册 if (forceRegister || needRegister(this.brokerConfig.getBrokerClusterName(), - this.getBrokerAddr(), - this.brokerConfig.getBrokerName(), - this.brokerConfig.getBrokerId(), - this.brokerConfig.getRegisterBrokerTimeoutMills())) { - // Broker向NameServer注册的主要方法 + this.getBrokerAddr(), + this.brokerConfig.getBrokerName(), + this.brokerConfig.getBrokerId(), + this.brokerConfig.getRegisterBrokerTimeoutMills(), + this.brokerConfig.isInBrokerContainer())) { + // 注册Broker信息到NameServer的核心逻辑 doRegisterBrokerAll(checkOrderConfig, oneway, topicConfigWrapper); } } From 290953c8975b65a4232765a3aec11911c7c4507d Mon Sep 17 00:00:00 2001 From: itlemon Date: Fri, 17 Mar 2023 10:17:10 +0800 Subject: [PATCH 34/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84broker=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index d7a659b..1c87781 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -109,7 +109,8 @@ BrokerLiveInfo 中各个属性含义如下所示: ### 1.2 路由信息真实存储状况 文章《[NameServer的启动原理](./2-1NameServer的启动原理.md)》第一张图是一个 $2$ 主 $2$ 从的集群部署方式,集群中包含 $2$ 个 Master 的 Broker 和 $2$ 个 Slave 的 Broker,使用 BrokerData 存储上述部署方式,其表现为以下形式: -![在这里插入图片描述](https://img-blog.csdnimg.cn/20210213185641205.png) + +![20210213185641205](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/20210213185641205.png) 我们启动一个 NameServer 服务,并且启动四个 Broker 服务(分别是 BrokerStartup-am、BrokerStartup-as、BrokerStartup-bm、BrokerStartup-bs ),按照上面的图展示的方式来进行部署,一起验证一下 RouteInfoManager 内部的数据存储的内容。 为了可以在本机 IntelliJ IDEA 中启动四个 Broker 实例,我们需要为这四个 Broker 实例设置独立的 `ROCKETMQ_HOME`,一般企业生产环境,各个 Broker 基本独立部署在独立的物理机中,真实生产环境, `ROCKETMQ_HOME` 可以是一样的,但是本篇文章的验证案例,是需要在同一台机器上部署,所以各个 Broker 实例的 `ROCKETMQ_HOME` 要设置为不一样的。另外,Broker 默认的监听端口是 $10911$,我们也需要在配置文件 `broker.conf` 配置一下启动端口,将将每个 Broker 实例配置成不同的端口,这样可以防止各个 Broker 因端口占用而无法启动。 From ed8e5205629a8434d1ffb6aecef70a70507726cc Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 20 Mar 2023 23:12:00 +0800 Subject: [PATCH 35/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84broker=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\347\220\206\346\234\272\345\210\266.md" | 116 +++++++++++------- 1 file changed, 71 insertions(+), 45 deletions(-) diff --git "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" index 1c87781..e2f47db 100644 --- "a/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" +++ "b/docs/resources/middleware/rocketmq/2-2NameServer\347\232\204\350\267\257\347\224\261\347\256\241\347\220\206\346\234\272\345\210\266.md" @@ -360,23 +360,27 @@ public synchronized void registerBrokerAll(final boolean checkOrderConfig, boole } ``` -在doRegisterBrokerAll方法内,最主要的就是调用brokerOuterAPI的registerBrokerAll接口来向NameServer进行注册。 +在 doRegisterBrokerAll 方法内,最主要的就是调用 brokerOuterAPI 的 registerBrokerAll 接口来向 NameServer 进行注册。 ```java +// 注册Broker信息到NameServer的核心逻辑 List registerBrokerResultList = this.brokerOuterAPI.registerBrokerAll( - this.brokerConfig.getBrokerClusterName(), - this.getBrokerAddr(), - this.brokerConfig.getBrokerName(), - this.brokerConfig.getBrokerId(), - this.getHAServerAddr(), - topicConfigWrapper, - this.filterServerManager.buildNewFilterServerList(), - oneway, - this.brokerConfig.getRegisterBrokerTimeoutMills(), - this.brokerConfig.isCompressedRegister()); + this.brokerConfig.getBrokerClusterName(), + this.getBrokerAddr(), + this.brokerConfig.getBrokerName(), + this.brokerConfig.getBrokerId(), + this.getHAServerAddr(), + topicConfigWrapper, + this.filterServerManager.buildNewFilterServerList(), + oneway, + this.brokerConfig.getRegisterBrokerTimeoutMills(), + this.brokerConfig.isEnableSlaveActingMaster(), + this.brokerConfig.isCompressedRegister(), + this.brokerConfig.isEnableSlaveActingMaster() ? this.brokerConfig.getBrokerNotActiveTimeoutMillis() : null, + this.getBrokerIdentity()); ``` -接下来的操作就是遍历每一个NameServer服务地址,然后分别向每一个NameServer进行注册操作,具体代码如下所示: +registerBrokerAll 方法的主要逻辑就是遍历每一个 NameServer 服务地址,然后分别向每一个 NameServer 进行注册操作,具体代码如下所示: ```java public List registerBrokerAll( @@ -389,14 +393,18 @@ public List registerBrokerAll( final List filterServerList, final boolean oneway, final int timeoutMills, - final boolean compressed) { + final boolean enableActingMaster, + final boolean compressed, + final Long heartbeatTimeoutMillis, + final BrokerIdentity brokerIdentity) { // 封装注册结果的容器 - final List registerBrokerResultList = Lists.newArrayList(); + final List registerBrokerResultList = new CopyOnWriteArrayList<>(); + // 获取NameServer列表 - List nameServerAddressList = this.remotingClient.getNameServerAddressList(); - if (nameServerAddressList != null && !nameServerAddressList.isEmpty()) { - // 构建注册Broker的请求头对象 + List nameServerAddressList = this.remotingClient.getAvailableNameSrvList(); + if (nameServerAddressList != null && nameServerAddressList.size() > 0) { + // 构建注册Broker信息的请求头对象 final RegisterBrokerRequestHeader requestHeader = new RegisterBrokerRequestHeader(); // 将Broker的主要元信息存储到请求头中 requestHeader.setBrokerAddr(brokerAddr); @@ -404,40 +412,59 @@ public List registerBrokerAll( requestHeader.setBrokerName(brokerName); requestHeader.setClusterName(clusterName); requestHeader.setHaServerAddr(haServerAddr); - requestHeader.setCompressed(compressed); + requestHeader.setEnableActingMaster(enableActingMaster); + requestHeader.setCompressed(false); + // 该参数要特殊说明一下:只有当enableActingMaster为true的时候才生效(在container模式下),这个心跳超时默认时间是10s, + if (heartbeatTimeoutMillis != null) { + requestHeader.setHeartbeatTimeoutMillis(heartbeatTimeoutMillis); + } - // 构建请求体 + // 构建注册Broker信息的请求体 RegisterBrokerBody requestBody = new RegisterBrokerBody(); + // 将topic配置信息及过滤器服务信息数据封装到请求体中 - requestBody.setTopicConfigSerializeWrapper(topicConfigWrapper); + requestBody.setTopicConfigSerializeWrapper(TopicConfigAndMappingSerializeWrapper.from(topicConfigWrapper)); requestBody.setFilterServerList(filterServerList); + // 将请求体进行编码(是否进行gzip压缩,默认为false) final byte[] body = requestBody.encode(compressed); final int bodyCrc32 = UtilAll.crc32(body); requestHeader.setBodyCrc32(bodyCrc32); + + // 创建计数器,用来计数完成注册的数量 final CountDownLatch countDownLatch = new CountDownLatch(nameServerAddressList.size()); + // 遍历所有的NameServer地址,分别向每一个NameServer进行注册 for (final String namesrvAddr : nameServerAddressList) { - brokerOuterExecutor.execute(() -> { - try { - RegisterBrokerResult result = - registerBroker(namesrvAddr, oneway, timeoutMills, requestHeader, body); - if (result != null) { - registerBrokerResultList.add(result); - } + brokerOuterExecutor.execute(new AbstractBrokerRunnable(brokerIdentity) { + @Override + public void run2() { + try { - log.info("register broker[{}]to name server {} OK", brokerId, namesrvAddr); - } catch (Exception e) { - log.warn("registerBroker Exception, {}", namesrvAddr, e); - } finally { - countDownLatch.countDown(); + // 注册Broker,底层调用netty客户端发送请求到NameServer + RegisterBrokerResult result = registerBroker(namesrvAddr, oneway, timeoutMills, requestHeader, body); + + // 将注册结果添加到结果列表中 + if (result != null) { + registerBrokerResultList.add(result); + } + + LOGGER.info("Registering current broker to name server completed. TargetHost={}", namesrvAddr); + } catch (Exception e) { + LOGGER.error("Failed to register current broker to name server. TargetHost={}", namesrvAddr, e); + } finally { + countDownLatch.countDown(); + } } }); } try { - countDownLatch.await(timeoutMills, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { + // 完成所有注册的默认超时时间是24s,如果在24s内没有完成注册,那么就打印该日志 + if (!countDownLatch.await(timeoutMills, TimeUnit.MILLISECONDS)) { + LOGGER.warn("Registration to one or more name servers does NOT complete within deadline. Timeout threshold: {}ms", timeoutMills); + } + } catch (InterruptedException ignore) { } } @@ -445,7 +472,7 @@ public List registerBrokerAll( } ``` -分别向每一个NameServer注册时候,调用的都是同一个方法:registerBroker,底层调用的都是由Netty封装的远程连接,通过请求码来获取远程调用连接,将注册信息发送过去。注册Broker使用到的请求码是`RequestCode.REGISTER_BROKER`,不同的需求使用的请求码是不一样的,比如注销Broker使用到的是`RequestCode.UNREGISTER_BROKER`。 +分别向每一个 NameServer 注册时候,调用的都是同一个方法:registerBroker,底层调用的都是由 Netty 封装的远程连接,通过请求码来获取远程调用连接,将注册信息发送过去。注册 Broker 使用到的请求码是 `RequestCode.REGISTER_BROKER`,不同的需求使用的请求码是不一样的,比如注销 Broker 使用到的是 `RequestCode.UNREGISTER_BROKER`。 ```java private RegisterBrokerResult registerBroker( @@ -454,14 +481,14 @@ private RegisterBrokerResult registerBroker( final int timeoutMills, final RegisterBrokerRequestHeader requestHeader, final byte[] body -) throws RemotingCommandException, MQBrokerException, RemotingConnectException, RemotingSendRequestException, - RemotingTimeoutException, +) throws RemotingCommandException, MQBrokerException, RemotingConnectException, RemotingSendRequestException, RemotingTimeoutException, InterruptedException { - // 根据请求码RequestCode.REGISTER_BROKER获取注册Broker信息的远程连接 + + // 根据请求码RequestCode.REGISTER_BROKER获取注册Broker信息的远程连接请求对象 RemotingCommand request = RemotingCommand.createRequestCommand(RequestCode.REGISTER_BROKER, requestHeader); request.setBody(body); - // 如果是单向消息,也就是不管注册结果如何,那么就调用不同的方法来进行注册 + // 如果是单向消息,也就是不管注册结果如何,它调用invokeOneway方法来进行注册 if (oneway) { try { this.remotingClient.invokeOneway(namesrvAddr, request, timeoutMills); @@ -478,8 +505,7 @@ private RegisterBrokerResult registerBroker( case ResponseCode.SUCCESS: { // 解析注册结果 RegisterBrokerResponseHeader responseHeader = - (RegisterBrokerResponseHeader) response - .decodeCommandCustomHeader(RegisterBrokerResponseHeader.class); + (RegisterBrokerResponseHeader) response.decodeCommandCustomHeader(RegisterBrokerResponseHeader.class); RegisterBrokerResult result = new RegisterBrokerResult(); result.setMasterAddr(responseHeader.getMasterAddr()); result.setHaServerAddr(responseHeader.getHaServerAddr()); @@ -492,15 +518,15 @@ private RegisterBrokerResult registerBroker( break; } - throw new MQBrokerException(response.getCode(), response.getRemark()); + throw new MQBrokerException(response.getCode(), response.getRemark(), requestHeader == null ? null : requestHeader.getBrokerAddr()); } ``` -再往底层分析就是涉及到Netty的知识了,本文主要围绕RocketMQ来进行源码分析,对于Netty,后续将通过其他的文章来讨论。以上内容就是Broker在启动的过程中向指定的NameServer注册元信息的流程分析。 +再往底层分析就是涉及到 Netty 的知识了,本文主要围绕 RocketMQ 来进行源码分析,对于 Netty,后续将通过其他的文章来讨论。以上内容就是 Broker 在启动的过程中向指定的 NameServer 注册元信息的流程分析。 -Broker向指定的NameServer发送了心跳,NameServer接收到心跳后是如何处理的呢?本节中第一小节路由信息管理器中阐述了Broker发送过来的心跳数据是以何种形式存储在路由管理器中,接下来将解析路由信息维护的源代码,方便大家弄清楚其中的原理。 +Broker 向指定的 NameServer 发送了心跳,NameServer 接收到心跳后是如何处理的呢?本节中第一小节路由信息管理器中阐述了 Broker 发送过来的心跳数据是以何种形式存储在路由管理器中,接下来将解析路由信息维护的源代码,方便大家弄清楚其中的原理。 -NameServer在初始化的时候,注册了一个处理器DefaultRequestProcessor,专门用于处理网络请求,已经没有印象的读者可以去文章的开始处看NamesrvController的initialize方法。当远程的注册请求到达的时候,都会由DefaultRequestProcessor的processRequest方法来进行处理,该方法其实就是起到了路由的作用,内部根据请求码来判断该调用哪个API来进行具体的操作,对于Broker注册元信息,其实就是转发给RouteInfoManager的registerBroker方法来进行处理的。 +NameServer 在初始化的时候,注册了一个处理器 DefaultRequestProcessor,专门用于处理网络请求,已经没有印象的读者可以去文章的开始处看 NamesrvController 的 initialize 方法。当远程的注册请求到达的时候,都会由 DefaultRequestProcessor 的 processRequest 方法来进行处理,该方法其实就是起到了路由的作用,内部根据请求码来判断该调用哪个 API 来进行具体的操作,对于 Broker 注册元信息,其实就是转发给 RouteInfoManager 的registerBroker 方法来进行处理的。 ```java /** From a1478f1d6c728066cbb474d866676c8f97511a6a Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 21 Mar 2023 10:42:23 +0800 Subject: [PATCH 36/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 10 +- yarn.lock | 313 ++++++++++++++++++++++++--------------------------- 2 files changed, 153 insertions(+), 170 deletions(-) diff --git a/package.json b/package.json index c2231bf..a2a8723 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,11 @@ "@vuepress/plugin-pwa-popup": "2.0.0-beta.61", "@vuepress/plugin-search": "2.0.0-beta.61", "vuepress": "2.0.0-beta.61", - "vuepress-plugin-comment2": "2.0.0-beta.184", - "vuepress-plugin-components": "2.0.0-beta.193", - "vuepress-plugin-copy-code2": "2.0.0-beta.184", - "vuepress-plugin-md-enhance": "2.0.0-beta.184", - "vuepress-plugin-seo2": "2.0.0-beta.184" + "vuepress-plugin-comment2": "2.0.0-beta.196", + "vuepress-plugin-components": "2.0.0-beta.196", + "vuepress-plugin-copy-code2": "2.0.0-beta.196", + "vuepress-plugin-md-enhance": "2.0.0-beta.196", + "vuepress-plugin-seo2": "2.0.0-beta.196" }, "scripts": { "docs:dev": "vuepress dev docs --clean-cache", diff --git a/yarn.lock b/yarn.lock index 2af173c..9504c7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,21 +52,21 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.0.tgz#1341aefdcc14ccc7553fcc688dd8986a2daffc13" - integrity sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA== +"@babel/core@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" + integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.0" + "@babel/generator" "^7.21.3" "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.0" + "@babel/helper-module-transforms" "^7.21.2" "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.0" + "@babel/parser" "^7.21.3" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" + "@babel/traverse" "^7.21.3" + "@babel/types" "^7.21.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -82,7 +82,7 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.21.0", "@babel/generator@^7.21.1": +"@babel/generator@^7.21.1": version "7.21.1" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== @@ -92,6 +92,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" + integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== + dependencies: + "@babel/types" "^7.21.3" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" @@ -215,7 +225,7 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" -"@babel/helper-module-transforms@^7.21.0": +"@babel/helper-module-transforms@^7.21.2": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== @@ -341,11 +351,16 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== -"@babel/parser@^7.21.0", "@babel/parser@^7.21.2": +"@babel/parser@^7.21.2": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== +"@babel/parser@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" + integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -992,6 +1007,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" + integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.21.3" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.21.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.21.3" + "@babel/types" "^7.21.3" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.4.4": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" @@ -1010,6 +1041,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.21.3": + version "7.21.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" + integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@braintree/sanitize-url@^6.0.0": version "6.0.2" resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" @@ -1672,10 +1712,10 @@ dependencies: "@vue/shared" "3.2.47" -"@vue/repl@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@vue/repl/-/repl-1.3.2.tgz#f14b3f593ec80870963646f338b7950702ea4c46" - integrity sha512-5joGOuTFmjaugG3E1h/oP1EXSMcVXRUwLIoo8xvYQnqDrCT6g1SfsH1pfei5PpC5DUxMX1584CekZu6REgGYkQ== +"@vue/repl@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@vue/repl/-/repl-1.3.3.tgz#a53ab0d07b9da37b06982eae43dbd729f14675a9" + integrity sha512-mrN3Gd4CIaiIiRdi7/pAOH9rPud8q8I5svLurSoyxLhxFXs9WdfaKZlirExSJIuecHYFiAAozTBtb8XQPNhCHw== "@vue/runtime-core@3.2.47": version "3.2.47" @@ -2004,16 +2044,6 @@ picocolors "^1.0.0" upath "^2.0.1" -"@vueuse/core@^9.10.0": - version "9.12.0" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.12.0.tgz#e5b20f901e081c7ae5fe0e5f3af217929034eefe" - integrity sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg== - dependencies: - "@types/web-bluetooth" "^0.0.16" - "@vueuse/metadata" "9.12.0" - "@vueuse/shared" "9.12.0" - vue-demi "*" - "@vueuse/core@^9.13.0": version "9.13.0" resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" @@ -2024,23 +2054,11 @@ "@vueuse/shared" "9.13.0" vue-demi "*" -"@vueuse/metadata@9.12.0": - version "9.12.0" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.12.0.tgz#19a0fefcba6a66a2382af10a7a67ebad6eec1f27" - integrity sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ== - "@vueuse/metadata@9.13.0": version "9.13.0" resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== -"@vueuse/shared@9.12.0": - version "9.12.0" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.12.0.tgz#e6597da80084cba8fc3d6545f4c2fa9817b80428" - integrity sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ== - dependencies: - vue-demi "*" - "@vueuse/shared@9.13.0": version "9.13.0" resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" @@ -2048,15 +2066,15 @@ dependencies: vue-demi "*" -"@waline/client@^2.14.7": - version "2.14.7" - resolved "https://registry.yarnpkg.com/@waline/client/-/client-2.14.7.tgz#5226af39c3ab7e762fee6d58215006b587b41370" - integrity sha512-hTfh2AbWQCX/oS4Hgr0W9cf79pHYf7X6Km5AcBDAmOL6AI7a5kP9qo9y2mcEzdfn9LK06P5Uuk8HY8vxQbgcrA== +"@waline/client@^2.14.9": + version "2.14.9" + resolved "https://registry.yarnpkg.com/@waline/client/-/client-2.14.9.tgz#48d0794fef22ff163b195dcf0c52090e64f95ed7" + integrity sha512-j156AgwKskRNtlBWeFj8niN4j6lwS4xg8BKo1A09p1j78rcGhNxf5S9gmzqW/8oDUbnSILOHtweydiRgWEqBag== dependencies: - "@vueuse/core" "^9.10.0" - autosize "^5.0.2" - marked "^4.2.5" - vue "^3.2.45" + "@vueuse/core" "^9.13.0" + autosize "^6.0.1" + marked "^4.2.12" + vue "^3.2.47" abbrev@^1.0.0: version "1.1.1" @@ -2165,15 +2183,15 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -artalk@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/artalk/-/artalk-2.4.4.tgz#7cd3eb58d8d25161017fc66fbdac6e70ed4c2536" - integrity sha512-8O/FjQM+oFnfsfouuej2qjRNfV9/0JJR2jI9vS7neI8zTa4xqu0PChDIR0CtZG8ze0eOKI0taTlEFhmahJUJIQ== +artalk@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/artalk/-/artalk-2.5.2.tgz#416acfa433069978221e084d61f3bc39331ef553" + integrity sha512-qwAtSCRIBadaXyLsVps8DDlawis7KQNQpDfEj2h8xbA8LYv1nTUR4tazb4oVRBOwGSpo1cir8WIT3pq/MkiTLg== dependencies: abortcontroller-polyfill "^1.7.5" hanabi "^0.4.0" insane "^2.6.2" - marked "^4.0.19" + marked "^4.2.12" artplayer@^4.6.2: version "4.6.2" @@ -2219,10 +2237,10 @@ autoprefixer@^10.4.13: picocolors "^1.0.0" postcss-value-parser "^4.2.0" -autosize@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/autosize/-/autosize-5.0.2.tgz#0a327c200dda4a1742817e94dcb8af5700685689" - integrity sha512-FPVt5ynkqUAA9gcMZnJHka1XfQgr1WNd/yRfIjmj5WGmjua+u5Hl9hn8M2nU5CNy2bEIcj1ZUwXq7IOHsfZG9w== +autosize@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/autosize/-/autosize-6.0.1.tgz#64ee78dd7029be959eddd3afbbd33235b957e10f" + integrity sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ== available-typed-arrays@^1.0.5: version "1.0.5" @@ -2982,10 +3000,10 @@ d3@^7.4.0, d3@^7.8.2: d3-transition "3" d3-zoom "3" -dagre-d3-es@7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.8.tgz#14c309c3c08ba8329a7cf51000bd56a369c513d1" - integrity sha512-eykdoYQ4FwCJinEYS0gPL2f2w+BPbSLvnQSJ3Ye1vAoPjdkq6xIMKBv+UkICd3qZE26wBKIn3p+6n0QC7R1LyA== +dagre-d3-es@7.0.9: + version "7.0.9" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz#aca12fccd9d09955a4430029ba72ee6934542a8d" + integrity sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w== dependencies: d3 "^7.8.2" lodash-es "^4.17.21" @@ -3386,10 +3404,10 @@ execa@^7.0.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -execa@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.0.tgz#50c6f39438b7ce407e8c7a6829c72b074778238d" - integrity sha512-T6nIJO3LHxUZ6ahVRaxXz9WLEruXLqdcluA+UuTptXmLM7nDAn9lx9IfkxPyzEL21583qSt4RmL44pO71EHaJQ== +execa@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.1" @@ -3845,10 +3863,10 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== -hls.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.3.4.tgz#8212a3f95c3321f64a586f20e67876f3a9d09488" - integrity sha512-iFEwVqtEDk6sKotcTwtJ5OMo/nuDTk9PrpB8FI2J2WYf8EriTVfR4FaK0aNyYtwbYeRSWCXJKlz23xeREdlNYg== +hls.js@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.3.5.tgz#0e8b0799ecf2feb7ba199f5e95f35ba9552e04f4" + integrity sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew== html-entities@^1.2.1: version "1.4.0" @@ -4560,7 +4578,7 @@ markdown-it@^13.0.1: mdurl "^1.0.1" uc.micro "^1.0.5" -marked@^4.0.19, marked@^4.2.5: +marked@^4.2.12: version "4.2.12" resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== @@ -4610,22 +4628,22 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.0.0.tgz#6f7ae2eda0ab221089dc1eb166938203f2a7b04d" - integrity sha512-syS1qyYCd3EPXCVSpYtefY4D9z9WZAK8hFgjeHR9PAtanybLO162Tu7o5i/nZkqRrJq0Rk8RqskQlhBPgT8eBw== +mermaid@10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.0.2.tgz#8e294ea4890fe86ca7f5a4cd3c10362ec8d3ed98" + integrity sha512-slwoB9WdNUT+/W9VhxLYRLZ0Ey12fIE+cAZjm3FmHTD+0F1uoJETfsNbVS1POnvQZhFYzfT6/z6hJZXgecqVBA== dependencies: "@braintree/sanitize-url" "^6.0.0" cytoscape "^3.23.0" cytoscape-cose-bilkent "^4.1.0" cytoscape-fcose "^2.1.0" d3 "^7.4.0" - dagre-d3-es "7.0.8" + dagre-d3-es "7.0.9" + dayjs "^1.11.7" dompurify "2.4.3" elkjs "^0.8.2" khroma "^2.0.0" lodash-es "^4.17.21" - moment-mini "^2.29.4" non-layered-tidy-tree-layout "^2.0.2" stylis "^4.1.2" ts-dedent "^2.2.0" @@ -4725,11 +4743,6 @@ mj-context-menu@^0.6.1: resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== -moment-mini@^2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.29.4.tgz#cbbcdc58ce1b267506f28ea6668dbe060a32758f" - integrity sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg== - mpegts.js@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/mpegts.js/-/mpegts.js-1.7.2.tgz#4bbb7f813fb87514466d74d0dfb75f801b3b117b" @@ -5426,10 +5439,10 @@ sass@^1.58.3: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@^1.59.2: - version "1.59.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.59.2.tgz#537f6d11614d4f20f97696f23ad358ee398b1937" - integrity sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw== +sass@^1.59.3: + version "1.59.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.59.3.tgz#a1ddf855d75c70c26b4555df4403e1bbf8e4403f" + integrity sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -6090,27 +6103,27 @@ vue@^3.2.45, vue@^3.2.47: "@vue/server-renderer" "3.2.47" "@vue/shared" "3.2.47" -vuepress-plugin-comment2@2.0.0-beta.184: - version "2.0.0-beta.184" - resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.184.tgz#5e5722162177c09cff9cc2788b3b7bed9b20a0f3" - integrity sha512-Bm0/EqwIZ965T5ZsMD4U4XPFqMfkROt0KCi38JCtPoIWPtrt/lzmFw2j7ppu+aGKjWjiC4LEo+7nj9UnaG8ptA== +vuepress-plugin-comment2@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.196.tgz#61bb7a48de1378235981b734c7542de3de6f5a14" + integrity sha512-8z0Y2Q0AvJQwFyinTvtej3SaN85CBsJYTi3PRyXQggjiNxR14tOpWpvIVZmIksDxAxZu4Zp4l7bmbIkZYAbT0g== dependencies: "@vuepress/client" "2.0.0-beta.61" "@vuepress/shared" "2.0.0-beta.61" "@vuepress/utils" "2.0.0-beta.61" - "@waline/client" "^2.14.7" - artalk "^2.4.4" + "@waline/client" "^2.14.9" + artalk "^2.5.1" giscus "^1.2.8" twikoo "^1.6.10" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.184" - vuepress-shared "2.0.0-beta.184" + vuepress-plugin-sass-palette "2.0.0-beta.196" + vuepress-shared "2.0.0-beta.196" -vuepress-plugin-components@^2.0.0-beta.193: - version "2.0.0-beta.193" - resolved "https://registry.yarnpkg.com/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.193.tgz#caa3670516aa43956be25756e61d120a6707d3d2" - integrity sha512-0QzcS/0wRAPIsE5b2fXStAzX3mZqkAlVPNsgggSvlkZgNQq2AGmDz6zt7syH+k58dnL8IxV+7rOS6iIsQQTDNQ== +vuepress-plugin-components@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.196.tgz#54872834fb59d19646259ce372b64605cadeb068" + integrity sha512-wg7bh7OGE/zT4gKizW7SqB49+HqEjsP35u6FKU1vU5IGyLgaIYhOeukbyUzPye1leeoEBqqT+YmivEN1/0lQcg== dependencies: "@stackblitz/sdk" "^1.8.2" "@vuepress/client" "2.0.0-beta.61" @@ -6120,20 +6133,20 @@ vuepress-plugin-components@^2.0.0-beta.193: artplayer "^4.6.2" balloon-css "^1.2.0" dashjs "^4.6.0" - hls.js "^1.3.4" + hls.js "^1.3.5" mpegts.js "^1.7.2" plyr "^3.7.7" qrcode "^1.5.1" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-reading-time2 "2.0.0-beta.193" - vuepress-plugin-sass-palette "2.0.0-beta.193" - vuepress-shared "2.0.0-beta.193" + vuepress-plugin-reading-time2 "2.0.0-beta.196" + vuepress-plugin-sass-palette "2.0.0-beta.196" + vuepress-shared "2.0.0-beta.196" -vuepress-plugin-copy-code2@2.0.0-beta.184: - version "2.0.0-beta.184" - resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.184.tgz#df5e259353cb8b85934452b3960673df5f7838a5" - integrity sha512-fZBPY4ZecFOu9WVY/EH8AODE2ufsr6wulfoybHU7vdzZHoI87pqgMnjSGUmy8aycq6M2VJ++fmLYPX1RXroSPw== +vuepress-plugin-copy-code2@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.196.tgz#3301f9e51a66141f42cdaf65e4483b5dee491654" + integrity sha512-oyB5E2zWOmmNTtG6YUxM1yuPWuzX6qrGE4X8ctlfXFfAGH9p/VosSDUKkNb/g8LEd3umI3kKEjqxgDTq9CfjZg== dependencies: "@vuepress/client" "2.0.0-beta.61" "@vuepress/shared" "2.0.0-beta.61" @@ -6142,15 +6155,15 @@ vuepress-plugin-copy-code2@2.0.0-beta.184: balloon-css "^1.2.0" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.184" - vuepress-shared "2.0.0-beta.184" + vuepress-plugin-sass-palette "2.0.0-beta.196" + vuepress-shared "2.0.0-beta.196" -vuepress-plugin-md-enhance@2.0.0-beta.184: - version "2.0.0-beta.184" - resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.184.tgz#27dd0ed5156b4a79d8e732bc2f7d096e26e6fceb" - integrity sha512-3U2qt6xy4uJ0yBIL3ysCMCxW0crJBORgI8KHBDj5WDhGhvKRn2bMY1pmJURXGd5oIWvSO3DvWV2WkPeny29e4w== +vuepress-plugin-md-enhance@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.196.tgz#248bdc24bdf7a3f08493103f80aef4cf9e6c39c6" + integrity sha512-TNMP9eQsbXOQb9cTKnlxiMtAuhe7iNVSGjdfA2yRaMgOJkFAfk/7lRIEZv+A0YXnjzg4A9+YVaTKg71Ie04VVg== dependencies: - "@babel/core" "^7.21.0" + "@babel/core" "^7.21.3" "@mdit/plugin-align" "^0.3.0" "@mdit/plugin-attrs" "^0.3.0" "@mdit/plugin-container" "^0.3.0" @@ -6171,7 +6184,7 @@ vuepress-plugin-md-enhance@2.0.0-beta.184: "@mdit/plugin-tex" "^0.3.0" "@mdit/plugin-uml" "^0.3.0" "@types/markdown-it" "^12.2.3" - "@vue/repl" "^1.3.2" + "@vue/repl" "^1.3.3" "@vuepress/client" "2.0.0-beta.61" "@vuepress/shared" "2.0.0-beta.61" "@vuepress/utils" "2.0.0-beta.61" @@ -6182,74 +6195,44 @@ vuepress-plugin-md-enhance@2.0.0-beta.184: flowchart.ts "^0.1.2" katex "^0.16.4" markdown-it "^13.0.1" - mermaid "^10.0.0" + mermaid "10.0.2" reveal.js "^4.4.0" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.184" - vuepress-shared "2.0.0-beta.184" - -vuepress-plugin-reading-time2@2.0.0-beta.193: - version "2.0.0-beta.193" - resolved "https://registry.yarnpkg.com/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.193.tgz#34efedcb16a51edeb1ae9a9b2fcc0a1db91f3035" - integrity sha512-3EM0lUD2l5rRvX6POLSH7k8JnZWzeD4qSoBKTz0HlD5KuRk/u+dpiRvaLM7jdvwv8O9fciXpddSH3j9JTJ+Kfg== - dependencies: - vuepress-shared "2.0.0-beta.193" + vuepress-plugin-sass-palette "2.0.0-beta.196" + vuepress-shared "2.0.0-beta.196" -vuepress-plugin-sass-palette@2.0.0-beta.184: - version "2.0.0-beta.184" - resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.184.tgz#ed6a7923fb2062a07387169f162e3ffb9f8a8acd" - integrity sha512-k2lgxvZAN3NbqdonyxOa4Ipg17JzVYuuoYQYpP+gQQZLJpjK/KbniQ3UJGBGK1RGoXjPm2xIfosqi6m9Zdw1Bg== +vuepress-plugin-reading-time2@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.196.tgz#befe935f722cc5b6f00c96056dc826ebac0f0baf" + integrity sha512-SKSWhIDvGKoKRKSlLSIF5Zk4K94Dly1odZlUSSFlgu8uKu/kztdXV02MPOscH9hbyo2+xcxg71NRuszrpYDxeA== dependencies: - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - chokidar "^3.5.3" - sass "^1.58.3" - vuepress-shared "2.0.0-beta.184" + vuepress-shared "2.0.0-beta.196" -vuepress-plugin-sass-palette@2.0.0-beta.193: - version "2.0.0-beta.193" - resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.193.tgz#810047c91779883cf63a6ead8388b4991d0fcb4f" - integrity sha512-HxaKz1kXx4eG98t+plOiQa4ZOZmZK/HEvPsIaaX/w2wIvqBNF+n5tRRKiFmf1bfue0bdseTjAad36P9276MZUQ== +vuepress-plugin-sass-palette@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.196.tgz#c609ae7694207c11915216c178796523c3f52750" + integrity sha512-rB+4l1oOzbHVuYvo3tioPTAQ4pB/jTdS+M9U3n+XGLvkxsIDQCUbnLxmZxw1mESggZ+97e0qjniAY1KvZ2wKtQ== dependencies: "@vuepress/shared" "2.0.0-beta.61" "@vuepress/utils" "2.0.0-beta.61" chokidar "^3.5.3" - sass "^1.59.2" - vuepress-shared "2.0.0-beta.193" + sass "^1.59.3" + vuepress-shared "2.0.0-beta.196" -vuepress-plugin-seo2@2.0.0-beta.184: - version "2.0.0-beta.184" - resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.184.tgz#8df79fa5029391eda06cb0087d9eb8823cb6ff7d" - integrity sha512-dUErzGuzC+xcloOrKLrm44Gg7JH99QjCQ6CSJpWoO/AIc+ur0J8RcPLMiCYOYPz2XXSAds+N+23mLBNpS4Q92g== +vuepress-plugin-seo2@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.196.tgz#4e513a867ae2797ecb207e52a88bdb4951708031" + integrity sha512-ADAfopqI4AbvVodC/wuw32MjlFfX1fQ0SbPnuHomjlBQO5/VsgtF8+kWb1YKl7RnagK07tMCXNyvnJohbwEz+Q== dependencies: "@vuepress/shared" "2.0.0-beta.61" "@vuepress/utils" "2.0.0-beta.61" - vuepress-shared "2.0.0-beta.184" - -vuepress-shared@2.0.0-beta.184: - version "2.0.0-beta.184" - resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.184.tgz#c8af539345208a2dfe1e24d011d7e69e4c47d88c" - integrity sha512-Ez9wm/X0wAoUUaRrz4/8p+mhK9QjQ9hLbBaMX3xGYy+QwIsaQR1iha62OdjQMq46xvAEldePJINOl+ZOjG1hwA== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@vueuse/core" "^9.13.0" - cheerio "1.0.0-rc.12" - dayjs "^1.11.7" - execa "^7.0.0" - fflate "^0.7.4" - gray-matter "^4.0.3" - semver "^7.3.8" - striptags "^3.2.0" - vue "^3.2.47" - vue-router "^4.1.6" + vuepress-shared "2.0.0-beta.196" -vuepress-shared@2.0.0-beta.193: - version "2.0.0-beta.193" - resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.193.tgz#6f4b75f3fbaa1394067dbf42d93ae792a8602268" - integrity sha512-ytJhikAPx2p8TyDr1RAy/rz6dP3VKHbXKHmdY4qH4dPxSlABHNBADNbHv0lnMBIZJxBB4V9tbIBKh7Ut+Xy/Aw== +vuepress-shared@2.0.0-beta.196: + version "2.0.0-beta.196" + resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.196.tgz#a59739dc5c7c4abd8d579455fecdca666e98eb16" + integrity sha512-Hz8Yeb+mwkzMLRnrF8RkpaTzAvCqrZdVqFJ5JRhFOBLhWXWwemc0z8pSd+ph55ASu01hFRfVR13cMJwK/uRbvQ== dependencies: "@vuepress/client" "2.0.0-beta.61" "@vuepress/shared" "2.0.0-beta.61" @@ -6257,7 +6240,7 @@ vuepress-shared@2.0.0-beta.193: "@vueuse/core" "^9.13.0" cheerio "1.0.0-rc.12" dayjs "^1.11.7" - execa "^7.1.0" + execa "^7.1.1" fflate "^0.7.4" gray-matter "^4.0.3" semver "^7.3.8" From 5974e9d419c67c3b820ea6c4b844d5dcbb3e66e7 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 22 Mar 2023 14:39:04 +0800 Subject: [PATCH 37/61] =?UTF-8?q?mod:=20=E5=8F=98=E6=9B=B4=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 6 +++--- deploy_dev.sh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deploy.sh b/deploy.sh index 6dc9830..8941ccd 100755 --- a/deploy.sh +++ b/deploy.sh @@ -39,6 +39,6 @@ else fi git fetch --all && git reset --hard origin/master && git pull -sudo yarn install -sudo yarn docs:build -sudo nohup yarn docs:serve & \ No newline at end of file +yarn install +yarn docs:build +nohup yarn docs:serve & \ No newline at end of file diff --git a/deploy_dev.sh b/deploy_dev.sh index 23b1c75..e4991c2 100755 --- a/deploy_dev.sh +++ b/deploy_dev.sh @@ -39,6 +39,6 @@ else fi git fetch --all && git reset --hard origin/dev && git pull -sudo yarn install -sudo yarn docs:build -sudo nohup yarn docs:serve & \ No newline at end of file +yarn install +yarn docs:build +nohup yarn docs:serve & \ No newline at end of file From 7647f90b4d26f153106055715ff56611c0915419 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 22 Mar 2023 15:54:46 +0800 Subject: [PATCH 38/61] =?UTF-8?q?mod:=20=E5=88=A0=E9=99=A4vuepress-plugin-?= =?UTF-8?q?components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 26 ++--- package.json | 1 - yarn.lock | 247 +-------------------------------------- 3 files changed, 14 insertions(+), 260 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 1b1a7fa..9774492 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -10,7 +10,7 @@ import {commentPlugin} from 'vuepress-plugin-comment2' import {seoPlugin} from 'vuepress-plugin-seo2' import {svgIconPlugin} from '@goy/vuepress-plugin-svg-icons' import {mdEnhancePlugin} from 'vuepress-plugin-md-enhance' -import {componentsPlugin} from 'vuepress-plugin-components' +// import {componentsPlugin} from 'vuepress-plugin-components' import {head, navbarZh, sidebarZh,} from './configs' @@ -66,7 +66,7 @@ export default defineUserConfig({ // use shiki plugin in production mode instead prismjs: true, // 这里关闭默认主题的返回顶端 - backToTop: false, + // backToTop: false, }, }), @@ -148,16 +148,16 @@ export default defineUserConfig({ }), // componentsPlugin - componentsPlugin({ - components: ['FontIcon'], - componentOptions: { - fontIcon: { - assets: '//at.alicdn.com/t/c/font_2154804_snaqmfegfdf.css', - }, - }, - rootComponents: { - backToTop: true, - } - }), + // componentsPlugin({ + // components: ['FontIcon'], + // componentOptions: { + // fontIcon: { + // assets: '//at.alicdn.com/t/c/font_2154804_snaqmfegfdf.css', + // }, + // }, + // rootComponents: { + // backToTop: true, + // } + // }), ], }) \ No newline at end of file diff --git a/package.json b/package.json index a2a8723..ef8c4f9 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,6 @@ "@vuepress/plugin-search": "2.0.0-beta.61", "vuepress": "2.0.0-beta.61", "vuepress-plugin-comment2": "2.0.0-beta.196", - "vuepress-plugin-components": "2.0.0-beta.196", "vuepress-plugin-copy-code2": "2.0.0-beta.196", "vuepress-plugin-md-enhance": "2.0.0-beta.196", "vuepress-plugin-seo2": "2.0.0-beta.196" diff --git a/yarn.lock b/yarn.lock index 9504c7f..342870c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1533,11 +1533,6 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@stackblitz/sdk@^1.8.2": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@stackblitz/sdk/-/sdk-1.8.2.tgz#f91c7b35cd5c4523fcacb74b51cee4ec92b608e0" - integrity sha512-3aTg0Tb9dNs1huPkpdYxPEX/yc8A28eZneUMOEJzOLi7EJwl5onr9gCAVjIOkN4WLYu1iBSiJiGBYT629bZIJQ== - "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" @@ -2193,13 +2188,6 @@ artalk@^2.5.1: insane "^2.6.2" marked "^4.2.12" -artplayer@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/artplayer/-/artplayer-4.6.2.tgz#d56c2887c10086f339722e025e9ece881561aaa9" - integrity sha512-9RMfFFy2wGgHUCnrwk+M2Z5OiLWQcBL+YzkSBwSi6IuJG6oM+TlfJJZt09RL2iag6DNQ+AUYtB879WUHxbqfIQ== - dependencies: - option-validator "^2.0.6" - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -2299,28 +2287,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bcp-47-match@^1.0.0, bcp-47-match@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-1.0.3.tgz#cb8d03071389a10aff2062b862d6575ffd7cd7ef" - integrity sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w== - -bcp-47-normalize@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz#d2c76218d132f223c44e4a06a7224be3030f8ec3" - integrity sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A== - dependencies: - bcp-47 "^1.0.0" - bcp-47-match "^1.0.0" - -bcp-47@^1.0.0: - version "1.0.8" - resolved "https://registry.yarnpkg.com/bcp-47/-/bcp-47-1.0.8.tgz#bf63ae4269faabe7c100deac0811121a48b6a561" - integrity sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag== - dependencies: - is-alphabetical "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2554,11 +2520,6 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -codem-isoboxer@0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/codem-isoboxer/-/codem-isoboxer-0.3.6.tgz#867f670459b881d44f39168d5ff2a8f14c16151d" - integrity sha512-LuO8/7LW6XuR5ERn1yavXAfodGRhuY2yP60JTZIw5yNYMCE5lUVbk3NFUCJxjnphQH+Xemp5hOGb1LgUXm00Xw== - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2670,11 +2631,6 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.4" -core-js@^3.26.1: - version "3.29.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.29.1.tgz#40ff3b41588b091aaed19ca1aa5cb111803fa9a6" - integrity sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -2729,11 +2685,6 @@ csstype@^2.6.8: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== -custom-event-polyfill@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz#9bc993ddda937c1a30ccd335614c6c58c4f87aee" - integrity sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w== - cytoscape-cose-bilkent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" @@ -3008,22 +2959,6 @@ dagre-d3-es@7.0.9: d3 "^7.8.2" lodash-es "^4.17.21" -dashjs@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/dashjs/-/dashjs-4.6.0.tgz#124c8371e192f1218746ce60b6aa0f175d4dcda4" - integrity sha512-0PDoSBM9PXb+Io0pRnw2CmO7aV9W8FC/BqBRNhLxzM3/e5Kfj7BLy0OWkkSB58ULg6Md6r+6jkGOTUhut/35rg== - dependencies: - bcp-47-match "^1.0.3" - bcp-47-normalize "^1.1.1" - codem-isoboxer "0.3.6" - es6-promise "^4.2.8" - fast-deep-equal "2.0.1" - html-entities "^1.2.1" - imsc "^1.0.2" - localforage "^1.7.1" - path-browserify "^1.0.1" - ua-parser-js "^1.0.2" - dayjs@^1.11.7: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" @@ -3107,11 +3042,6 @@ delaunator@5: dependencies: robust-predicates "^3.0.0" -dijkstrajs@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" - integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3222,11 +3152,6 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encode-utf8@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" - integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== - entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -3316,11 +3241,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-promise@^4.2.5, es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - esbuild@^0.16.14, esbuild@~0.16.17: version "0.16.17" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" @@ -3461,11 +3381,6 @@ extglob@^2.0.2, extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-deep-equal@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== - fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3863,16 +3778,6 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== -hls.js@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.3.5.tgz#0e8b0799ecf2feb7ba199f5e95f35ba9552e04f4" - integrity sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew== - -html-entities@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== - htmlparser2@^3.9.2: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -3922,23 +3827,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - immutable@^4.0.0: version "4.2.4" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== -imsc@^1.0.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/imsc/-/imsc-1.1.3.tgz#e96a60a50d4000dd7b44097272768b9fd6a4891d" - integrity sha512-IY0hMkVTNoqoYwKEp5UvNNKp/A5jeJUOrIO7judgOyhHT+xC6PA4VBOMAOhdtAYbMRHx9DTgI8p6Z6jhYQPFDA== - dependencies: - sax "1.2.1" - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3993,19 +3886,6 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-array-buffer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" @@ -4075,11 +3955,6 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -4401,7 +4276,7 @@ kind-of@^5.0.0, kind-of@^5.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -4421,13 +4296,6 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -lie@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== - dependencies: - immediate "~3.0.5" - lilconfig@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" @@ -4464,18 +4332,6 @@ lit@^2.6.1: lit-element "^3.2.0" lit-html "^2.6.0" -loadjs@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loadjs/-/loadjs-4.2.0.tgz#2a0336376397a6a43edf98c9ec3229ddd5abb6f6" - integrity sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA== - -localforage@^1.7.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" - integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== - dependencies: - lie "3.1.1" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -4743,14 +4599,6 @@ mj-context-menu@^0.6.1: resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== -mpegts.js@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/mpegts.js/-/mpegts.js-1.7.2.tgz#4bbb7f813fb87514466d74d0dfb75f801b3b117b" - integrity sha512-qQ1ELBDC4IAqpULFuFzp3hoQeKwD5BCR3UM9Lk2+kj9jCWcXl19spF7PdzX0ZljghPHAj/VL2ajBbGyMWk2fgA== - dependencies: - es6-promise "^4.2.5" - webworkify-webpack "^2.1.5" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4895,13 +4743,6 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" -option-validator@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/option-validator/-/option-validator-2.0.6.tgz#a314dae65e26db5f948ef0ff96fc88f18bb76ed6" - integrity sha512-tmZDan2LRIRQyhUGvkff68/O0R8UmF+Btmiiz0SmSw2ng3CfPZB9wJlIjHpe/MKUZqyIZkVIXCrwr1tIN+0Dzg== - dependencies: - kind-of "^6.0.3" - ora@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/ora/-/ora-6.1.2.tgz#7b3c1356b42fd90fb1dad043d5dbe649388a0bf5" @@ -4956,11 +4797,6 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -5001,22 +4837,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -plyr@^3.7.7: - version "3.7.7" - resolved "https://registry.yarnpkg.com/plyr/-/plyr-3.7.7.tgz#f7d20ab9297645d1ad3f68c7c66db6c3d8eef9a8" - integrity sha512-8B2b0HP+j/jKM7GrYdEuSi1hIF3BnNzjaBsBa3bx4/SO9omX3EfhCi78ZFh/0QuCKlwpTBusTMMZ3Hq6bJ5d/g== - dependencies: - core-js "^3.26.1" - custom-event-polyfill "^1.0.7" - loadjs "^4.2.0" - rangetouch "^2.0.1" - url-polyfill "^1.1.12" - -pngjs@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" - integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -5153,16 +4973,6 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -qrcode@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" - integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== - dependencies: - dijkstrajs "^1.0.1" - encode-utf8 "^1.0.3" - pngjs "^5.0.0" - yargs "^15.3.1" - query-string@^6.0.0: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -5185,11 +4995,6 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -rangetouch@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rangetouch/-/rangetouch-2.0.1.tgz#c01105110fd3afca2adcb1a580692837d883cb70" - integrity sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA== - raphael@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/raphael/-/raphael-2.3.0.tgz#eabeb09dba861a1d4cee077eaafb8c53f3131f89" @@ -5448,11 +5253,6 @@ sass@^1.59.3: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" - integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== - section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -5923,11 +5723,6 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -ua-parser-js@^1.0.2: - version "1.0.34" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.34.tgz#b33f41c415325839f354005d25a2f588be296976" - integrity sha512-K9mwJm/DaB6mRLZfw6q8IMXipcrmuT6yfhYmwhAkuh+81sChuYstYA+znlgaflUPaYUa3odxKPKGw6Vw/lANew== - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -6041,11 +5836,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== -url-polyfill@^1.1.12: - version "1.1.12" - resolved "https://registry.yarnpkg.com/url-polyfill/-/url-polyfill-1.1.12.tgz#6cdaa17f6b022841b3aec0bf8dbd87ac0cd33331" - integrity sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A== - url-slug@^2.0.0: version "2.3.2" resolved "https://registry.yarnpkg.com/url-slug/-/url-slug-2.3.2.tgz#eab21da0e227deba10610c7b01ec4af20babea21" @@ -6120,29 +5910,6 @@ vuepress-plugin-comment2@2.0.0-beta.196: vuepress-plugin-sass-palette "2.0.0-beta.196" vuepress-shared "2.0.0-beta.196" -vuepress-plugin-components@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.196.tgz#54872834fb59d19646259ce372b64605cadeb068" - integrity sha512-wg7bh7OGE/zT4gKizW7SqB49+HqEjsP35u6FKU1vU5IGyLgaIYhOeukbyUzPye1leeoEBqqT+YmivEN1/0lQcg== - dependencies: - "@stackblitz/sdk" "^1.8.2" - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@vueuse/core" "^9.13.0" - artplayer "^4.6.2" - balloon-css "^1.2.0" - dashjs "^4.6.0" - hls.js "^1.3.5" - mpegts.js "^1.7.2" - plyr "^3.7.7" - qrcode "^1.5.1" - vue "^3.2.47" - vue-router "^4.1.6" - vuepress-plugin-reading-time2 "2.0.0-beta.196" - vuepress-plugin-sass-palette "2.0.0-beta.196" - vuepress-shared "2.0.0-beta.196" - vuepress-plugin-copy-code2@2.0.0-beta.196: version "2.0.0-beta.196" resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.196.tgz#3301f9e51a66141f42cdaf65e4483b5dee491654" @@ -6202,13 +5969,6 @@ vuepress-plugin-md-enhance@2.0.0-beta.196: vuepress-plugin-sass-palette "2.0.0-beta.196" vuepress-shared "2.0.0-beta.196" -vuepress-plugin-reading-time2@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.196.tgz#befe935f722cc5b6f00c96056dc826ebac0f0baf" - integrity sha512-SKSWhIDvGKoKRKSlLSIF5Zk4K94Dly1odZlUSSFlgu8uKu/kztdXV02MPOscH9hbyo2+xcxg71NRuszrpYDxeA== - dependencies: - vuepress-shared "2.0.0-beta.196" - vuepress-plugin-sass-palette@2.0.0-beta.196: version "2.0.0-beta.196" resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.196.tgz#c609ae7694207c11915216c178796523c3f52750" @@ -6282,11 +6042,6 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webworkify-webpack@^2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/webworkify-webpack/-/webworkify-webpack-2.1.5.tgz#bf4336624c0626cbe85cf1ffde157f7aa90b1d1c" - integrity sha512-2akF8FIyUvbiBBdD+RoHpoTbHMQF2HwjcxfDvgztAX5YwbZNyrtfUMgvfgFVsgDhDPVTlkbb5vyasqDHfIDPQw== - whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" From 5ee1407ebcab1292ab22186a9bbc7e5706df0538 Mon Sep 17 00:00:00 2001 From: itlemon Date: Fri, 31 Mar 2023 14:23:34 +0800 Subject: [PATCH 39/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 8 +- yarn.lock | 294 +++++++++++++++++++++++++-------------------------- 2 files changed, 151 insertions(+), 151 deletions(-) diff --git a/package.json b/package.json index ef8c4f9..cbfb6da 100644 --- a/package.json +++ b/package.json @@ -13,10 +13,10 @@ "@vuepress/plugin-pwa-popup": "2.0.0-beta.61", "@vuepress/plugin-search": "2.0.0-beta.61", "vuepress": "2.0.0-beta.61", - "vuepress-plugin-comment2": "2.0.0-beta.196", - "vuepress-plugin-copy-code2": "2.0.0-beta.196", - "vuepress-plugin-md-enhance": "2.0.0-beta.196", - "vuepress-plugin-seo2": "2.0.0-beta.196" + "vuepress-plugin-comment2": "2.0.0-beta.200", + "vuepress-plugin-copy-code2": "2.0.0-beta.200", + "vuepress-plugin-md-enhance": "2.0.0-beta.200", + "vuepress-plugin-seo2": "2.0.0-beta.200" }, "scripts": { "docs:dev": "vuepress dev docs --clean-cache", diff --git a/yarn.lock b/yarn.lock index 342870c..2e0e8a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1315,162 +1315,162 @@ resolved "https://registry.yarnpkg.com/@mdit-vue/types/-/types-0.11.0.tgz#ab9c6f4e69d9c9eaabf1a73e59dc699875b224ef" integrity sha512-ygCGP7vFpqS02hpZwEe1uz8cfImWX06+zRs08J+tCZRKb6k+easIaIHFtY9ZSxt7j9L/gAPLDo/5RmOT6z0DPQ== -"@mdit/plugin-align@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.3.0.tgz#5d46c1b05a5648fc2582ea5d8483af7664d89ae0" - integrity sha512-t5SY5n93Et8MJRbEmlcREpPNLy/A7j0U13mXiuADtgvkMIWGXiO3PLyPPLfov9vWhh1tcDcNQ1+XY3hw71LwzQ== +"@mdit/plugin-align@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.4.1.tgz#91c6ffd4c4de9762ecea498916d20add4ff98076" + integrity sha512-46DaKYsov6o7laFqcUTWpjT0TmW8f7EgZ0GeAoZ785vtYMpIWR2ewhevYDRs7r00NMT768/wHypWinCyXlwvuw== dependencies: - "@mdit/plugin-container" "0.3.0" + "@mdit/plugin-container" "0.4.1" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-attrs@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.3.0.tgz#3104b0cfd528a79daa7f6872c39807eede6b58c0" - integrity sha512-u8TrEmoZsCmtPA8Q94CXEBAU8VO8xEaX7JJ20SXcv5C8u4h5S/LwnqBXckBH9B8Qz0j8JS7XeKxfm6X+lmwMxg== +"@mdit/plugin-attrs@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.4.1.tgz#fc3a944cc87ad209b5d05655896480d3c792f107" + integrity sha512-C4eNiord5P5njo0mkkB/XS/dhwf3A7nJd2NF3Bz264rWeY1pyJebryLllzFBeTtKjL9kRNZSUt4XnEkhKRpTEg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-container@0.3.0", "@mdit/plugin-container@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.3.0.tgz#d8f4e4c3839de2a77e2b28ec68d2d6b45efc0dc7" - integrity sha512-mNdw5H8VsifwtRCEvuyIa6kTDP1a3CHe7PhICzmK51/6yObN6PRWWwEDuG3vJOu1pIRltcsgMKMwEC8BWT2S0A== +"@mdit/plugin-container@0.4.1", "@mdit/plugin-container@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.4.1.tgz#ce2b31a13455f3a409bf789c5e83c8fa4a70d5cf" + integrity sha512-CTawSHXWJpFd1IJqMKdifNK1srqwcbOThtexKs2cdcTmM/+YC74e5cZ1nCxQ4Y3h+2Lxw0EvL+4H3SAPbUXpow== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-figure@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.3.0.tgz#5f8aa1c24e7d632d7f466c1f827f3d051c2d869b" - integrity sha512-657sxb+qjZ5ff5YXEOuPqobSFcXuLNS7pWFA9oZxK8Fbo8FqS/sAKuUV2axo2SBR9pydLNP/bPvu2YbvYdQkNA== +"@mdit/plugin-figure@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.4.1.tgz#6f4fd38dfa7f565fe918d03f827225766b0a3f71" + integrity sha512-Nh287T6PGmrB2u85edtCd2kQc8y4rMxBOymXrCvR7uqU9XTwGPPdkPANUcAfEZ5X5xd5PSYyFoOJVivoKVCkZQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-footnote@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.3.0.tgz#7a2d0da81a674a0391c154c9f9e14158db93aeda" - integrity sha512-2qfSklSJplsP4sct02cdMcBSVyLAHIhR1OMxhEnS0WsUMtX68r2G7buBtfVbYRT68lCygkZFAD4nymdslEdDRA== +"@mdit/plugin-footnote@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.4.1.tgz#050648b495e55d56f271836b40f545f72ef74c56" + integrity sha512-51DPmYu/mmmSeXwIcHncJB+CtRqhGrEppRwmV7FQ1NoJeJFQ/4167i9euvGhI7ITyjQdYzINDO9qlk/hfmhNqg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-lazyload@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.3.0.tgz#992eb5de9d1bfd4ce6726eb3614226cf16a535c8" - integrity sha512-KytI59hWWfiynlt8meFBEGcJO0LrdUbj2Uicq7E1NycTIipgxAKIPU0pxc/eY+gdJhp+W0lpl+orRG0eoVLX+A== +"@mdit/plugin-img-lazyload@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.4.1.tgz#3aba90e3d19f6b41042607f56fd607c40bbfa292" + integrity sha512-cnJLGOyi7QQ6VgG+Lb0O0s+1+ByOuhSdlyzDOQYAua8S7WWzn3s+dPWvailk/2oti8ag1Zi19EE/RwXBHLlVsw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-mark@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.3.0.tgz#3133f3837beecc285e110828ca9ca1864b98a855" - integrity sha512-dto+KOvhai6piINS3052+GUk6AKvxe3bSU6I1dFbYKRswIDZcf8XIMQZVYiBN+2tLKMQzzwcu+irVuWHkS6LYQ== +"@mdit/plugin-img-mark@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.4.1.tgz#5d6f5c15c895dc09dff3c4a29bd61d20da44a9cb" + integrity sha512-X7uJsBpDfU/omEy33F4e4Foopr/Q/8ZQjqjgYuOpB1rx8GA0WNL1/U7GWlnnsA3y3VwGGf1EJfuvFm821Qdq+A== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-size@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.3.0.tgz#d2dbdcc0716cf86c0ad0cf4f08bfee8d0ec66a88" - integrity sha512-cjj9hGJTiwNwAmuQPSRaQZNaguYBExHZREm1NboWI8zMCTvMXc1zZnTHb96WmD1n2K2c9L2pLkAuqPJu5Z8ZpA== +"@mdit/plugin-img-size@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.4.1.tgz#555f47d93e06fe6e1129e44b2397a1c8779e43b6" + integrity sha512-/mBCpoK9Uvy0iXT45NP1G/OkvlxdbWXVmGwKiuAJHcOzZ9sRsSnnrdBQBQGuhj3Pl0NIdZL9HeZH4YYGIhaMpg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-include@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.3.0.tgz#3073048a5d34adae75dd8b9dd5f52968080d2af8" - integrity sha512-rDH+4fqT3bv7+Nf5OT6LOvwn545ox5eE1eGHkZWty/XINbKmNP6VSdbgdieqAgJA4nlLCs4yscFk2vuzT8dqrQ== +"@mdit/plugin-include@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.4.1.tgz#52bf371b1e6bbbe49467f433d626ff51d40d9ef7" + integrity sha512-XMVyFKNNUwNZbPC9koxHSE+gKqlR/JycvKEuRLGbPaXz+i7lricc59wDmlHJ7oOCCVLGnxsj9MslERcjQQXCrA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" upath "^2.0.1" -"@mdit/plugin-katex@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.3.0.tgz#c0d75f636edb2456adc0c85872a1c64bf1faaf83" - integrity sha512-Uol7ZF2Yc4fBgQOwsy6cQQFkoIWXqV8o7Wf+I9ZJHYosbKZXFrfLkfDkWISSb+TzSTBCrRkrQtt6zi+4+nj9sw== +"@mdit/plugin-katex@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.4.1.tgz#c9fde0a5346c5cf63bd712dca4ee055554fa9e99" + integrity sha512-0Nk3GdOV5h8LyqvuWWabKNBjWRip0PLMmFktaOQeUghK2hWMaQJJuPc9IqjBfbei0IWyU34KMFSx9GuwMznhXw== dependencies: - "@mdit/plugin-tex" "0.3.0" + "@mdit/plugin-tex" "0.4.1" "@types/katex" "^0.16.0" "@types/markdown-it" "^12.2.3" katex "^0.16.4" markdown-it "^13.0.1" -"@mdit/plugin-mark@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.3.0.tgz#72caffbedc01f02e193fd593134fe6498b3a9c5a" - integrity sha512-LRCjS/q8ryg/yWnKCGIKWVxCRu36WBfUGDlCuw+cb59ptkbF24Q6Khs8pnZZGq6q+XSFHmYUCCHqp2q79XAvyA== +"@mdit/plugin-mark@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.4.1.tgz#2e15e1896c2ab61899aa00e611b43570134f346d" + integrity sha512-rfMten6lQpGw/xlxaxtSIqBikfqxw/nIPr8Dt51SdWlaejjXohXoaldGDH8D2XuLxXw+Lquvf0O/q8/RfdEQTA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-mathjax@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.3.0.tgz#0d890e708b58fa23b7216c228656b792ebbbaf5e" - integrity sha512-9lvYnVd0kllsysikRr4f+OMS9zjM57QgEIB7e+dSDtYGMQISNxiLQvYap/pMMtY+zZQ51I7heGCjZ2OXmWEtbg== +"@mdit/plugin-mathjax@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.4.1.tgz#4413d47a4e7c60dc0a40a91f3e0739be9c96676a" + integrity sha512-eZrvcwx7OMHjm9V388AINWU+O4TgOMd3sgXtVtODgYtK3XzU+F9Aq8ExX5pxccSNrzjsENCYtv5kEG2j0+7yxA== dependencies: - "@mdit/plugin-tex" "0.3.0" + "@mdit/plugin-tex" "0.4.1" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" mathjax-full "^3.2.2" upath "^2.0.1" -"@mdit/plugin-stylize@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.3.0.tgz#dd3c0778a32be59384a97c10092b166f3aa28d28" - integrity sha512-WT+ts6/Xd+K3ASlHDWa4ZHqDx4KgRsuHgLhmyvyAGY9ApNP1Q0ROY5Ik4bn92WVRU3WEfK8ICOEOnoEPEP2NJA== +"@mdit/plugin-stylize@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.4.1.tgz#306ee55c226ca753b6f84d6cacbb95a99264afc5" + integrity sha512-C72BuR0gSwTYBpUYnXbafrDXyOYV13lHlZdxFg7J7/d+cTasBYgCnNPSiTPDkLi7vas586kxhrE9uhQEQh51kA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sub@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.3.0.tgz#929a5cb4ec8ed1923dbb8cb0f3f751284b2d5a3f" - integrity sha512-T4fYZqIJ2ZJOQ4WoURU813XL7Y6prs5jYaxLWteOqF9JkTcqNQ22hJcdGe5domIG/dH79IZqVHkJ7okoFOt/Xg== +"@mdit/plugin-sub@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.4.1.tgz#f7936e925bd854c5ed0ce600d8ad9fe50be2e011" + integrity sha512-pIiWhKNONw1FJ8+fDR+BGE2xLUkhp2v8FKvDmAAX+IZBiGktmQc0b+eA4YQPlLyt2MWSZpJE8yyDylyRoc3Gew== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sup@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.3.0.tgz#9e884d98f2db29d09ebc3b11d376b5c99fa08997" - integrity sha512-K6L1/WK94XwFG+Oo54GVM9m+Y0cjinoiVtWjT0OIswCQWDuuXG7H4JH2uxBxQJb8MWNsnnQRUFnaG1RPiRP94Q== +"@mdit/plugin-sup@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.4.1.tgz#f6cc42afa0185e3003b6eb4134ea606e35a17f98" + integrity sha512-PQhAp4E9XVTxqYDJKuxPF2AiwBbuwS9R82bWjXVCFYJTcpCqSIBRjN3IOCsVe3g2GXQ/KsvkJFFMDtrprJoS/Q== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tab@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.3.0.tgz#618e30542939564c116c31a6bc8ee664d32f0e5f" - integrity sha512-mHnj+AZRem7Jilc1Auu7wL5Uo/S32Slp1WU3Of3RJn0LiQnEpZHKr/kpQutEWV+kZo/rIcTIxdCYWXBZqj38ng== +"@mdit/plugin-tab@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.4.1.tgz#d15a1c9abb01381634ad106a4e60dc0dd47697de" + integrity sha512-TNGjRI96LS4+WBy38kVOR2KR4VV/e07jzCG2Ql+P1yIBhW0L74UgwrW3D+NiUk9gLIZ8u94NFlhH3djmaNKXIA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tasklist@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.3.0.tgz#f568dc65ff64e9b54959b1270b5424136628ddf6" - integrity sha512-/nekYc2zSKxGFbTR2o6dXyqoUfQBrf9PX0O81ZOGIzaMI+t6y9q3tJwnmbwLD/QE1MeW6kaR4byCcD3rc1SyAQ== +"@mdit/plugin-tasklist@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.4.1.tgz#4bf2e1c11c18756115251ea931ec7a8a62b0cd25" + integrity sha512-ImK7PNeJvFlsZD8DcbQc+b9+b95eNahPuBQDM/hmQs637Od+PpLl1zxi+8e3wNaMjH1+rhVEeVFsts/p5LPXZA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tex@0.3.0", "@mdit/plugin-tex@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.3.0.tgz#49916ad786a91642f207d68c76ccd425f250988f" - integrity sha512-GXAOOBlk2me/noWOCbZeoqMsCcsIeNob+LhLYfk8q4w3rHJM9gdUI5JL05ClbvO7eNSSjQVZZ1tHfyjK08RvSg== +"@mdit/plugin-tex@0.4.1", "@mdit/plugin-tex@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.4.1.tgz#f6f833ff471b05ee18b8fe7b5550e5836a4cf78d" + integrity sha512-djpDGCIQoMVzydaQ34C+hCQUdJesG0QBQcQeWz+YqrGckvBgCG6NcpuNschCh4D4f0bNQEKVqt4dZ2mWsHqFtg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-uml@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.3.0.tgz#eec2dc54cd48c5143abd7f855d7a4b2739204e37" - integrity sha512-QS00olhRy3Ct5qwjFYBk6YtCZK5oLM8K4SyPND7LCrqiV3PiAtH8jXN9BnDmKQN+EhXXzFe3NlxRjNLvGu/JUw== +"@mdit/plugin-uml@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.4.1.tgz#5739bcd95e4a8148c07de0be6bbdd775bf94cba7" + integrity sha512-THy+SgT9bVDmkN3OqU3v7reK2e1gyH/N9J0eHo4GYrxZo6b7DACvEQQ4kgwpOph8U41TxjWyV6VzDYPMPKGo4Q== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" @@ -2178,7 +2178,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -artalk@^2.5.1: +artalk@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/artalk/-/artalk-2.5.2.tgz#416acfa433069978221e084d61f3bc39331ef553" integrity sha512-qwAtSCRIBadaXyLsVps8DDlawis7KQNQpDfEj2h8xbA8LYv1nTUR4tazb4oVRBOwGSpo1cir8WIT3pq/MkiTLg== @@ -3112,13 +3112,13 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.1" -echarts@^5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/echarts/-/echarts-5.4.1.tgz#d7f65a584d78beff62568d878b16151b3381811c" - integrity sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ== +echarts@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/echarts/-/echarts-5.4.2.tgz#9f38781c9c6ae323e896956178f6956952c77a48" + integrity sha512-2W3vw3oI2tWJdyAz+b8DuWS0nfXtSDqlDmqgin/lfzbkB01cuMEN66KWBlmur3YMp5nEDEEt5s23pllnAzB4EA== dependencies: tslib "2.3.0" - zrender "5.4.1" + zrender "5.4.3" editorconfig@^0.15.3: version "0.15.3" @@ -5244,10 +5244,10 @@ sass@^1.58.3: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@^1.59.3: - version "1.59.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.59.3.tgz#a1ddf855d75c70c26b4555df4403e1bbf8e4403f" - integrity sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ== +sass@^1.60.0: + version "1.60.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.60.0.tgz#657f0c23a302ac494b09a5ba8497b739fb5b5a81" + integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -5893,27 +5893,27 @@ vue@^3.2.45, vue@^3.2.47: "@vue/server-renderer" "3.2.47" "@vue/shared" "3.2.47" -vuepress-plugin-comment2@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.196.tgz#61bb7a48de1378235981b734c7542de3de6f5a14" - integrity sha512-8z0Y2Q0AvJQwFyinTvtej3SaN85CBsJYTi3PRyXQggjiNxR14tOpWpvIVZmIksDxAxZu4Zp4l7bmbIkZYAbT0g== +vuepress-plugin-comment2@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.200.tgz#54b6a988b9555830612f81e2785e1a7cd9f645dc" + integrity sha512-JHUxUuFu1Yc7ZgkMdFz+s57WbFizjtXhEVBocs+cQnSZBZSpCkb+pOzU49hAP5EjbWwwj3vLweyEupD6os/cJQ== dependencies: "@vuepress/client" "2.0.0-beta.61" "@vuepress/shared" "2.0.0-beta.61" "@vuepress/utils" "2.0.0-beta.61" "@waline/client" "^2.14.9" - artalk "^2.5.1" + artalk "^2.5.2" giscus "^1.2.8" twikoo "^1.6.10" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.196" - vuepress-shared "2.0.0-beta.196" + vuepress-plugin-sass-palette "2.0.0-beta.200" + vuepress-shared "2.0.0-beta.200" -vuepress-plugin-copy-code2@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.196.tgz#3301f9e51a66141f42cdaf65e4483b5dee491654" - integrity sha512-oyB5E2zWOmmNTtG6YUxM1yuPWuzX6qrGE4X8ctlfXFfAGH9p/VosSDUKkNb/g8LEd3umI3kKEjqxgDTq9CfjZg== +vuepress-plugin-copy-code2@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.200.tgz#c6734f91e89a2e83a279f3d5cb18dbf3252461b6" + integrity sha512-SPOGaSsUd3uFd1cdc27Y1PLtlJQ9yxOmgyFRLOBGGZ4HV0rUNbkCw1nv9ncfYAQxmyQRtbZSWwRKXXwi/tsltQ== dependencies: "@vuepress/client" "2.0.0-beta.61" "@vuepress/shared" "2.0.0-beta.61" @@ -5922,34 +5922,34 @@ vuepress-plugin-copy-code2@2.0.0-beta.196: balloon-css "^1.2.0" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.196" - vuepress-shared "2.0.0-beta.196" + vuepress-plugin-sass-palette "2.0.0-beta.200" + vuepress-shared "2.0.0-beta.200" -vuepress-plugin-md-enhance@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.196.tgz#248bdc24bdf7a3f08493103f80aef4cf9e6c39c6" - integrity sha512-TNMP9eQsbXOQb9cTKnlxiMtAuhe7iNVSGjdfA2yRaMgOJkFAfk/7lRIEZv+A0YXnjzg4A9+YVaTKg71Ie04VVg== +vuepress-plugin-md-enhance@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.200.tgz#a5a9a34d6fe12351b0d1d723e909e9dd2b9dc676" + integrity sha512-KbBopiIe4N1LUdb6KI0Ndh9VXiHCtrqQ+HC03IWHHNBAoXun/CFpAKTtaOOuxBnPF8hIG4v6eLzs/xfAjuYRBg== dependencies: "@babel/core" "^7.21.3" - "@mdit/plugin-align" "^0.3.0" - "@mdit/plugin-attrs" "^0.3.0" - "@mdit/plugin-container" "^0.3.0" - "@mdit/plugin-figure" "^0.3.0" - "@mdit/plugin-footnote" "^0.3.0" - "@mdit/plugin-img-lazyload" "^0.3.0" - "@mdit/plugin-img-mark" "^0.3.0" - "@mdit/plugin-img-size" "^0.3.0" - "@mdit/plugin-include" "^0.3.0" - "@mdit/plugin-katex" "^0.3.0" - "@mdit/plugin-mark" "^0.3.0" - "@mdit/plugin-mathjax" "^0.3.0" - "@mdit/plugin-stylize" "^0.3.0" - "@mdit/plugin-sub" "^0.3.0" - "@mdit/plugin-sup" "^0.3.0" - "@mdit/plugin-tab" "^0.3.0" - "@mdit/plugin-tasklist" "^0.3.0" - "@mdit/plugin-tex" "^0.3.0" - "@mdit/plugin-uml" "^0.3.0" + "@mdit/plugin-align" "^0.4.1" + "@mdit/plugin-attrs" "^0.4.1" + "@mdit/plugin-container" "^0.4.1" + "@mdit/plugin-figure" "^0.4.1" + "@mdit/plugin-footnote" "^0.4.1" + "@mdit/plugin-img-lazyload" "^0.4.1" + "@mdit/plugin-img-mark" "^0.4.1" + "@mdit/plugin-img-size" "^0.4.1" + "@mdit/plugin-include" "^0.4.1" + "@mdit/plugin-katex" "^0.4.1" + "@mdit/plugin-mark" "^0.4.1" + "@mdit/plugin-mathjax" "^0.4.1" + "@mdit/plugin-stylize" "^0.4.1" + "@mdit/plugin-sub" "^0.4.1" + "@mdit/plugin-sup" "^0.4.1" + "@mdit/plugin-tab" "^0.4.1" + "@mdit/plugin-tasklist" "^0.4.1" + "@mdit/plugin-tex" "^0.4.1" + "@mdit/plugin-uml" "^0.4.1" "@types/markdown-it" "^12.2.3" "@vue/repl" "^1.3.3" "@vuepress/client" "2.0.0-beta.61" @@ -5958,7 +5958,7 @@ vuepress-plugin-md-enhance@2.0.0-beta.196: "@vueuse/core" "^9.13.0" balloon-css "^1.2.0" chart.js "^4.2.1" - echarts "^5.4.1" + echarts "^5.4.2" flowchart.ts "^0.1.2" katex "^0.16.4" markdown-it "^13.0.1" @@ -5966,33 +5966,33 @@ vuepress-plugin-md-enhance@2.0.0-beta.196: reveal.js "^4.4.0" vue "^3.2.47" vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.196" - vuepress-shared "2.0.0-beta.196" + vuepress-plugin-sass-palette "2.0.0-beta.200" + vuepress-shared "2.0.0-beta.200" -vuepress-plugin-sass-palette@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.196.tgz#c609ae7694207c11915216c178796523c3f52750" - integrity sha512-rB+4l1oOzbHVuYvo3tioPTAQ4pB/jTdS+M9U3n+XGLvkxsIDQCUbnLxmZxw1mESggZ+97e0qjniAY1KvZ2wKtQ== +vuepress-plugin-sass-palette@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.200.tgz#29a5c1d14de8eb447242d72aa339fd641f077771" + integrity sha512-yhcm3hvmkj4PlK0bAg1Yebx3RwpOygrOIe1EazqA6phuqUIDcLyHI9x9AUmvEvZ7YHC1B0hiExYdb96UFkYl3w== dependencies: "@vuepress/shared" "2.0.0-beta.61" "@vuepress/utils" "2.0.0-beta.61" chokidar "^3.5.3" - sass "^1.59.3" - vuepress-shared "2.0.0-beta.196" + sass "^1.60.0" + vuepress-shared "2.0.0-beta.200" -vuepress-plugin-seo2@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.196.tgz#4e513a867ae2797ecb207e52a88bdb4951708031" - integrity sha512-ADAfopqI4AbvVodC/wuw32MjlFfX1fQ0SbPnuHomjlBQO5/VsgtF8+kWb1YKl7RnagK07tMCXNyvnJohbwEz+Q== +vuepress-plugin-seo2@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.200.tgz#70c06239e84051992ab48afbe4b39a1b2201a51f" + integrity sha512-CC2fCeJT1pTVH+/du7mju8q73aqDOB3JHPjF5QVwamLoWlmQFivgGInFaGtifWMcLNzzeeL5Fgk4OLp+XgGXBw== dependencies: "@vuepress/shared" "2.0.0-beta.61" "@vuepress/utils" "2.0.0-beta.61" - vuepress-shared "2.0.0-beta.196" + vuepress-shared "2.0.0-beta.200" -vuepress-shared@2.0.0-beta.196: - version "2.0.0-beta.196" - resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.196.tgz#a59739dc5c7c4abd8d579455fecdca666e98eb16" - integrity sha512-Hz8Yeb+mwkzMLRnrF8RkpaTzAvCqrZdVqFJ5JRhFOBLhWXWwemc0z8pSd+ph55ASu01hFRfVR13cMJwK/uRbvQ== +vuepress-shared@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.200.tgz#5f5837db74a9cebf74b7686bbd1dfa71f418b30d" + integrity sha512-H4TqjpfMR3MkTlStlSvaun1ZpNdhxgX57zVnatSRk9kSr1+VFcRAqLTvDuaSYlMC7i2DDAPKNReQw18h/OBfDw== dependencies: "@vuepress/client" "2.0.0-beta.61" "@vuepress/shared" "2.0.0-beta.61" @@ -6318,9 +6318,9 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -zrender@5.4.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/zrender/-/zrender-5.4.1.tgz#892f864b885c71e1dc25dcb3c7a4ba42678d3f11" - integrity sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA== +zrender@5.4.3: + version "5.4.3" + resolved "https://registry.yarnpkg.com/zrender/-/zrender-5.4.3.tgz#41ffaf835f3a3210224abd9d6964b48ff01e79f5" + integrity sha512-DRUM4ZLnoaT0PBVvGBDO9oWIDBKFdAVieNWxWwK0niYzJCMwGchRk21/hsE+RKkIveH3XHCyvXcJDkgLVvfizQ== dependencies: tslib "2.3.0" From cca6f63b651292cb822f276512b0183482be7084 Mon Sep 17 00:00:00 2001 From: itlemon Date: Thu, 6 Apr 2023 10:44:17 +0800 Subject: [PATCH 40/61] =?UTF-8?q?mod:=20=E6=B7=BB=E5=8A=A0chatgpt=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +- docs/.vuepress/config.ts | 26 +-- docs/.vuepress/configs/navbar/zh.ts | 4 + docs/resources/chatgpt/README.md | 3 + package.json | 1 + yarn.lock | 255 +++++++++++++++++++++++++++- 6 files changed, 277 insertions(+), 24 deletions(-) create mode 100644 docs/resources/chatgpt/README.md diff --git a/README.md b/README.md index 0c75d34..4d4f327 100644 --- a/README.md +++ b/README.md @@ -20,13 +20,13 @@ git clone git@github.com:itlemon/CodingGuide.git 第二步:安装依赖 ```shell -npm install +yarn install ``` 第三步:本地热部署 ```shell -npm run docs:dev +yarn docs:dev ``` 访问: [http://localhost:4000](http://localhost:4000) 可以看到本地部署的博客,支持动态修改更新。 @@ -45,8 +45,8 @@ Linux 或者 macOS 还可以使用命令: ```shell git pull -sudo npm install -sudo nohup npm run docs:dev & +yarn install +nohup yarn docs:dev & ``` - Windows @@ -55,8 +55,8 @@ Windows用户请使用命令: ```shell git pull -sudo npm install -start npm run docs:dev & +yarn install +start yarn docs:dev & ``` 服务器部署方式默认端口是`4000`,需要注意的是,使用脚本部署或者`nohup`及`start`来部署,都是后台启动,重新启动的时候需要kill原有的进程,才能生效。 diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 9774492..1b1a7fa 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -10,7 +10,7 @@ import {commentPlugin} from 'vuepress-plugin-comment2' import {seoPlugin} from 'vuepress-plugin-seo2' import {svgIconPlugin} from '@goy/vuepress-plugin-svg-icons' import {mdEnhancePlugin} from 'vuepress-plugin-md-enhance' -// import {componentsPlugin} from 'vuepress-plugin-components' +import {componentsPlugin} from 'vuepress-plugin-components' import {head, navbarZh, sidebarZh,} from './configs' @@ -66,7 +66,7 @@ export default defineUserConfig({ // use shiki plugin in production mode instead prismjs: true, // 这里关闭默认主题的返回顶端 - // backToTop: false, + backToTop: false, }, }), @@ -148,16 +148,16 @@ export default defineUserConfig({ }), // componentsPlugin - // componentsPlugin({ - // components: ['FontIcon'], - // componentOptions: { - // fontIcon: { - // assets: '//at.alicdn.com/t/c/font_2154804_snaqmfegfdf.css', - // }, - // }, - // rootComponents: { - // backToTop: true, - // } - // }), + componentsPlugin({ + components: ['FontIcon'], + componentOptions: { + fontIcon: { + assets: '//at.alicdn.com/t/c/font_2154804_snaqmfegfdf.css', + }, + }, + rootComponents: { + backToTop: true, + } + }), ], }) \ No newline at end of file diff --git a/docs/.vuepress/configs/navbar/zh.ts b/docs/.vuepress/configs/navbar/zh.ts index 843dcfa..3b1ab28 100644 --- a/docs/.vuepress/configs/navbar/zh.ts +++ b/docs/.vuepress/configs/navbar/zh.ts @@ -1,6 +1,10 @@ import type {NavbarConfig} from '@vuepress/theme-default' export const navbarZh: NavbarConfig = [ + { + text: 'ChatGPT', + link: '/resources/chatgpt/' + }, { text: '数据结构与算法', link: '/resources/data-structure-and-algorithm/' diff --git a/docs/resources/chatgpt/README.md b/docs/resources/chatgpt/README.md new file mode 100644 index 0000000..4cc50e6 --- /dev/null +++ b/docs/resources/chatgpt/README.md @@ -0,0 +1,3 @@ +# ChatGPT + +内容即将发布,敬请期待 \ No newline at end of file diff --git a/package.json b/package.json index cbfb6da..b61f481 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "@vuepress/plugin-pwa-popup": "2.0.0-beta.61", "@vuepress/plugin-search": "2.0.0-beta.61", "vuepress": "2.0.0-beta.61", + "vuepress-plugin-components": "2.0.0-beta.200", "vuepress-plugin-comment2": "2.0.0-beta.200", "vuepress-plugin-copy-code2": "2.0.0-beta.200", "vuepress-plugin-md-enhance": "2.0.0-beta.200", diff --git a/yarn.lock b/yarn.lock index 2e0e8a0..0f4b210 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1533,6 +1533,11 @@ estree-walker "^1.0.1" picomatch "^2.2.2" +"@stackblitz/sdk@^1.8.2": + version "1.8.2" + resolved "https://repo.huaweicloud.com/repository/npm/@stackblitz/sdk/-/sdk-1.8.2.tgz#f91c7b35cd5c4523fcacb74b51cee4ec92b608e0" + integrity sha512-3aTg0Tb9dNs1huPkpdYxPEX/yc8A28eZneUMOEJzOLi7EJwl5onr9gCAVjIOkN4WLYu1iBSiJiGBYT629bZIJQ== + "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" @@ -2188,6 +2193,13 @@ artalk@^2.5.2: insane "^2.6.2" marked "^4.2.12" +artplayer@^4.6.2: + version "4.6.2" + resolved "https://repo.huaweicloud.com/repository/npm/artplayer/-/artplayer-4.6.2.tgz#d56c2887c10086f339722e025e9ece881561aaa9" + integrity sha512-9RMfFFy2wGgHUCnrwk+M2Z5OiLWQcBL+YzkSBwSi6IuJG6oM+TlfJJZt09RL2iag6DNQ+AUYtB879WUHxbqfIQ== + dependencies: + option-validator "^2.0.6" + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -2287,6 +2299,28 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +bcp-47-match@^1.0.0, bcp-47-match@^1.0.3: + version "1.0.3" + resolved "https://repo.huaweicloud.com/repository/npm/bcp-47-match/-/bcp-47-match-1.0.3.tgz#cb8d03071389a10aff2062b862d6575ffd7cd7ef" + integrity sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w== + +bcp-47-normalize@^1.1.1: + version "1.1.1" + resolved "https://repo.huaweicloud.com/repository/npm/bcp-47-normalize/-/bcp-47-normalize-1.1.1.tgz#d2c76218d132f223c44e4a06a7224be3030f8ec3" + integrity sha512-jWZ1Jdu3cs0EZdfCkS0UE9Gg01PtxnChjEBySeB+Zo6nkqtFfnvtoQQgP1qU1Oo4qgJgxhTI6Sf9y/pZIhPs0A== + dependencies: + bcp-47 "^1.0.0" + bcp-47-match "^1.0.0" + +bcp-47@^1.0.0: + version "1.0.8" + resolved "https://repo.huaweicloud.com/repository/npm/bcp-47/-/bcp-47-1.0.8.tgz#bf63ae4269faabe7c100deac0811121a48b6a561" + integrity sha512-Y9y1QNBBtYtv7hcmoX0tR+tUNSFZGZ6OL6vKPObq8BbOhkCoyayF6ogfLTgAli/KuAEbsYHYUNq2AQuY6IuLag== + dependencies: + is-alphabetical "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2520,6 +2554,11 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== +codem-isoboxer@0.3.6: + version "0.3.6" + resolved "https://repo.huaweicloud.com/repository/npm/codem-isoboxer/-/codem-isoboxer-0.3.6.tgz#867f670459b881d44f39168d5ff2a8f14c16151d" + integrity sha512-LuO8/7LW6XuR5ERn1yavXAfodGRhuY2yP60JTZIw5yNYMCE5lUVbk3NFUCJxjnphQH+Xemp5hOGb1LgUXm00Xw== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2631,6 +2670,11 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.4" +core-js@^3.26.1: + version "3.30.0" + resolved "https://repo.huaweicloud.com/repository/npm/core-js/-/core-js-3.30.0.tgz#64ac6f83bc7a49fd42807327051701d4b1478dea" + integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -2685,6 +2729,11 @@ csstype@^2.6.8: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== +custom-event-polyfill@^1.0.7: + version "1.0.7" + resolved "https://repo.huaweicloud.com/repository/npm/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz#9bc993ddda937c1a30ccd335614c6c58c4f87aee" + integrity sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w== + cytoscape-cose-bilkent@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" @@ -2959,6 +3008,22 @@ dagre-d3-es@7.0.9: d3 "^7.8.2" lodash-es "^4.17.21" +dashjs@^4.6.0: + version "4.6.0" + resolved "https://repo.huaweicloud.com/repository/npm/dashjs/-/dashjs-4.6.0.tgz#124c8371e192f1218746ce60b6aa0f175d4dcda4" + integrity sha512-0PDoSBM9PXb+Io0pRnw2CmO7aV9W8FC/BqBRNhLxzM3/e5Kfj7BLy0OWkkSB58ULg6Md6r+6jkGOTUhut/35rg== + dependencies: + bcp-47-match "^1.0.3" + bcp-47-normalize "^1.1.1" + codem-isoboxer "0.3.6" + es6-promise "^4.2.8" + fast-deep-equal "2.0.1" + html-entities "^1.2.1" + imsc "^1.0.2" + localforage "^1.7.1" + path-browserify "^1.0.1" + ua-parser-js "^1.0.2" + dayjs@^1.11.7: version "1.11.7" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" @@ -3042,6 +3107,11 @@ delaunator@5: dependencies: robust-predicates "^3.0.0" +dijkstrajs@^1.0.1: + version "1.0.2" + resolved "https://repo.huaweicloud.com/repository/npm/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" + integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3152,6 +3222,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +encode-utf8@^1.0.3: + version "1.0.3" + resolved "https://repo.huaweicloud.com/repository/npm/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + entities@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -3241,6 +3316,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@^4.2.5, es6-promise@^4.2.8: + version "4.2.8" + resolved "https://repo.huaweicloud.com/repository/npm/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + esbuild@^0.16.14, esbuild@~0.16.17: version "0.16.17" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" @@ -3381,6 +3461,11 @@ extglob@^2.0.2, extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +fast-deep-equal@2.0.1: + version "2.0.1" + resolved "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3778,6 +3863,16 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== +hls.js@^1.3.5: + version "1.3.5" + resolved "https://repo.huaweicloud.com/repository/npm/hls.js/-/hls.js-1.3.5.tgz#0e8b0799ecf2feb7ba199f5e95f35ba9552e04f4" + integrity sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew== + +html-entities@^1.2.1: + version "1.4.0" + resolved "https://repo.huaweicloud.com/repository/npm/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + htmlparser2@^3.9.2: version "3.10.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" @@ -3827,11 +3922,23 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immediate@~3.0.5: + version "3.0.6" + resolved "https://repo.huaweicloud.com/repository/npm/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + immutable@^4.0.0: version "4.2.4" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== +imsc@^1.0.2: + version "1.1.3" + resolved "https://repo.huaweicloud.com/repository/npm/imsc/-/imsc-1.1.3.tgz#e96a60a50d4000dd7b44097272768b9fd6a4891d" + integrity sha512-IY0hMkVTNoqoYwKEp5UvNNKp/A5jeJUOrIO7judgOyhHT+xC6PA4VBOMAOhdtAYbMRHx9DTgI8p6Z6jhYQPFDA== + dependencies: + sax "1.2.1" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -3886,6 +3993,19 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://repo.huaweicloud.com/repository/npm/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://repo.huaweicloud.com/repository/npm/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-array-buffer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" @@ -3955,6 +4075,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://repo.huaweicloud.com/repository/npm/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" @@ -4276,7 +4401,7 @@ kind-of@^5.0.0, kind-of@^5.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -4296,6 +4421,13 @@ leven@^3.1.0: resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +lie@3.1.1: + version "3.1.1" + resolved "https://repo.huaweicloud.com/repository/npm/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + lilconfig@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" @@ -4332,6 +4464,18 @@ lit@^2.6.1: lit-element "^3.2.0" lit-html "^2.6.0" +loadjs@^4.2.0: + version "4.2.0" + resolved "https://repo.huaweicloud.com/repository/npm/loadjs/-/loadjs-4.2.0.tgz#2a0336376397a6a43edf98c9ec3229ddd5abb6f6" + integrity sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA== + +localforage@^1.7.1: + version "1.10.0" + resolved "https://repo.huaweicloud.com/repository/npm/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -4599,6 +4743,14 @@ mj-context-menu@^0.6.1: resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== +mpegts.js@^1.7.2: + version "1.7.2" + resolved "https://repo.huaweicloud.com/repository/npm/mpegts.js/-/mpegts.js-1.7.2.tgz#4bbb7f813fb87514466d74d0dfb75f801b3b117b" + integrity sha512-qQ1ELBDC4IAqpULFuFzp3hoQeKwD5BCR3UM9Lk2+kj9jCWcXl19spF7PdzX0ZljghPHAj/VL2ajBbGyMWk2fgA== + dependencies: + es6-promise "^4.2.5" + webworkify-webpack "^2.1.5" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4743,6 +4895,13 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +option-validator@^2.0.6: + version "2.0.6" + resolved "https://repo.huaweicloud.com/repository/npm/option-validator/-/option-validator-2.0.6.tgz#a314dae65e26db5f948ef0ff96fc88f18bb76ed6" + integrity sha512-tmZDan2LRIRQyhUGvkff68/O0R8UmF+Btmiiz0SmSw2ng3CfPZB9wJlIjHpe/MKUZqyIZkVIXCrwr1tIN+0Dzg== + dependencies: + kind-of "^6.0.3" + ora@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/ora/-/ora-6.1.2.tgz#7b3c1356b42fd90fb1dad043d5dbe649388a0bf5" @@ -4797,6 +4956,11 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://repo.huaweicloud.com/repository/npm/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -4837,6 +5001,22 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +plyr@^3.7.8: + version "3.7.8" + resolved "https://repo.huaweicloud.com/repository/npm/plyr/-/plyr-3.7.8.tgz#b79bccc23687705b5d9a283b2a88c124bf7471ed" + integrity sha512-yG/EHDobwbB/uP+4Bm6eUpJ93f8xxHjjk2dYcD1Oqpe1EcuQl5tzzw9Oq+uVAzd2lkM11qZfydSiyIpiB8pgdA== + dependencies: + core-js "^3.26.1" + custom-event-polyfill "^1.0.7" + loadjs "^4.2.0" + rangetouch "^2.0.1" + url-polyfill "^1.1.12" + +pngjs@^5.0.0: + version "5.0.0" + resolved "https://repo.huaweicloud.com/repository/npm/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" + integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -4973,6 +5153,16 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +qrcode@^1.5.1: + version "1.5.1" + resolved "https://repo.huaweicloud.com/repository/npm/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" + integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== + dependencies: + dijkstrajs "^1.0.1" + encode-utf8 "^1.0.3" + pngjs "^5.0.0" + yargs "^15.3.1" + query-string@^6.0.0: version "6.14.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" @@ -4995,6 +5185,11 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +rangetouch@^2.0.1: + version "2.0.1" + resolved "https://repo.huaweicloud.com/repository/npm/rangetouch/-/rangetouch-2.0.1.tgz#c01105110fd3afca2adcb1a580692837d883cb70" + integrity sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA== + raphael@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/raphael/-/raphael-2.3.0.tgz#eabeb09dba861a1d4cee077eaafb8c53f3131f89" @@ -5253,6 +5448,11 @@ sass@^1.60.0: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" +sax@1.2.1: + version "1.2.1" + resolved "https://repo.huaweicloud.com/repository/npm/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -5723,6 +5923,11 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" +ua-parser-js@^1.0.2: + version "1.0.35" + resolved "https://repo.huaweicloud.com/repository/npm/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" + integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -5836,6 +6041,11 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== +url-polyfill@^1.1.12: + version "1.1.12" + resolved "https://repo.huaweicloud.com/repository/npm/url-polyfill/-/url-polyfill-1.1.12.tgz#6cdaa17f6b022841b3aec0bf8dbd87ac0cd33331" + integrity sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A== + url-slug@^2.0.0: version "2.3.2" resolved "https://registry.yarnpkg.com/url-slug/-/url-slug-2.3.2.tgz#eab21da0e227deba10610c7b01ec4af20babea21" @@ -5895,7 +6105,7 @@ vue@^3.2.45, vue@^3.2.47: vuepress-plugin-comment2@2.0.0-beta.200: version "2.0.0-beta.200" - resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.200.tgz#54b6a988b9555830612f81e2785e1a7cd9f645dc" + resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.200.tgz#54b6a988b9555830612f81e2785e1a7cd9f645dc" integrity sha512-JHUxUuFu1Yc7ZgkMdFz+s57WbFizjtXhEVBocs+cQnSZBZSpCkb+pOzU49hAP5EjbWwwj3vLweyEupD6os/cJQ== dependencies: "@vuepress/client" "2.0.0-beta.61" @@ -5910,9 +6120,32 @@ vuepress-plugin-comment2@2.0.0-beta.200: vuepress-plugin-sass-palette "2.0.0-beta.200" vuepress-shared "2.0.0-beta.200" +vuepress-plugin-components@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.200.tgz#f691b794436ee28dcd04c9ca7b308c805ec62f45" + integrity sha512-n+EGMshISwiegSpiav1JEeYSxGqByngIFocYYIgEQstjieNRVrf5FRdr41EW+HhIrpaq2ktwmU+YcLS/ZADVDA== + dependencies: + "@stackblitz/sdk" "^1.8.2" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" + artplayer "^4.6.2" + balloon-css "^1.2.0" + dashjs "^4.6.0" + hls.js "^1.3.5" + mpegts.js "^1.7.2" + plyr "^3.7.8" + qrcode "^1.5.1" + vue "^3.2.47" + vue-router "^4.1.6" + vuepress-plugin-reading-time2 "2.0.0-beta.200" + vuepress-plugin-sass-palette "2.0.0-beta.200" + vuepress-shared "2.0.0-beta.200" + vuepress-plugin-copy-code2@2.0.0-beta.200: version "2.0.0-beta.200" - resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.200.tgz#c6734f91e89a2e83a279f3d5cb18dbf3252461b6" + resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.200.tgz#c6734f91e89a2e83a279f3d5cb18dbf3252461b6" integrity sha512-SPOGaSsUd3uFd1cdc27Y1PLtlJQ9yxOmgyFRLOBGGZ4HV0rUNbkCw1nv9ncfYAQxmyQRtbZSWwRKXXwi/tsltQ== dependencies: "@vuepress/client" "2.0.0-beta.61" @@ -5927,7 +6160,7 @@ vuepress-plugin-copy-code2@2.0.0-beta.200: vuepress-plugin-md-enhance@2.0.0-beta.200: version "2.0.0-beta.200" - resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.200.tgz#a5a9a34d6fe12351b0d1d723e909e9dd2b9dc676" + resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.200.tgz#a5a9a34d6fe12351b0d1d723e909e9dd2b9dc676" integrity sha512-KbBopiIe4N1LUdb6KI0Ndh9VXiHCtrqQ+HC03IWHHNBAoXun/CFpAKTtaOOuxBnPF8hIG4v6eLzs/xfAjuYRBg== dependencies: "@babel/core" "^7.21.3" @@ -5969,6 +6202,13 @@ vuepress-plugin-md-enhance@2.0.0-beta.200: vuepress-plugin-sass-palette "2.0.0-beta.200" vuepress-shared "2.0.0-beta.200" +vuepress-plugin-reading-time2@2.0.0-beta.200: + version "2.0.0-beta.200" + resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.200.tgz#a37c7947b3ff2ee845ceaf1cd60257aa74563676" + integrity sha512-4svs6BowtlSCQcEgRGZmLucsy+DLl25MrSRojuG8rDL8a5UK54XMy5gxUbfPQtoZyJl8vpT7ab86snKQje0V3Q== + dependencies: + vuepress-shared "2.0.0-beta.200" + vuepress-plugin-sass-palette@2.0.0-beta.200: version "2.0.0-beta.200" resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.200.tgz#29a5c1d14de8eb447242d72aa339fd641f077771" @@ -5982,7 +6222,7 @@ vuepress-plugin-sass-palette@2.0.0-beta.200: vuepress-plugin-seo2@2.0.0-beta.200: version "2.0.0-beta.200" - resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.200.tgz#70c06239e84051992ab48afbe4b39a1b2201a51f" + resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.200.tgz#70c06239e84051992ab48afbe4b39a1b2201a51f" integrity sha512-CC2fCeJT1pTVH+/du7mju8q73aqDOB3JHPjF5QVwamLoWlmQFivgGInFaGtifWMcLNzzeeL5Fgk4OLp+XgGXBw== dependencies: "@vuepress/shared" "2.0.0-beta.61" @@ -6042,6 +6282,11 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webworkify-webpack@^2.1.5: + version "2.1.5" + resolved "https://repo.huaweicloud.com/repository/npm/webworkify-webpack/-/webworkify-webpack-2.1.5.tgz#bf4336624c0626cbe85cf1ffde157f7aa90b1d1c" + integrity sha512-2akF8FIyUvbiBBdD+RoHpoTbHMQF2HwjcxfDvgztAX5YwbZNyrtfUMgvfgFVsgDhDPVTlkbb5vyasqDHfIDPQw== + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" From 895e793a36b09d4e77a8a23895da01c50b112742 Mon Sep 17 00:00:00 2001 From: itlemon Date: Thu, 6 Apr 2023 20:04:34 +0800 Subject: [PATCH 41/61] =?UTF-8?q?mod:=20=E6=B7=BB=E5=8A=A0chatgpt=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b61f481..044477c 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "@vuepress/plugin-pwa-popup": "2.0.0-beta.61", "@vuepress/plugin-search": "2.0.0-beta.61", "vuepress": "2.0.0-beta.61", - "vuepress-plugin-components": "2.0.0-beta.200", "vuepress-plugin-comment2": "2.0.0-beta.200", + "vuepress-plugin-components": "2.0.0-beta.200", "vuepress-plugin-copy-code2": "2.0.0-beta.200", "vuepress-plugin-md-enhance": "2.0.0-beta.200", "vuepress-plugin-seo2": "2.0.0-beta.200" From 847d54c31e9f2ce676806ba992b54d51a4f746ea Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 18 Apr 2023 10:37:45 +0800 Subject: [PATCH 42/61] =?UTF-8?q?mod:=20=E6=B7=BB=E5=8A=A0chatgpt=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/public/huangnanmeng2.html | 9 +++++++++ docs/.vuepress/public/huangnanmeng3.html | 9 +++++++++ docs/.vuepress/public/huangnanmeng4.html | 9 +++++++++ 3 files changed, 27 insertions(+) create mode 100644 docs/.vuepress/public/huangnanmeng2.html create mode 100644 docs/.vuepress/public/huangnanmeng3.html create mode 100644 docs/.vuepress/public/huangnanmeng4.html diff --git a/docs/.vuepress/public/huangnanmeng2.html b/docs/.vuepress/public/huangnanmeng2.html new file mode 100644 index 0000000..b1b4132 --- /dev/null +++ b/docs/.vuepress/public/huangnanmeng2.html @@ -0,0 +1,9 @@ + + + + 证书查询 + + + \ No newline at end of file diff --git a/docs/.vuepress/public/huangnanmeng3.html b/docs/.vuepress/public/huangnanmeng3.html new file mode 100644 index 0000000..ba50c2f --- /dev/null +++ b/docs/.vuepress/public/huangnanmeng3.html @@ -0,0 +1,9 @@ + + + + 证书查询 + + + \ No newline at end of file diff --git a/docs/.vuepress/public/huangnanmeng4.html b/docs/.vuepress/public/huangnanmeng4.html new file mode 100644 index 0000000..762fec3 --- /dev/null +++ b/docs/.vuepress/public/huangnanmeng4.html @@ -0,0 +1,9 @@ + + + + 证书查询 + + + \ No newline at end of file From a7e339c50cce6605d52ed9c849b1dd5e10531f72 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 18 Apr 2023 11:14:45 +0800 Subject: [PATCH 43/61] =?UTF-8?q?mod:=20=E4=BF=AE=E6=94=B9=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 23 +++++------------------ deploy_dev.sh | 23 +++++------------------ 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/deploy.sh b/deploy.sh index 8941ccd..e85310a 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,34 +1,21 @@ #! /bin/bash # author: itlemon -port=4000 +portArg=4000 # 通过ss的方式获取pid function get_pid_by_listen_port() { - pattern_str="*:$port\\b" - pid=$(ss -n -t -l -p | grep "$pattern_str" | column -t | awk -F ',' '{print $(NF-1)}') - - # 当版本号为 "ss utility, iproute2-ss161009" 时, ss 命令输出格式为: - # LISTEN 0 5 *:8000 *:* users:(("python2.7",pid=7130,fd=3)) - # 此时需要进一步处理, 只获取进程 PID 值. - [[ $pid =~ "pid" ]] && pid=$(echo $pid | awk -F '=' '{print $NF}') - - echo $pid -} - -# 通过netstat的方式获取pid -function get_pid_by_listen_port2() { - pid=$(netstat -nlp | grep $port | awk '{print $7}' | grep -o -E '[0-9]+') - echo $pid + local port="$1" + lsof -t -i :"$port" } -pid=$(get_pid_by_listen_port $port) +pid=$(get_pid_by_listen_port $portArg) if [ -n "$pid" ] then echo "find pid: $pid, kill it..." kill $pid else - echo 'cannot find listened port: '$port + echo 'cannot find listened port: '$portArg fi if git rev-parse --verify master diff --git a/deploy_dev.sh b/deploy_dev.sh index e4991c2..b8ab5a7 100755 --- a/deploy_dev.sh +++ b/deploy_dev.sh @@ -1,34 +1,21 @@ #! /bin/bash # author: itlemon -port=4000 +portArg=4000 # 通过ss的方式获取pid function get_pid_by_listen_port() { - pattern_str="*:$port\\b" - pid=$(ss -n -t -l -p | grep "$pattern_str" | column -t | awk -F ',' '{print $(NF-1)}') - - # 当版本号为 "ss utility, iproute2-ss161009" 时, ss 命令输出格式为: - # LISTEN 0 5 *:8000 *:* users:(("python2.7",pid=7130,fd=3)) - # 此时需要进一步处理, 只获取进程 PID 值. - [[ $pid =~ "pid" ]] && pid=$(echo $pid | awk -F '=' '{print $NF}') - - echo $pid -} - -# 通过netstat的方式获取pid -function get_pid_by_listen_port2() { - pid=$(netstat -nlp | grep $port | awk '{print $7}' | grep -o -E '[0-9]+') - echo $pid + local port="$1" + lsof -t -i :"$port" } -pid=$(get_pid_by_listen_port $port) +pid=$(get_pid_by_listen_port $portArg) if [ -n "$pid" ] then echo "find pid: $pid, kill it..." kill $pid else - echo 'cannot find listened port: '$port + echo 'cannot find listened port: '$portArg fi if git rev-parse --verify dev From de30e6335aedab20e8655eb0b1ff206baec68f4b Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 7 May 2023 22:33:02 +0800 Subject: [PATCH 44/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/resources/chatgpt/README.md | 459 ++++++++++++++++++++++++++++++- 1 file changed, 458 insertions(+), 1 deletion(-) diff --git a/docs/resources/chatgpt/README.md b/docs/resources/chatgpt/README.md index 4cc50e6..a1f16b4 100644 --- a/docs/resources/chatgpt/README.md +++ b/docs/resources/chatgpt/README.md @@ -1,3 +1,460 @@ # ChatGPT -内容即将发布,敬请期待 \ No newline at end of file +chatgpt4j 是一个用于访问 ChatGPT API 的 Java 客户端库,支持 OpenAI 全部的[接口](https://platform.openai.com/docs/api-reference/introduction),几行代码就可以帮助用户实现将 ChatGPT 快速接入到自己的项目中。 + +GitHub地址:https://github.com/itlemon/chatgpt4j + +## 特性⛳️ + +- 支持 OpenAI 提供的全部接口 +- 支持多 ApiKey 模式 +- 支持多 ApiKey 随机选择策略及自定义选择策略 +- 支持自定义 OkHttpClient +- 支持自定义 Http 请求过程的日志级别 +- 支持自定义模型定义,方便后续在未更新该 SDK 的情况下,也可以使用到最新的 OpenAI 模型 +- 支持接口请求参数使用 Builder 模型来构建,极大地简化参数构建过程 +- 支持 Http 或者 Socks 代理模式,解决大陆无法访问 OpenAI 接口的问题 +- 更多特性,敬请期待... + +## 更新日志📝 + +- [x] 1.0.0 支持 OpenAI 提供的全部接口 + +## 接口支持🧩 + +目前支持官方全部的接口,具体描述如下表所示: + +| 接口 | 接口说明 | 接口列表 | 是否支持 | +|:----------------:|:-------------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------------|:----:| +| Models | 列出并描述 API 中可用的各种模型,您可以参考[模型文档](https://platform.openai.com/docs/models)以了解可用的模型以及它们之间的区别。 | 1.获取所有模型详情列表
2.根据模型 ID 检索某个模型详情 | ✅ | +| Completions | 给定一个提示,模型将返回一个或多个预测的完成结果,并可以在每个位置返回替代标记的概率。Completions 类任务,通俗点理解的话,完形填空、句子补齐、写作文、翻译都算这类任务,它按照的你要求帮你生成你需要的结果。 | 1.创建 completion | ✅ | +| Chat Completions | 给定一个描述对话的消息列表,该模型将返回一个响应。Chat Completions 类任务,通俗点理解的话,可以设置一些角色情景,实现连续对话,聊天式对话等。 | 1.创建 chat completion | ✅ | +| Edits | 给定提示和指令,模型将返回按照提示的要求完成文本等内容的编辑。 | 1.创建 edits | ✅ | +| Images | 给定提示和指令,模型将返回按照提示的要求创建图像、编辑图像、根据已有图像创建变体等操作的结果。 | 1.根据提示创建图像
2.根据提示编辑图像
3.根据提示创建指定图像的变体 | ✅ | +| Embeddings | 获取一个给定输入的向量表示,该向量可以轻松地被机器学习模型和算法所使用。 | 1.创建表示输入文本的嵌入向量 | ✅ | +| Audio | 给定一段音频,模型将音频转成文字。 | 1.将音频转录为输入语言
2.将音频翻译成英文 | ✅ | +| Files | 文件管理相关接口,这些文件上传后可与微调等功能一起使用,用于训练特定模型。 | 1.获取属于用户组织的文件列表
2.上传文件
3.删除文件
4.检索文件
5.检索文件内容(收费接口) | ✅ | +| Fine-Tunes | 根据已经上传的训练数据文件和已有模型来训练特定的模型,这类接口用于管理 Fine-Tunes 任务。 | 1.创建一个从给定数据集微调指定模型的作业
2.列出属于用户组织的微调作业
3.检索微调作业
4.取消一个微调作业
5.获取微调作业的事件状态
6.删除微调后的模型 | ✅ | +| Moderations | Moderation 用来审查内容是否符合 OpenAI 的内容政策。 | 1.创建一个文本审查任务 | ✅ | +| Engines | 管理引擎的相关接口,这类接口已经废弃,目前由 Models 来代替。 | 1.获取已有引擎列表
2.检索引擎 | ✅ | + +## 快速开始🚀 + +本项目所有的接口都经过了详细的测试,读者可以参考测试类:[cn.codingguide.chatgpt4j.client.DefaultChatGptClientTest](https://github.com/itlemon/chatgpt4j/blob/master/src/test/java/cn/codingguide/chatgpt4j/client/DefaultChatGptClientTest.java) + +### 1.导入pom依赖 + +目前最新版本是 1.0.0,读者可以从[中央仓库](https://mvnrepository.com/artifact/cn.codingguide/chatgpt4j)搜索最新版本导入到pom中即可。 + +```xml + + cn.codingguide + chatgpt4j + 1.0.0 + +``` + +或者直接 clone 本项目到本地,将其安装到本地仓库中。 + +### 2.默认客户端使用案例 + +默认客户端请参考代码:[cn.codingguide.chatgpt4j.DefaultChatGptClient](https://github.com/itlemon/chatgpt4j/blob/master/src/main/java/cn/codingguide/chatgpt4j/DefaultChatGptClient.java) + +创建一个默认的客户端,代码案例如下: + +```java +public class DefaultChatGptClientTest { + + private DefaultChatGptClient client; + + @Before + public void setUp() { + client = DefaultChatGptClient.newBuilder() + // 这里替换成自己的key,该参数是必填项 + .apiKeys(Arrays.asList("sk-******")) + // 设置apiHost,如果没有自己的api地址,可以不用设置,默认是:https://api.openai.com/ + .apiHost("https://xxxxx/") + // 设置proxy代理,方便大陆通过代理访问OpenAI,支持Http代理或者Socks代理,两者只需要设置其一即可,两者都设置,后者将覆盖前者 + .proxyHttp("127.0.0.1", 8080) + .proxySocks("127.0.0.1", 8081) + // 支持自定义OkHttpClient,该参数非必填,没有填写将使用默认的OkHttpClient + .okHttpClient(null) + // 设置apiKey选择策略,该参数是非必填项,如果没有填写,将使用默认的随机选择器(RandomKeySelectorStrategy),用户可以通过实现KeySelectorStrategy接口提供自定义选择器 + .keySelectorStrategy(new RandomKeySelectorStrategy()) + // 设置开启日志,非必填项,默认没有打印请求日志,测试期间可以设置BODY日志,日志量较大,生产环境不建议开启 + .logLevel(HttpLoggingInterceptor.Level.BODY) + .build(); + } + +} +``` + +上述案例中,OkHttpClient 没有设置(或者设置为null)将采用默认的 OkHttpClient,该 Client 配置如下所示: + +```java +private OkHttpClient okHttpClient() { + return new OkHttpClient.Builder() + // 默认客户端没有代理 + .proxy(Proxy.NO_PROXY) + .addInterceptor(new ResponseInterceptor()) + .connectTimeout(30, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .build(); +} +``` + +该默认的 Client 中,各类超时时间设置的是 30s,且没有设置代理,代理由 DefaultChatGptClient 中的 proxyHttp 或者 proxySocks 来设置,同理,http 请求日志级别,也由 DefaultChatGptClient 中的 logLevel 来统一设置。 + +用户如果有需要自定义 OkHttpClient,那么只需要简单定义一个 OkHttpClient 即可,通过 DefaultChatGptClient 中的 okHttpClient 方法设置进来。 + +```java +OkHttpClient okHttpClient = new OkHttpClient + .Builder() + // 自定义拦截器Interceptor,实现请求前后的拦截 + .addInterceptor(Interceptor) + // 自定义超时时间 + .connectTimeout(10, TimeUnit.SECONDS) + .writeTimeout(10, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS) + .build(); +``` + +DefaultChatGptClient 是一个线程安全的类,可以全局保留一个即可,可以在项目启动的时候创建一个缓存起来,后续复用即可。最简单的客户端构建代码如下所示: + +```java +public class DefaultChatGptClientTest { + + private DefaultChatGptClient client; + + @Before + public void setUp() { + client = DefaultChatGptClient.newBuilder() + // 这里替换成自己的key,该参数是必填项 + .apiKeys(Arrays.asList("sk-******")) + .build(); + } + +} +``` + +### 3.接口使用案例 + +下面的接口案例中,对每一个接口都进行了测试,读者可以 clone 代码到本地,自行测试使用。 + +```java +public class DefaultChatGptClientTest { + + private DefaultChatGptClient client; + + @Before + public void setUp() { + client = DefaultChatGptClient.newBuilder() + // 这里替换成自己的key,该参数是必填项 + .apiKeys(Arrays.asList("sk-******")) + // 设置apiHost,如果没有自己的api地址,可以不用设置,默认是:https://api.openai.com/ + // .apiHost("https://xxxxx/") + // 设置proxy代理,方便大陆通过代理访问OpenAI,支持Http代理或者Socks代理,两者只需要设置其一即可,两者都设置,后者将覆盖前者 + // .proxyHttp("127.0.0.1", 8080) + // .proxySocks("127.0.0.1", 8081) + // 支持自定义OkHttpClient,该参数非必填,没有填写将使用默认的OkHttpClient + // .okHttpClient(null) + // 设置apiKey选择策略,该参数是非必填项,如果没有填写,将使用默认的随机选择器(RandomKeySelectorStrategy),用户可以通过实现KeySelectorStrategy接口提供自定义选择器 + // .keySelectorStrategy(new RandomKeySelectorStrategy()) + // 设置开启日志,非必填项,默认没有打印请求日志,测试期间可以设置BODY日志,日志量较大,生产环境不建议开启 + .logLevel(HttpLoggingInterceptor.Level.BODY) + .build(); + } + + @Test + public void models() { + client.models().forEach(e -> { + System.out.print(e.getId() + " "); + System.out.print(e.getOwnedBy() + " "); + System.out.print(e.getObject() + " "); + System.out.println(e.getCreated() + " "); + }); + } + + @Test + public void model() { + Model model = client.model("text-search-ada-query-001"); + System.out.println(model); + } + + @Test + public void simpleCompletions() { + CompletionResponse completions = client.completions("可以帮我介绍一下《三体》这部电视剧吗?"); + System.out.println(completions); + } + + @Test + public void continuousCompletions() { + CompletionRequest question = CompletionRequest.newBuilder() + .prompt("帮我查一下世界上综合实力最强的前三名大学名称?\n") + .echo(true) + .build(); + CompletionResponse completions = client.completions(question); + String text = completions.getChoices()[0].getText(); + + question = question.toBuilder() + .prompt(text + "\n\n" + "前五名呢?\n") + .build(); + completions = client.completions(question); + text = completions.getChoices()[0].getText(); + + question = question.toBuilder() + .prompt(text + "\n\n" + "前十名呢?\n") + .build(); + completions = client.completions(question); + text = completions.getChoices()[0].getText(); + + question = question.toBuilder() + .prompt(text + "\n\n" + "这前十名高校中,美国占了几所?分别是哪些?\n") + .build(); + completions = client.completions(question); + text = completions.getChoices()[0].getText(); + System.out.println(text); + } + + @Test + public void chatCompletions() { + ChatCompletionRequest question = ChatCompletionRequest.newBuilder() + .addMessage(Message.newBuilder().role(Role.SYSTEM).content("假设你是一名Java开发工程师!").build()) + .addMessage(Message.newBuilder().role(Role.USER).content("考你一个问题:你知道中国的Java之父是谁吗?") + .build()) + .build(); + ChatCompletionResponse chatCompletion = client.chatCompletions(question); + question = question.toBuilder() + .addMessage(Message.newBuilder().role(Role.ASSISTANT) + .content(chatCompletion.getChoices()[0].getMessage().getContent()).build()) + .addMessage( + Message.newBuilder().role(Role.USER).content("他到目前为止,出了哪些Java相关的书籍?").build()) + .build(); + chatCompletion = client.chatCompletions(question); + + // 格式化输出整个过程 + List messages = question.getMessages(); + for (Message message : messages) { + System.out.println(message.getContent()); + System.out.println(); + } + + System.out.println(chatCompletion.getChoices()[0].getMessage().getContent()); + } + + @Test + public void editText() { + EditRequest request = EditRequest.newBuilder() + .input("What day of the wek is it?") + .instruction("Fix the spelling mistakes.") + .build(); + EditResponse edit = client.edit(request); + System.out.println(edit.getChoices()[0].getText()); + } + + @Test + public void editCode() { + EditRequest request = EditRequest.newBuilder() + // 修改代码,使用代码通用模型 + .model(EditModel.CODE_DAVINCI_EDIT_001) + .input("sout(\"Hello World!\")") + .instruction("帮我修改成正确的Java代码.") + .build(); + EditResponse edit = client.edit(request); + System.out.println(edit.getChoices()[0].getText()); + } + + @Test + public void imageGenerations() { + ImageGenerationRequest image = ImageGenerationRequest.newBuilder() + .prompt("给我画一个熟睡的小婴儿。") + .responseFormat(ImageResponseFormat.B64_JSON) + .build(); + ImageResponse imageResponse = client.imageGenerations(image); + System.out.println(imageResponse); + } + + @Test + public void simpleImageGenerations() { + ImageResponse imageResponse = client.imageGenerations("给我画一个熟睡的小婴儿。"); + System.out.println(imageResponse); + } + + @Test + public void simpleImageEdits() { + ImageResponse imageResponse = client.imageEdits("/Users/xxxx/Desktop/test.png", "请将图片中的英文去掉"); + System.out.println(imageResponse); + } + + @Test + public void imageEdits() { + ImageEditRequest imageEditRequest = ImageEditRequest.newBuilder() + .image("/Users/xxxx/Desktop/test.png") + .prompt("请将图片中的英文去掉") + .size(ImageSize.SIZE_256) + .user("testUser") + .build(); + System.out.println(client.imageEdits(imageEditRequest)); + } + + @Test + public void imageVariations() { + ImageVariationRequest imageVariation = ImageVariationRequest.newBuilder() + .image("/Users/xxxx/Desktop/test.png") + .size(ImageSize.SIZE_256) + .build(); + System.out.println(client.imageVariations(imageVariation)); + + } + + @Test + public void simpleEmbeddings() { + System.out.println(client.embeddings("我是中国人,我爱你中国!")); + } + + @Test + public void simpleEmbeddings1() { + System.out.println(client.embeddings(Arrays.asList("我是中国人,我爱你中国!", "I love you! China."))); + } + + @Test + public void simpleSpeechToTextTranscriptions() { + System.out.println(client.speechToTextTranscriptions("/Users/xxxx/Desktop/german.m4a")); + } + + @Test + public void speechToTextTranscriptions() { + TranscriptionRequest build = TranscriptionRequest.newBuilder() + .file("/Users/xxxx/Desktop/german.m4a") + .model(TranscriptionModel.WHISPER_1) + .prompt("将音频内容转换成中文") + .language("zh") + .temperature(0.2) + .responseFormat(TranscriptionResponseFormat.JSON) + .build(); + System.out.println(client.speechToTextTranscriptions(build)); + } + + @Test + public void simpleSpeechToTextTranslations() { + System.out.println(client.speechToTextTranslations("/Users/xxxx/Desktop/german.m4a")); + } + + @Test + public void speechToTextTranslations() { + TranslationRequest build = TranslationRequest.newBuilder() + .file("/Users/xxxx/Desktop/german.m4a") + .model(TranscriptionModel.WHISPER_1) + .prompt("Please translate the audio content into English.") + .temperature(0.2) + .responseFormat(TranscriptionResponseFormat.JSON) + .build(); + System.out.println(client.speechToTextTranslations(build)); + } + + @Test + public void files() { + System.out.println(client.files()); + } + + @Test + public void uploadFile() { + String filePath = "/Users/xxxx/Desktop/test.txt"; + System.out.println(client.uploadFile(filePath)); + } + + @Test + public void uploadFileWithPurpose() { + String filePath = "/Users/xxxx/Desktop/test.txt"; + System.out.println(client.uploadFile(filePath, "fine-tune")); + } + + @Test + public void deleteFile() { + System.out.println(client.deleteFile("file-y8EycSoRW3VZUOVXRMqJYQAP")); + } + + @Test + public void retrieveFile() { + System.out.println(client.retrieveFile("file-75dy5RmHbcM7aO4zjZLEv4FC")); + } + + @Test + public void retrieveFileContent() { + // 该接口非plus无法调用,会返回:To help mitigate abuse, downloading of fine-tune training files is disabled for free accounts. + System.out.println(client.retrieveFileContent("file-75dy5RmHbcM7aO4zjZLEv4FC")); + } + + @Test + public void simpleFineTune() { + System.out.println(client.fineTune("file-ZX7aR5aNF0ejVYFM8bCN9zNW")); + } + + @Test + public void fineTune() { + FineTuneRequest fineTuneRequest = FineTuneRequest.newBuilder() + .trainingFile("file-ZX7aR5aNF0ejVYFM8bCN9zNW") + .suffix("codingguide-cn") + .model(FineTuneModel.DAVINCI) + .build(); + System.out.println(client.fineTune(fineTuneRequest)); + } + + @Test + public void fineTunes() { + System.out.println(client.fineTunes()); + } + + @Test + public void retrieveFineTune() { + System.out.println(client.retrieveFineTune("ft-HP1rZOIARmWUlcAaPi4obN8O")); + } + + @Test + public void cancelFineTune() { + System.out.println(client.cancelFineTune("ft-iLDdAoQvKH777yNvBVfGUoGq")); + } + + @Test + public void fineTuneEvents() { + System.out.println(client.fineTuneEvents("ft-iLDdAoQvKH777yNvBVfGUoGq")); + } + + @Test + public void deleteFineTuneModel() { + System.out.println(client.deleteFineTuneModel("")); + } + + @Test + public void simpleModerations() { + System.out.println(client.moderations("I want to kill them.")); + } + + @Test + public void simpleModerations1() { + System.out.println(client.moderations(Arrays.asList("I want to kill them.", "I love you."))); + } + + @Test + public void moderationss() { + ModerationRequest moderationRequest = ModerationRequest.newBuilder() + .addInput("I want to kill them.") + .addInput("I love you.") + .model(ModerationModel.TEXT_MODERATION_LATEST) + .build(); + System.out.println(client.moderations(moderationRequest)); + } + + @Test + public void engines() { + System.out.println(client.engines()); + } + + @Test + public void engine() { + System.out.println(client.engine("text-davinci-edit-001")); + } + +} +``` From 106464b91b446299180f7ca932648e19526088e4 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 7 May 2023 23:17:55 +0800 Subject: [PATCH 45/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/resources/chatgpt/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/resources/chatgpt/README.md b/docs/resources/chatgpt/README.md index a1f16b4..29d49ba 100644 --- a/docs/resources/chatgpt/README.md +++ b/docs/resources/chatgpt/README.md @@ -18,6 +18,7 @@ GitHub地址:https://github.com/itlemon/chatgpt4j ## 更新日志📝 +- [x] 1.0.1 将 KeySelectorStrategy 设置为函数式接口 - [x] 1.0.0 支持 OpenAI 提供的全部接口 ## 接口支持🧩 @@ -44,13 +45,13 @@ GitHub地址:https://github.com/itlemon/chatgpt4j ### 1.导入pom依赖 -目前最新版本是 1.0.0,读者可以从[中央仓库](https://mvnrepository.com/artifact/cn.codingguide/chatgpt4j)搜索最新版本导入到pom中即可。 +目前最新版本是 1.0.1,读者可以从[中央仓库](https://mvnrepository.com/artifact/cn.codingguide/chatgpt4j)搜索最新版本导入到pom中即可。 ```xml cn.codingguide chatgpt4j - 1.0.0 + 1.0.1 ``` From ad6bdf4c7d3140b1d469b3159a0eaa6b81998a58 Mon Sep 17 00:00:00 2001 From: itlemon Date: Fri, 12 May 2023 10:47:03 +0800 Subject: [PATCH 46/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 22 +- yarn.lock | 1921 ++++++++++++++++++++++++++++---------------------- 2 files changed, 1079 insertions(+), 864 deletions(-) diff --git a/package.json b/package.json index 044477c..5ed59d3 100644 --- a/package.json +++ b/package.json @@ -7,17 +7,17 @@ "author": "itlemon ", "license": "MIT", "dependencies": { - "@goy/vuepress-plugin-svg-icons": "5.3.2", - "@vuepress/plugin-google-analytics": "2.0.0-beta.61", - "@vuepress/plugin-pwa": "2.0.0-beta.61", - "@vuepress/plugin-pwa-popup": "2.0.0-beta.61", - "@vuepress/plugin-search": "2.0.0-beta.61", - "vuepress": "2.0.0-beta.61", - "vuepress-plugin-comment2": "2.0.0-beta.200", - "vuepress-plugin-components": "2.0.0-beta.200", - "vuepress-plugin-copy-code2": "2.0.0-beta.200", - "vuepress-plugin-md-enhance": "2.0.0-beta.200", - "vuepress-plugin-seo2": "2.0.0-beta.200" + "@goy/vuepress-plugin-svg-icons": "5.3.3", + "@vuepress/plugin-google-analytics": "2.0.0-beta.62", + "@vuepress/plugin-pwa": "2.0.0-beta.62", + "@vuepress/plugin-pwa-popup": "2.0.0-beta.62", + "@vuepress/plugin-search": "2.0.0-beta.62", + "vuepress": "2.0.0-beta.62", + "vuepress-plugin-comment2": "2.0.0-beta.210", + "vuepress-plugin-components": "2.0.0-beta.210", + "vuepress-plugin-copy-code2": "2.0.0-beta.210", + "vuepress-plugin-md-enhance": "2.0.0-beta.210", + "vuepress-plugin-seo2": "2.0.0-beta.210" }, "scripts": { "docs:dev": "vuepress dev docs --clean-cache", diff --git a/yarn.lock b/yarn.lock index 0f4b210..e52e177 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,11 +26,23 @@ dependencies: "@babel/highlight" "^7.18.6" +"@babel/code-frame@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" + integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5": version "7.20.14" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== +"@babel/compat-data@^7.21.5": + version "7.21.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" + integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== + "@babel/core@^7.11.1": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" @@ -52,21 +64,21 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.3.tgz#cf1c877284a469da5d1ce1d1e53665253fae712e" - integrity sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw== +"@babel/core@^7.21.8": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" + integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.3" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-compilation-targets" "^7.21.5" + "@babel/helper-module-transforms" "^7.21.5" + "@babel/helpers" "^7.21.5" + "@babel/parser" "^7.21.8" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.3" - "@babel/types" "^7.21.3" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -82,22 +94,12 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.21.1": - version "7.21.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.1.tgz#951cc626057bc0af2c35cd23e9c64d384dea83dd" - integrity sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA== - dependencies: - "@babel/types" "^7.21.0" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.3.tgz#232359d0874b392df04045d72ce2fd9bb5045fce" - integrity sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA== +"@babel/generator@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" + integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== dependencies: - "@babel/types" "^7.21.3" + "@babel/types" "^7.21.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -128,6 +130,17 @@ lru-cache "^5.1.1" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" + integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== + dependencies: + "@babel/compat-data" "^7.21.5" + "@babel/helper-validator-option" "^7.21.0" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.5", "@babel/helper-create-class-features-plugin@^7.20.7": version "7.20.12" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz#4349b928e79be05ed2d1643b20b99bb87c503819" @@ -167,6 +180,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" + integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== + "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" @@ -211,6 +229,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.21.4": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11": version "7.20.11" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" @@ -225,19 +250,19 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" -"@babel/helper-module-transforms@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== +"@babel/helper-module-transforms@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" + integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-module-imports" "^7.21.4" + "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -280,6 +305,13 @@ dependencies: "@babel/types" "^7.20.2" +"@babel/helper-simple-access@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" + integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== + dependencies: + "@babel/types" "^7.21.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" @@ -299,6 +331,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" @@ -309,6 +346,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== +"@babel/helper-validator-option@^7.21.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" + integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== + "@babel/helper-wrap-function@^7.18.9": version "7.20.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" @@ -328,14 +370,14 @@ "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== +"@babel/helpers@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" + integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== dependencies: "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" + "@babel/traverse" "^7.21.5" + "@babel/types" "^7.21.5" "@babel/highlight@^7.18.6": version "7.18.6" @@ -351,10 +393,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== -"@babel/parser@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.2.tgz#dacafadfc6d7654c3051a66d6fe55b6cb2f2a0b3" - integrity sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ== +"@babel/parser@^7.20.15", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": + version "7.21.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" + integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== "@babel/parser@^7.21.3": version "7.21.3" @@ -991,35 +1033,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.2.tgz#ac7e1f27658750892e815e60ae90f382a46d8e75" - integrity sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw== +"@babel/traverse@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" + integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.1" - "@babel/helper-environment-visitor" "^7.18.9" + "@babel/code-frame" "^7.21.4" + "@babel/generator" "^7.21.5" + "@babel/helper-environment-visitor" "^7.21.5" "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.2" - "@babel/types" "^7.21.2" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.3.tgz#4747c5e7903d224be71f90788b06798331896f67" - integrity sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.21.3" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.3" - "@babel/types" "^7.21.3" + "@babel/parser" "^7.21.5" + "@babel/types" "^7.21.5" debug "^4.1.0" globals "^11.1.0" @@ -1032,7 +1058,7 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.21.0", "@babel/types@^7.21.2": +"@babel/types@^7.21.0": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== @@ -1041,12 +1067,12 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.3.tgz#4865a5357ce40f64e3400b0f3b737dc6d4f64d05" - integrity sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg== +"@babel/types@^7.21.4", "@babel/types@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== dependencies: - "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-string-parser" "^7.21.5" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" @@ -1055,122 +1081,122 @@ resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== -"@esbuild/android-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" - integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== - -"@esbuild/android-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" - integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== - -"@esbuild/android-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" - integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== - -"@esbuild/darwin-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" - integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== - -"@esbuild/darwin-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" - integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== - -"@esbuild/freebsd-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" - integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== - -"@esbuild/freebsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" - integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== - -"@esbuild/linux-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" - integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== - -"@esbuild/linux-arm@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" - integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== - -"@esbuild/linux-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" - integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== - -"@esbuild/linux-loong64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" - integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== - -"@esbuild/linux-mips64el@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" - integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== - -"@esbuild/linux-ppc64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" - integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== - -"@esbuild/linux-riscv64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" - integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== - -"@esbuild/linux-s390x@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" - integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== - -"@esbuild/linux-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" - integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== - -"@esbuild/netbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" - integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== - -"@esbuild/openbsd-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" - integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== - -"@esbuild/sunos-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" - integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== - -"@esbuild/win32-arm64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" - integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== - -"@esbuild/win32-ia32@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" - integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== - -"@esbuild/win32-x64@0.16.17": - version "0.16.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" - integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== - -"@goy/vuepress-plugin-svg-icons@5.3.2": - version "5.3.2" - resolved "https://registry.yarnpkg.com/@goy/vuepress-plugin-svg-icons/-/vuepress-plugin-svg-icons-5.3.2.tgz#f63ad4e0e0a8348b24a4b8c551b7812950ee86e4" - integrity sha512-23hubRO33YeP7nBYzaxcWdjmz/daKMFlZQ625XKB/a5E2pdAy3wtQg7rDKFbWmdx61phRauiOy0W/68NhiNIzA== - dependencies: - "@vuepress/client" "2.0.0-beta.60" +"@esbuild/android-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.18.tgz#4aa8d8afcffb4458736ca9b32baa97d7cb5861ea" + integrity sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw== + +"@esbuild/android-arm@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.18.tgz#74a7e95af4ee212ebc9db9baa87c06a594f2a427" + integrity sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw== + +"@esbuild/android-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.18.tgz#1dcd13f201997c9fe0b204189d3a0da4eb4eb9b6" + integrity sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg== + +"@esbuild/darwin-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.18.tgz#444f3b961d4da7a89eb9bd35cfa4415141537c2a" + integrity sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ== + +"@esbuild/darwin-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.18.tgz#a6da308d0ac8a498c54d62e0b2bfb7119b22d315" + integrity sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A== + +"@esbuild/freebsd-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.18.tgz#b83122bb468889399d0d63475d5aea8d6829c2c2" + integrity sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA== + +"@esbuild/freebsd-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.18.tgz#af59e0e03fcf7f221b34d4c5ab14094862c9c864" + integrity sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew== + +"@esbuild/linux-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.18.tgz#8551d72ba540c5bce4bab274a81c14ed01eafdcf" + integrity sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ== + +"@esbuild/linux-arm@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.18.tgz#e09e76e526df4f665d4d2720d28ff87d15cdf639" + integrity sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg== + +"@esbuild/linux-ia32@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.18.tgz#47878860ce4fe73a36fd8627f5647bcbbef38ba4" + integrity sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ== + +"@esbuild/linux-loong64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.18.tgz#3f8fbf5267556fc387d20b2e708ce115de5c967a" + integrity sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ== + +"@esbuild/linux-mips64el@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.18.tgz#9d896d8f3c75f6c226cbeb840127462e37738226" + integrity sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA== + +"@esbuild/linux-ppc64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.18.tgz#3d9deb60b2d32c9985bdc3e3be090d30b7472783" + integrity sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ== + +"@esbuild/linux-riscv64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.18.tgz#8a943cf13fd24ff7ed58aefb940ef178f93386bc" + integrity sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA== + +"@esbuild/linux-s390x@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.18.tgz#66cb01f4a06423e5496facabdce4f7cae7cb80e5" + integrity sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw== + +"@esbuild/linux-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.18.tgz#23c26050c6c5d1359c7b774823adc32b3883b6c9" + integrity sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA== + +"@esbuild/netbsd-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.18.tgz#789a203d3115a52633ff6504f8cbf757f15e703b" + integrity sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg== + +"@esbuild/openbsd-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.18.tgz#d7b998a30878f8da40617a10af423f56f12a5e90" + integrity sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA== + +"@esbuild/sunos-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.18.tgz#ecad0736aa7dae07901ba273db9ef3d3e93df31f" + integrity sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg== + +"@esbuild/win32-arm64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.18.tgz#58dfc177da30acf956252d7c8ae9e54e424887c4" + integrity sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg== + +"@esbuild/win32-ia32@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.18.tgz#340f6163172b5272b5ae60ec12c312485f69232b" + integrity sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw== + +"@esbuild/win32-x64@0.17.18": + version "0.17.18" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz#3a8e57153905308db357fd02f57c180ee3a0a1fa" + integrity sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg== + +"@goy/vuepress-plugin-svg-icons@5.3.3": + version "5.3.3" + resolved "https://registry.yarnpkg.com/@goy/vuepress-plugin-svg-icons/-/vuepress-plugin-svg-icons-5.3.3.tgz#7ae6b3d3ff75523a3462b0fca0472786809dc32a" + integrity sha512-LtVl60F3yMHsTVCMaAd5po7mpnj/kwZcL/yJyMwrQXmNTrAX4WbrE1sNeIXF3g10dw76SBQFjF6x8BeGKriftA== + dependencies: + "@vuepress/client" "2.0.0-beta.61" svg-mixer "^2.3.14" vue "^3.2.47" @@ -1214,6 +1240,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.13": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -1222,6 +1253,13 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@khanacademy/simple-markdown@^0.8.6": + version "0.8.6" + resolved "https://registry.yarnpkg.com/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz#9c9aef1f5ce2ce60292d13849165965a57c26f25" + integrity sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw== + dependencies: + "@types/react" ">=16.0.0" + "@kurkle/color@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" @@ -1310,167 +1348,162 @@ resolved "https://registry.yarnpkg.com/@mdit-vue/types/-/types-0.12.0.tgz#096ff57d3590d076f7d7561dbc9956fb0bb89fe1" integrity sha512-mrC4y8n88BYvgcgzq9bvTlDgFyi2zuvzmPilRvRc3Uz1iIvq8mDhxJ0rHKFUNzPEScpDvJdIujqiDrulMqiudA== -"@mdit-vue/types@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@mdit-vue/types/-/types-0.11.0.tgz#ab9c6f4e69d9c9eaabf1a73e59dc699875b224ef" - integrity sha512-ygCGP7vFpqS02hpZwEe1uz8cfImWX06+zRs08J+tCZRKb6k+easIaIHFtY9ZSxt7j9L/gAPLDo/5RmOT6z0DPQ== - -"@mdit/plugin-align@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.4.1.tgz#91c6ffd4c4de9762ecea498916d20add4ff98076" - integrity sha512-46DaKYsov6o7laFqcUTWpjT0TmW8f7EgZ0GeAoZ785vtYMpIWR2ewhevYDRs7r00NMT768/wHypWinCyXlwvuw== +"@mdit/plugin-align@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.4.5.tgz#dcb990e6101e5ed3812261be997a2b4ebb7ee521" + integrity sha512-TwZXdfEPbPz2k8S+u9wML5RTO4R3vNxm5wLDuMbPmoT3hwp0cbA6mwYZp7XODEZ4FXLrlG4rnyHHsDoQ8kTBeA== dependencies: - "@mdit/plugin-container" "0.4.1" + "@mdit/plugin-container" "0.4.5" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-attrs@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.4.1.tgz#fc3a944cc87ad209b5d05655896480d3c792f107" - integrity sha512-C4eNiord5P5njo0mkkB/XS/dhwf3A7nJd2NF3Bz264rWeY1pyJebryLllzFBeTtKjL9kRNZSUt4XnEkhKRpTEg== +"@mdit/plugin-attrs@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.4.5.tgz#141ac2a43d27a0aa56a763ab21e8f4be037f79ca" + integrity sha512-20sfnsVz0IhMMLXJMXhhp8nHF5H8nTnSINlA0bK1b4aaVNLTXXxHqOgXVsfKY+LcjH/rXA1VefItsat0xPN9aw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-container@0.4.1", "@mdit/plugin-container@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.4.1.tgz#ce2b31a13455f3a409bf789c5e83c8fa4a70d5cf" - integrity sha512-CTawSHXWJpFd1IJqMKdifNK1srqwcbOThtexKs2cdcTmM/+YC74e5cZ1nCxQ4Y3h+2Lxw0EvL+4H3SAPbUXpow== +"@mdit/plugin-container@0.4.5", "@mdit/plugin-container@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.4.5.tgz#ada65e16dac2c0b7d25aa597874cc24b7bb618c3" + integrity sha512-fWZAaGYPN5WvJWFXghOiefOGw56lFQrU+UxE1PWb9M2am18Bn6XPbQvrIToHiqOdoSipYpLuZTp6a1Vcap85dQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-figure@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.4.1.tgz#6f4fd38dfa7f565fe918d03f827225766b0a3f71" - integrity sha512-Nh287T6PGmrB2u85edtCd2kQc8y4rMxBOymXrCvR7uqU9XTwGPPdkPANUcAfEZ5X5xd5PSYyFoOJVivoKVCkZQ== +"@mdit/plugin-figure@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.4.5.tgz#44c11746d92b16a2f84d88fe89a020b2d7842679" + integrity sha512-bCctdCFSa2OnB994NJ2276Ym4sS16HMkJJ/+y6IllWzN33oUowjneCnfoSizE6ysge44QtNDueMhXn2eSPC1TQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-footnote@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.4.1.tgz#050648b495e55d56f271836b40f545f72ef74c56" - integrity sha512-51DPmYu/mmmSeXwIcHncJB+CtRqhGrEppRwmV7FQ1NoJeJFQ/4167i9euvGhI7ITyjQdYzINDO9qlk/hfmhNqg== +"@mdit/plugin-footnote@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.4.5.tgz#63f08e33fb41ab945cbd066d7158e6b03d61c41c" + integrity sha512-XKcnWlnu1vtFwgGdG4sykWLhCkt9mHhbPZlJvQGyXHWcC+W2wo27n82q8nT/fBfrSC+k7mzjGR7+jAtHLup5Xg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-lazyload@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.4.1.tgz#3aba90e3d19f6b41042607f56fd607c40bbfa292" - integrity sha512-cnJLGOyi7QQ6VgG+Lb0O0s+1+ByOuhSdlyzDOQYAua8S7WWzn3s+dPWvailk/2oti8ag1Zi19EE/RwXBHLlVsw== +"@mdit/plugin-img-lazyload@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.4.5.tgz#0b732ee4a6695816bbbbcde24facdbc52aa1bda0" + integrity sha512-eYG7YBBOPYwSPOP0ku8RHKWLlQXilcCD9BhqYUc1rMOE/eMNDJakicu8w0IsFunaJMaoFBjtQgn9gPby7+MZwg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-mark@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.4.1.tgz#5d6f5c15c895dc09dff3c4a29bd61d20da44a9cb" - integrity sha512-X7uJsBpDfU/omEy33F4e4Foopr/Q/8ZQjqjgYuOpB1rx8GA0WNL1/U7GWlnnsA3y3VwGGf1EJfuvFm821Qdq+A== +"@mdit/plugin-img-mark@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.4.5.tgz#9bfbe3d5047688dcc4a7fee21155de04ae8564af" + integrity sha512-e79VUTtW0aJkZXhFswHc4HR2lDsQVBa8i5E0kiFlR8/UiHrn3vP03QbXJs9SILUlaeWtSDmCUTQjsNg/Yd/RDg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-size@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.4.1.tgz#555f47d93e06fe6e1129e44b2397a1c8779e43b6" - integrity sha512-/mBCpoK9Uvy0iXT45NP1G/OkvlxdbWXVmGwKiuAJHcOzZ9sRsSnnrdBQBQGuhj3Pl0NIdZL9HeZH4YYGIhaMpg== +"@mdit/plugin-img-size@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.4.5.tgz#4554fc4de00732fd3ba7c93e91899355bc0e619e" + integrity sha512-RYnpsi+YAAyG6I7N9WtsOAp4iPCucbABPmjmkqdnoFtFPV3VQHCTA8Y4sKMm/PP/d56L3DVny+UaVSMs0zsdRA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-include@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.4.1.tgz#52bf371b1e6bbbe49467f433d626ff51d40d9ef7" - integrity sha512-XMVyFKNNUwNZbPC9koxHSE+gKqlR/JycvKEuRLGbPaXz+i7lricc59wDmlHJ7oOCCVLGnxsj9MslERcjQQXCrA== +"@mdit/plugin-include@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.4.5.tgz#9973b630fa403c338c743fc0402939ac2d3eb814" + integrity sha512-oq2fIPWGFUAUfWxxobbs9XuVXk5w0rL5jtqVCCPBKiSHRiTtFtmGm28bNLiiDm5RY7kItOqOrQ6pREE9X8Kdug== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" upath "^2.0.1" -"@mdit/plugin-katex@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.4.1.tgz#c9fde0a5346c5cf63bd712dca4ee055554fa9e99" - integrity sha512-0Nk3GdOV5h8LyqvuWWabKNBjWRip0PLMmFktaOQeUghK2hWMaQJJuPc9IqjBfbei0IWyU34KMFSx9GuwMznhXw== +"@mdit/plugin-katex@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.4.5.tgz#dc46e807a50fda47a4af225e471c9578778c37e9" + integrity sha512-ELW2n+s1f22sKBSATTllmTjEcui6ALFQbifJ7tdpGczfNZ3bRtUrdGYrN6C4vzataaELcp3MurG0XFfe0oIUCw== dependencies: - "@mdit/plugin-tex" "0.4.1" + "@mdit/plugin-tex" "0.4.5" "@types/katex" "^0.16.0" "@types/markdown-it" "^12.2.3" - katex "^0.16.4" + katex "^0.16.7" markdown-it "^13.0.1" -"@mdit/plugin-mark@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.4.1.tgz#2e15e1896c2ab61899aa00e611b43570134f346d" - integrity sha512-rfMten6lQpGw/xlxaxtSIqBikfqxw/nIPr8Dt51SdWlaejjXohXoaldGDH8D2XuLxXw+Lquvf0O/q8/RfdEQTA== +"@mdit/plugin-mark@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.4.5.tgz#b20331e63e73989148bf237e8a0552b531ed0411" + integrity sha512-gqC7qUxTq/BaABYwTKg2PBPO4BsugAQso3Nb8VibfPvbEOEJxpg7sCFe1qoYspIQ8e5fxTKQ94cBuuQbTHEABQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-mathjax@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.4.1.tgz#4413d47a4e7c60dc0a40a91f3e0739be9c96676a" - integrity sha512-eZrvcwx7OMHjm9V388AINWU+O4TgOMd3sgXtVtODgYtK3XzU+F9Aq8ExX5pxccSNrzjsENCYtv5kEG2j0+7yxA== +"@mdit/plugin-mathjax@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.4.5.tgz#f55eed218d1f5232d3396254c128576586ba6bf2" + integrity sha512-5AddT0QC+ODH17yvNmx2kAfiY2bVg24HHhsI0nXg0ZX21LMHCjKM6k0Fuvj4BQLB9jYoZDf9v7325W7sRsfedQ== dependencies: - "@mdit/plugin-tex" "0.4.1" + "@mdit/plugin-tex" "0.4.5" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" mathjax-full "^3.2.2" upath "^2.0.1" -"@mdit/plugin-stylize@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.4.1.tgz#306ee55c226ca753b6f84d6cacbb95a99264afc5" - integrity sha512-C72BuR0gSwTYBpUYnXbafrDXyOYV13lHlZdxFg7J7/d+cTasBYgCnNPSiTPDkLi7vas586kxhrE9uhQEQh51kA== +"@mdit/plugin-stylize@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.4.5.tgz#33fcbd7f695f379f8a8450c10df52fe7117baf86" + integrity sha512-nRgYHFrEewL3lf55IrVsazpOgTwcxnEtLck/ruzYOYhxnvUVUb0tSo8c4rokLAcHq/2s7/UPXjQfb5fMCnwwWQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sub@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.4.1.tgz#f7936e925bd854c5ed0ce600d8ad9fe50be2e011" - integrity sha512-pIiWhKNONw1FJ8+fDR+BGE2xLUkhp2v8FKvDmAAX+IZBiGktmQc0b+eA4YQPlLyt2MWSZpJE8yyDylyRoc3Gew== +"@mdit/plugin-sub@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.4.5.tgz#088674fcff847c12ae9d1a5c9c3ea8787b79bb39" + integrity sha512-Q7RLah3SrQDP+OXl38yPLYhSqRLEquN2YELccC0DHGwjBfDHk8wHThnExNJngTaGgkxoBysLfoG6HGX6pby1Mg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sup@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.4.1.tgz#f6cc42afa0185e3003b6eb4134ea606e35a17f98" - integrity sha512-PQhAp4E9XVTxqYDJKuxPF2AiwBbuwS9R82bWjXVCFYJTcpCqSIBRjN3IOCsVe3g2GXQ/KsvkJFFMDtrprJoS/Q== +"@mdit/plugin-sup@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.4.5.tgz#7f7ae5f1ff2f6af6b902f77b25484b08fe0e8496" + integrity sha512-8EWIfqdWLOuA46X7f1NxgIiLJy6giW+DJXlPguwg0bhXQI7b6QZgd7v9nv0IFesRcHwzYdfSbpgXqKFdrUBivw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tab@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.4.1.tgz#d15a1c9abb01381634ad106a4e60dc0dd47697de" - integrity sha512-TNGjRI96LS4+WBy38kVOR2KR4VV/e07jzCG2Ql+P1yIBhW0L74UgwrW3D+NiUk9gLIZ8u94NFlhH3djmaNKXIA== +"@mdit/plugin-tab@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.4.5.tgz#fb74a5b5e656a4041f8438e97ab62ad4cf7c49ec" + integrity sha512-ya3uDEA9I0+MSk8DQaJWrND/ZxBRnLspBouNvn49TqEqvMmLseK140DvKymb2PvnxE4AfJQY+eAeDPzpA7b7yw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tasklist@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.4.1.tgz#4bf2e1c11c18756115251ea931ec7a8a62b0cd25" - integrity sha512-ImK7PNeJvFlsZD8DcbQc+b9+b95eNahPuBQDM/hmQs637Od+PpLl1zxi+8e3wNaMjH1+rhVEeVFsts/p5LPXZA== +"@mdit/plugin-tasklist@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.4.5.tgz#56946beeac938f34fc5469a104d6f964b875e716" + integrity sha512-c5agRjHLa+JWjm6ovs+MsYdjafDAVzo3KbmN8nj8bCm+Rn9CVyOzq/lW0xmCs2I86kiDNZBukaESsIiM8f2s4w== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tex@0.4.1", "@mdit/plugin-tex@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.4.1.tgz#f6f833ff471b05ee18b8fe7b5550e5836a4cf78d" - integrity sha512-djpDGCIQoMVzydaQ34C+hCQUdJesG0QBQcQeWz+YqrGckvBgCG6NcpuNschCh4D4f0bNQEKVqt4dZ2mWsHqFtg== +"@mdit/plugin-tex@0.4.5", "@mdit/plugin-tex@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.4.5.tgz#af41ec27197c70d0822e180fae13fa0781e39d9a" + integrity sha512-L7ekZLMdzBNqsHzFS00ULyV+6ADtNAw5n7wN48qkE63K7QRWpXKEdXkNQ3LyaUwPCfSm1GgUv/QzI7SYiiL6jg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-uml@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.4.1.tgz#5739bcd95e4a8148c07de0be6bbdd775bf94cba7" - integrity sha512-THy+SgT9bVDmkN3OqU3v7reK2e1gyH/N9J0eHo4GYrxZo6b7DACvEQQ4kgwpOph8U41TxjWyV6VzDYPMPKGo4Q== +"@mdit/plugin-uml@^0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.4.5.tgz#5cce9ea97263e4ca599795bc783bf953024b5c3d" + integrity sha512-f9Y2AWz9Lt4hxx0c6VAFh2DZ9/aACJ+Uzrj7dvEmrW13WBNQxOhzxfoyTyo+dQmi7HyNdbz8RDXctJe+Yh+cWg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" @@ -1533,10 +1566,10 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@stackblitz/sdk@^1.8.2": - version "1.8.2" - resolved "https://repo.huaweicloud.com/repository/npm/@stackblitz/sdk/-/sdk-1.8.2.tgz#f91c7b35cd5c4523fcacb74b51cee4ec92b608e0" - integrity sha512-3aTg0Tb9dNs1huPkpdYxPEX/yc8A28eZneUMOEJzOLi7EJwl5onr9gCAVjIOkN4WLYu1iBSiJiGBYT629bZIJQ== +"@stackblitz/sdk@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@stackblitz/sdk/-/sdk-1.9.0.tgz#b5174f3f45a51b6c1b9e67f1ef4e2e783ab105e9" + integrity sha512-3m6C7f8pnR5KXys/Hqx2x6ylnpqOak6HtnZI6T5keEO0yT+E4Spkw37VEbdwuC+2oxmjdgq6YZEgiKX7hM1GmQ== "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" @@ -1573,6 +1606,11 @@ resolved "https://registry.yarnpkg.com/@types/hash-sum/-/hash-sum-1.0.0.tgz#838f4e8627887d42b162d05f3d96ca636c2bc504" integrity sha512-FdLBT93h3kcZ586Aee66HPCVJ6qvxVjBlDWNmxSGSbCZe9hTsjRKdSsl4y1T+3zfujxo9auykQMnFsfyHWD7wg== +"@types/js-yaml@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" + integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== + "@types/jsonfile@*": version "6.1.1" resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" @@ -1620,11 +1658,25 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + "@types/raphael@2.3.3": version "2.3.3" resolved "https://registry.yarnpkg.com/@types/raphael/-/raphael-2.3.3.tgz#d264b148bc100ef401a5e13159fd97861cd69e17" integrity sha512-Rhvq0q6wzyvipejki/9w87/pgapyE+s3gO66tdl1oD3qDrow+ek+4vVYAbRkeL58HCCK9EOZKwyjqYJ/TFkmtQ== +"@types/react@>=16.0.0": + version "18.2.6" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" + integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -1632,20 +1684,25 @@ dependencies: "@types/node" "*" +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + "@types/trusted-types@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== -"@types/web-bluetooth@^0.0.16": - version "0.0.16" - resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" - integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== +"@types/web-bluetooth@^0.0.17": + version "0.0.17" + resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz#5c9f3c617f64a9735d7b72a7cc671e166d900c40" + integrity sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA== -"@vitejs/plugin-vue@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz#93815beffd23db46288c787352a8ea31a0c03e5e" - integrity sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA== +"@vitejs/plugin-vue@^4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.2.tgz#eb145aa86e673e5e3620132851200dcd604af8cf" + integrity sha512-kNH4wMAqs13UiZe/2If1ioO0Mjz71rr2oALTl2c5ajBIox9Vz/UGW/wGkr7GA3SC6Eb29c1HtzAtxdGfbXAkfQ== "@vue/compiler-core@3.2.47": version "3.2.47" @@ -1657,6 +1714,16 @@ estree-walker "^2.0.2" source-map "^0.6.1" +"@vue/compiler-core@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.1.tgz#4e60a13a4dc65dd1f70e19d30f3746d4f9367af2" + integrity sha512-5le1qYSBgLWg2jdLrbydlhnPJkkzMw46UrRUvTnOKlfg6pThtm9ohhqBhNPHbr0RcM1MCbK5WZe/3Ghz0SZjpQ== + dependencies: + "@babel/parser" "^7.21.3" + "@vue/shared" "3.3.1" + estree-walker "^2.0.2" + source-map-js "^1.0.2" + "@vue/compiler-dom@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" @@ -1665,6 +1732,14 @@ "@vue/compiler-core" "3.2.47" "@vue/shared" "3.2.47" +"@vue/compiler-dom@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.1.tgz#2d94431071377ace74c770aafb6ab2d62205b336" + integrity sha512-VmgIsoLivCft3+oNc5KM7b9wd0nZxP/g2qilMwi1hJyGA624KWnNKHn4hzBQs4FpzydUVpNy+TWVT8KiRCh3MQ== + dependencies: + "@vue/compiler-core" "3.3.1" + "@vue/shared" "3.3.1" + "@vue/compiler-sfc@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" @@ -1681,6 +1756,22 @@ postcss "^8.1.10" source-map "^0.6.1" +"@vue/compiler-sfc@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.1.tgz#16a614fe9c85f35ca0e4333793441edb126323fc" + integrity sha512-G+FPwBbXSLaA4+Ry5/bdD9Oda+sRslQcE9o6JSZaougRiT4OjVL0vtkbQHPrGRTULZV28OcrAjRfSZOSB0OTXQ== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.1" + "@vue/compiler-dom" "3.3.1" + "@vue/compiler-ssr" "3.3.1" + "@vue/reactivity-transform" "3.3.1" + "@vue/shared" "3.3.1" + estree-walker "^2.0.2" + magic-string "^0.30.0" + postcss "^8.1.10" + source-map-js "^1.0.2" + "@vue/compiler-ssr@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee" @@ -1689,6 +1780,14 @@ "@vue/compiler-dom" "3.2.47" "@vue/shared" "3.2.47" +"@vue/compiler-ssr@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.1.tgz#4572a5ff79fefd1ba68cb57f024763f5d004f7b3" + integrity sha512-QOQWGNCWuSeyKx4KvWSJlnIMGg+/2oCHgkFUYo7aJ+9Uaaz45yRgKQ+FNigy50NYBQIhpXn2e4OSR8GXh4knrQ== + dependencies: + "@vue/compiler-dom" "3.3.1" + "@vue/shared" "3.3.1" + "@vue/devtools-api@^6.4.5", "@vue/devtools-api@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" @@ -1705,6 +1804,17 @@ estree-walker "^2.0.2" magic-string "^0.25.7" +"@vue/reactivity-transform@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.1.tgz#35000e3bd4d481b228e5f0b97eb652ec9e6894dc" + integrity sha512-MkOrJauAGH4MNdxGW/PmrDegMyOGX0wGIdKUZJRBXOTpotDONg7/TPJe2QeGeBCow/5v9iOqZOWCfvmOWIaDMg== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.1" + "@vue/shared" "3.3.1" + estree-walker "^2.0.2" + magic-string "^0.30.0" + "@vue/reactivity@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" @@ -1712,10 +1822,17 @@ dependencies: "@vue/shared" "3.2.47" -"@vue/repl@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@vue/repl/-/repl-1.3.3.tgz#a53ab0d07b9da37b06982eae43dbd729f14675a9" - integrity sha512-mrN3Gd4CIaiIiRdi7/pAOH9rPud8q8I5svLurSoyxLhxFXs9WdfaKZlirExSJIuecHYFiAAozTBtb8XQPNhCHw== +"@vue/reactivity@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.1.tgz#b134186493113f9f8c3fb6d65a047e19825a46e1" + integrity sha512-zCfmazOtyUdC1NS/EPiSYJ4RqojqmTAviJyBbyVvY8zAv5NhK44Yfw0E1tt+m5vz0ZO1ptI9jDKBr3MWIEkpgw== + dependencies: + "@vue/shared" "3.3.1" + +"@vue/repl@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@vue/repl/-/repl-1.4.1.tgz#40830aaa88e5740c6f6ba493e83a8a55c65dda98" + integrity sha512-7ONz/o1OtS611jW6SdAOZXn4HdN8gfyatcOzcEu+3bDMvgbyr7ZUcbRV6Y4xdkxDARKDBzs+sb3/oz1Na5hAeQ== "@vue/runtime-core@3.2.47": version "3.2.47" @@ -1725,6 +1842,14 @@ "@vue/reactivity" "3.2.47" "@vue/shared" "3.2.47" +"@vue/runtime-core@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.1.tgz#ed244dcb48d4e1e2079bf7d698a218e5b8ef5f62" + integrity sha512-Ljb37LYafhQqKIasc0r32Cva8gIh6VeSMjlwO6V03tCjHd18gmjP0F4UD+8/a59sGTysAgA8Rb9lIC2DVxRz2Q== + dependencies: + "@vue/reactivity" "3.3.1" + "@vue/shared" "3.3.1" + "@vue/runtime-dom@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382" @@ -1734,6 +1859,15 @@ "@vue/shared" "3.2.47" csstype "^2.6.8" +"@vue/runtime-dom@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.1.tgz#c07aef5b72385a2f22fdc82a203db6eba7f39fb4" + integrity sha512-NBjYbQPtMklb7lsJsM2Juv5Ygry6mvZP7PdH1GZqrzfLkvlplQT3qCtQMd/sib6yiy8t9m/Y4hVU7X9nzb9Oeg== + dependencies: + "@vue/runtime-core" "3.3.1" + "@vue/shared" "3.3.1" + csstype "^3.1.1" + "@vue/server-renderer@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0" @@ -1742,52 +1876,55 @@ "@vue/compiler-ssr" "3.2.47" "@vue/shared" "3.2.47" -"@vue/shared@3.2.47", "@vue/shared@^3.2.45", "@vue/shared@^3.2.47": +"@vue/server-renderer@3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.1.tgz#c750a775ca4abd8213748a540cce7344af00dac4" + integrity sha512-sod8ggOwbkQXw3lBjfzrbdxRS9lw/lNHoMaXghHawNYowf+4WoaLWD5ouz6fPZadUqNKAsqK95p8DYb1vcVfPA== + dependencies: + "@vue/compiler-ssr" "3.3.1" + "@vue/shared" "3.3.1" + +"@vue/shared@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== -"@vuepress/bundler-vite@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.61.tgz#cd14f061733dfd63b917738fa4b72de6dfc166d1" - integrity sha512-J9/DGfsqr9rGJT+0osL9uL+jrrGHeAsWuZoCCbQIDbe0rEO2whvou51PJpwko3R0vvCTWsolh6rXYeb0N0+yFg== - dependencies: - "@vitejs/plugin-vue" "^4.0.0" - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - autoprefixer "^10.4.13" +"@vue/shared@3.3.1", "@vue/shared@^3.2.47", "@vue/shared@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.1.tgz#875a1c1847ec0646fc3dbe5581cb46b49ca3c469" + integrity sha512-ybDBtQ+479HL/bkeIOIAwgpeAEACzztkvulJLbK3JMFuTOv4qDivmV3AIsR8RHYJ+RD9tQxcHWBsX4GqEcYrfw== + +"@vuepress/bundler-vite@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.62.tgz#83f6a9ef57cdee551aab3ca5c778791f1b1113df" + integrity sha512-Dpb4rJycssM1gs3MlQ5z0cwQ0KCx9Iliojt+qs5lVIUHP9vfw6ANYx51R3ojctt3dCoWfC4bAL4NhGQndGKvrQ== + dependencies: + "@vitejs/plugin-vue" "^4.2.2" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + autoprefixer "^10.4.14" connect-history-api-fallback "^2.0.0" - postcss "^8.4.21" + postcss "^8.4.23" postcss-load-config "^4.0.1" - rollup "^3.17.3" - vite "~4.1.4" - vue "^3.2.47" - vue-router "^4.1.6" - -"@vuepress/cli@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/cli/-/cli-2.0.0-beta.61.tgz#279784c755dde3e4868a667cb6ce7311f67bfb57" - integrity sha512-0CWc82c75987mVZwBOGBaCDke74NwlS6L3n1ybWrrqaFeueZSonwdm+qvaNvM/AJC10chqOJtpO/O3P+/YkBHQ== - dependencies: - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + rollup "^3.21.6" + vite "~4.3.5" + vue "^3.3.1" + vue-router "^4.2.0" + +"@vuepress/cli@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/cli/-/cli-2.0.0-beta.62.tgz#cbde8736205d35c194490daad0e2c9ce73e86998" + integrity sha512-z5mpxORVSZUWsSGtA0bqvsd4vhMDWXAGnQfHjYZ5ylUgnYMxBZMRWrQcpz9doMCk5Qkn56B2s2jKZEvhyFvdAg== + dependencies: + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" cac "^6.7.14" chokidar "^3.5.3" envinfo "^7.8.1" - esbuild "~0.16.17" - -"@vuepress/client@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/client/-/client-2.0.0-beta.60.tgz#978fa040e43b8dd4663d07e2b8dbbff7ff822f4d" - integrity sha512-WU5VGeDp41A2dVXqp18YBggflIjTq68mA+s5TCz93wk+7elAmPAkWKcobQBYQgvsuwHyg9nWulZAfMN6OEygKQ== - dependencies: - "@vue/devtools-api" "^6.4.5" - "@vuepress/shared" "2.0.0-beta.60" - vue "^3.2.45" - vue-router "^4.1.6" + esbuild "~0.17.18" "@vuepress/client@2.0.0-beta.61": version "2.0.0-beta.61" @@ -1799,21 +1936,31 @@ vue "^3.2.47" vue-router "^4.1.6" -"@vuepress/core@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-2.0.0-beta.61.tgz#602ceb2da0b9c2fd0bc5828115c896f17521ff08" - integrity sha512-jPr60d/uadgBmEQhXCRLNOm2M4Ym65lvZhGf/wyZCo14kpacp2YoO7RR8bzp/NEpWe7ndr/U8O/VDjFYTsz80g== +"@vuepress/client@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/client/-/client-2.0.0-beta.62.tgz#0f9c80263559e2709953e6f34f7f95e08e140381" + integrity sha512-5JT0H6EibhZMVmg1fel2BWFFaAEv5zOoD397LOiMQmcEuUneeKNSwGcLrJDyvv8AOXz4wsXwET/to3TsOFoHDQ== dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/markdown" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - vue "^3.2.47" - -"@vuepress/markdown@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-2.0.0-beta.61.tgz#8ea7f785b25f149ec006236cc1bbe2b59161a862" - integrity sha512-vzj933XxsfE9B+1kdMXncYtYU7TGTLjWP+qeikVsy5imq2BXa/n3OFVGyGkkdOYmu05hkm82+07dOvtGA+iMBQ== + "@vue/devtools-api" "^6.5.0" + "@vuepress/shared" "2.0.0-beta.62" + vue "^3.3.1" + vue-router "^4.2.0" + +"@vuepress/core@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/core/-/core-2.0.0-beta.62.tgz#700ff7d78e67c57f06319282462ca7e1f8bd6070" + integrity sha512-IyL1lxkRg2PO6oFDcioa5YKckKO8jEIwPaNG4mwv7bIEwaN5kpsROVtBeYHKkcnncWQMrbBG/z8aHDvjO/vFJA== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/markdown" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + vue "^3.3.1" + +"@vuepress/markdown@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/markdown/-/markdown-2.0.0-beta.62.tgz#d73b44d82bf508a2f57bdc8ddb169a879e98246e" + integrity sha512-OTGSHDALEE1zgAJgx9Py1AKR1JA/eLTjw63ul77ymt/5eNlU8/EVJg8Pj2nwL3cpvCpzB6sQ1Xkj4TF7D0aD1Q== dependencies: "@mdit-vue/plugin-component" "^0.12.0" "@mdit-vue/plugin-frontmatter" "^0.12.0" @@ -1825,175 +1972,167 @@ "@mdit-vue/types" "^0.12.0" "@types/markdown-it" "^12.2.3" "@types/markdown-it-emoji" "^2.0.2" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" markdown-it "^13.0.1" markdown-it-anchor "^8.6.7" markdown-it-emoji "^2.0.2" mdurl "^1.0.1" -"@vuepress/plugin-active-header-links@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.61.tgz#03282f4d9cca94acaa0bf09659fcb38dbc34474a" - integrity sha512-+bbzb4YqnuTOANvSmJq8hbp60Tl3jLMiaZdkHKxKK9lDODGfTB8uAlH+KvuvxxuLm+Za186r+2PtBwJby773fA== +"@vuepress/plugin-active-header-links@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.62.tgz#bf148752941a9bc65ea76ec18ff4e386cc80141d" + integrity sha512-NUoa0JP2npSydJQvM1oOPEtPCKRmtqpkPLxTeBCP6ucR/eHpCbBMrgYt3w6kdmMJykc/AWFd4oZA1QS/MAoEtw== dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" ts-debounce "^4.0.0" - vue "^3.2.47" - vue-router "^4.1.6" + vue "^3.3.1" + vue-router "^4.2.0" -"@vuepress/plugin-back-to-top@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.61.tgz#b5feec33f99971cd3a0bd5bf100ead806c119d2b" - integrity sha512-2KX83rdc00FSs38o8/P2Hp0ifKVtRbO+4kXW5ilzY27v0UMY8H//KxmoE/+PZDS9iyeXF1O/YUm3VtoMN5Y/9g== +"@vuepress/plugin-back-to-top@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.62.tgz#91ad8540e1fbcc2781a86504ff8e44003a2d2d13" + integrity sha512-ndStdKobpq7/YxhtUg2YrSkd8FNoE0v4pPVdTBND6jlkPns4CCcyu+w6BZ8mkiiB2dzS27JrhKcXHz1Tsb0nUA== dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" ts-debounce "^4.0.0" - vue "^3.2.47" + vue "^3.3.1" -"@vuepress/plugin-container@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.61.tgz#2e9a12d8918b3d7a7f29c6fb44d549287b89cd93" - integrity sha512-XVIhMpTSv0F8tsmCKFHzFtsJzD2SeiKX60jHaEGCym+shNvr9euECWY7ygEB5Ob6oQUIDZNS1dDb1RcYsksZ8A== +"@vuepress/plugin-container@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.62.tgz#a4440bfb7b07d709c6931ba4c502eb518d4d1c90" + integrity sha512-ibo0J8ye5KA6zkwIttkVqleSLy4Sq0rcSW+X8cTzyFfoKKs0Y+ECjmf4wRrDl79m+lgpA43mlFpCcbgtmV9aqw== dependencies: "@types/markdown-it" "^12.2.3" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/markdown" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/markdown" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" markdown-it "^13.0.1" markdown-it-container "^3.0.0" -"@vuepress/plugin-external-link-icon@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-beta.61.tgz#63d3f89d8d1869a06904fb123ca41d31a8272298" - integrity sha512-Jyp/QdqIvybfocD2K8otKIeHrKMeOamt74tlstsZxrtveKhWE3Js1/n2MP/bJlGkcHrAb6lQQr/JFhpT5jtHVg== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/markdown" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - vue "^3.2.47" - -"@vuepress/plugin-git@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.61.tgz#4c7827a8f964b55fe594cd5f4f79509e0264bc5d" - integrity sha512-ozoxZ+x57yGiHDs5tXJvbyoZTiYpfb7QQaS5mgxn0+XZqfg7/cZnT7DmJtxVqk+VFmz73WHgN+4pGRjkuTOLqQ== - dependencies: - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - execa "^7.0.0" +"@vuepress/plugin-external-link-icon@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-beta.62.tgz#9aa5abd46b09238194d96fccbd7a707878c86093" + integrity sha512-mQ7gj6pMHYCp7zk6N92omxUz9CjKYZtvZXkNmsloZsz0hiGS1SdG29vLo8yKm/qVzyu9F45WgVNcdQD5mkzx3Q== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/markdown" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + vue "^3.3.1" + +"@vuepress/plugin-git@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.62.tgz#a17e6ead7d4dfedee6e42ebcaed4f24e67751ae1" + integrity sha512-vTYUguI+X5G7JPTySDnZ6lcAGXBWlD1Nsw9IV42Hh4fvevWzZ3WIjkAhjZpdURIz+xQPEZBbgqnOKjBpbPx0jA== + dependencies: + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + execa "^7.1.1" -"@vuepress/plugin-google-analytics@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.61.tgz#c38751ac6c7dcf104d8ff8eb2e137b33ae94eda5" - integrity sha512-UwjDVtNpqkfEz7S5TPl703Jwhg0V1Xfvz8y5c4y5nQLNRky0/3bOKx8u7e5J3AATtwz0XwI2cmhXtuHFs6IiDA== +"@vuepress/plugin-google-analytics@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-google-analytics/-/plugin-google-analytics-2.0.0-beta.62.tgz#a46e6c42095d43c58c7caa1e3c80fb6aec55b181" + integrity sha512-Nm2GGb2KCooZjKD0ZgmmlI+2N05/mCMIJ8ziZU/3xrao6oRCxlKFm+g1L0iE/1XY2vNQpX76OedhSwRtYEjsRw== dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" -"@vuepress/plugin-medium-zoom@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.61.tgz#14dba3228b9b50ef1b170a8a1c94d858a7d2331f" - integrity sha512-mFY2vHXeqC8dizFVlFO7HIzirb79Z8sudKWPVfZmq0Qmlttyhxlns8GjrsPQl1mnz2NlYUY1ztUasikPwsYjAw== +"@vuepress/plugin-medium-zoom@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.62.tgz#a068765f598ad487938849abaad98443148dbcca" + integrity sha512-1BolO1OE9Dxf4xLpEDEYjWTmx+luD6RSwjM+Wbgp7gBMK98yY8N9rHxWCzhLWbTffVezmAO0ze37l7hVd4ypTA== dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" medium-zoom "^1.0.8" - vue "^3.2.47" - -"@vuepress/plugin-nprogress@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.61.tgz#dbbd0e59177ffb3a051beb6103406c00e4f162d9" - integrity sha512-d36NEy8hkZaAuqMZec9VTEjozPkj9Wvimyx+AgJYpYN8JDBrWB58r9Gu9xHf8/PVeEnKayggD2xJYpGKtQ2lrw== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - vue "^3.2.47" - vue-router "^4.1.6" - -"@vuepress/plugin-palette@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.61.tgz#0b907b58a57307d1e8d71b4d8713968ad4dfedb0" - integrity sha512-mQE/2dxwOZfkc7wwkwR6byaeMJYTqQV7WmfQ4YQ3zAOr4nDP8Bx/zZVRyV3NjAcMwuif/CURpAYJo+WkFM+fpQ== - dependencies: - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + vue "^3.3.1" + +"@vuepress/plugin-nprogress@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.62.tgz#10d1a106b2d8c98943d45b9a76fd4978605ab495" + integrity sha512-w1Qqw1pP7+fXN+Aznmbfdp62XnQJ2s/FJyoGfV7LjVfV+gWFtqymiJiahvd2aQpBi4/qZNvtFJ1SOQf5tn1CxA== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + vue "^3.3.1" + vue-router "^4.2.0" + +"@vuepress/plugin-palette@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.62.tgz#e03922fa514135426d0fe91d297e36014e668c39" + integrity sha512-Tw+KFxC8c3KIGeXANqMXFLoQ96ZQ/hJaKC0qm6iN04Wk9hKYazkxhPZTAZkOG3SrxaxvOrgnzvicpci6FJgnGA== + dependencies: + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" chokidar "^3.5.3" -"@vuepress/plugin-prismjs@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.61.tgz#f9ae5b08e1ad56aa87996892b168710618654b83" - integrity sha512-B6TRmttJuPs1OMJXE2Stul7zhMUKCPy2YSXEmVWwlJ90jWti85o5nhTT9/OhxBVn3EZ89b+YroPDbB/g1uUc1w== +"@vuepress/plugin-prismjs@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.62.tgz#2e06c633f6329ad4a3d5432a9bfc1294ef495b45" + integrity sha512-kPrlh+I4w+YyU6joahjvuMo2zMwbpB36drZYfjXtYFFIxpBQ5Xdse4xx89vYOX0KqckOQrNa/tnYnfBuHBkgAQ== dependencies: - "@vuepress/core" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.62" prismjs "^1.29.0" -"@vuepress/plugin-pwa-popup@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa-popup/-/plugin-pwa-popup-2.0.0-beta.61.tgz#a250089b158fa12f04d76fedddacdd1165f9fa92" - integrity sha512-neY/pPTkyaZsA0187L1jCliydrIf5j6liHPlbQdr4Mx5TprxomYb/eqcmykA5JSfCaINYh07A9qBi3Mw17Xo8g== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/plugin-pwa" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - vue "^3.2.47" - -"@vuepress/plugin-pwa@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa/-/plugin-pwa-2.0.0-beta.61.tgz#acd18d982b1fe2d5cfb41fa2e2199a285faafeb1" - integrity sha512-5joCU3FsybJEzz7gOBzA0t9yFA9DIGl0UZH4Ycd8EHsK3o8+NeNtwvRzMPLyA7i7GfO57RUyRP3jGXIwWJeYQQ== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" +"@vuepress/plugin-pwa-popup@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa-popup/-/plugin-pwa-popup-2.0.0-beta.62.tgz#67e2535f3b9ee4c7d24cd82eec962e7ce6621e65" + integrity sha512-d9JR0zG/1HhTs/zioiFAvRVo8TTbmALIz72R7pcuul6cBaCdzcvaRz+xMacaQT0Slu70u5R4F42K0D/9kVS2dA== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/plugin-pwa" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + vue "^3.3.1" + +"@vuepress/plugin-pwa@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-pwa/-/plugin-pwa-2.0.0-beta.62.tgz#b7c6665116d1122d5ce58df0d546ed42fb9c94cf" + integrity sha512-DfFgYpa7EubqVwzlkg/UuMZUo0MloIk78/5vhjrLxqFO2qNscvo2TLyce7WMtnAiFw+dSKLdIDJnVLHLmtt7Wg== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" mitt "^3.0.0" register-service-worker "^1.7.2" - vue "^3.2.47" + vue "^3.3.1" workbox-build "^6.5.4" -"@vuepress/plugin-search@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.61.tgz#473804cd576703c16adae49bcaf81cb6f144bbb4" - integrity sha512-gcyl3C7WBCC38dp42q6F8s0S/yKjm/yHqmpqtABxwFG+6IhZne0qFI9Q2CaaG/UGSa9UE0xVxeKfcBE1XIyX9A== +"@vuepress/plugin-search@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-search/-/plugin-search-2.0.0-beta.62.tgz#1a951023097c48db182383bfe30cddb61dfee90a" + integrity sha512-TKm4E+qNX+nHMmVE9hIV5kwC/5rT2b0REVKgTW25vRxCNVLp+VHZOAhszicNY0pYWYySaMJ+mne+tNLDRahRjw== dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" chokidar "^3.5.3" - vue "^3.2.47" - vue-router "^4.1.6" + vue "^3.3.1" + vue-router "^4.2.0" -"@vuepress/plugin-theme-data@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.61.tgz#f95a56c8ffb4cca8b559b4cf81ef665fe07523aa" - integrity sha512-drPLGbaXqXnHsuFHn6FolbqdRIxJzla1+10b3cKnsslatRbSPjKWos4Eri3xzgzEIC5TotPwTeT25gDRMpW8Sw== +"@vuepress/plugin-theme-data@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.62.tgz#6b42c7b148bdd811869a2afec2cb397a66ddb300" + integrity sha512-q6XHIDnZcJ5W55TlynKrwHtHormZedEY5man9zT4hlZywr3vVBgToHztObNTqgn6CssFaW2BFXDlW17iyS2D2A== dependencies: "@vue/devtools-api" "^6.5.0" - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - vue "^3.2.47" - -"@vuepress/shared@2.0.0-beta.60": - version "2.0.0-beta.60" - resolved "https://registry.yarnpkg.com/@vuepress/shared/-/shared-2.0.0-beta.60.tgz#5c5c682dedd2e1ef0e821f08321f74b787558113" - integrity sha512-bwFksEtSQpbyAGJZkvRK9Z2zGmS144nv759vOzbRUZPPlGffeauzrPw9w7wxqp3gTJvIE/4Ufqt0AZTuSP/F/g== - dependencies: - "@mdit-vue/types" "^0.11.0" - "@vue/shared" "^3.2.45" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + vue "^3.3.1" "@vuepress/shared@2.0.0-beta.61": version "2.0.0-beta.61" @@ -2003,77 +2142,86 @@ "@mdit-vue/types" "^0.12.0" "@vue/shared" "^3.2.47" -"@vuepress/theme-default@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-2.0.0-beta.61.tgz#71fb67713bb9a39be0d28ddd37009c503179282a" - integrity sha512-ajjxaGqrSy5LXf+7sslHV1fbUzggMYjITcXxBYa3gT4zVu1tsytAAcmtYxnQKblL1Eo2Wo7inujl/NUwaWDjDQ== +"@vuepress/shared@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/shared/-/shared-2.0.0-beta.62.tgz#f766047e1a17ced9bc96057318760118bf17bc93" + integrity sha512-+OH8WzFz7+IUv+WbcBbCiy3ZTWZ4a2uVRd4GYHWkTE4Ux5V2Sx3KwY17POIGpn/PfMqNHHtjpDH6rO7qmaD+pg== dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/plugin-active-header-links" "2.0.0-beta.61" - "@vuepress/plugin-back-to-top" "2.0.0-beta.61" - "@vuepress/plugin-container" "2.0.0-beta.61" - "@vuepress/plugin-external-link-icon" "2.0.0-beta.61" - "@vuepress/plugin-git" "2.0.0-beta.61" - "@vuepress/plugin-medium-zoom" "2.0.0-beta.61" - "@vuepress/plugin-nprogress" "2.0.0-beta.61" - "@vuepress/plugin-palette" "2.0.0-beta.61" - "@vuepress/plugin-prismjs" "2.0.0-beta.61" - "@vuepress/plugin-theme-data" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@vueuse/core" "^9.13.0" - sass "^1.58.3" - vue "^3.2.47" - vue-router "^4.1.6" - -"@vuepress/utils@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/utils/-/utils-2.0.0-beta.61.tgz#a073e1ad22386f1922af3e7ef6220c5286fc5239" - integrity sha512-W7g6xjrdyOW5E1V1ouyTm5d4+kgSd4KcM80D7K0NNScrhLIW6gpOggVVOVyTH3q2K1GQhzPlUcUe04ZNSo0ilQ== + "@mdit-vue/types" "^0.12.0" + "@vue/shared" "^3.3.1" + +"@vuepress/theme-default@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/theme-default/-/theme-default-2.0.0-beta.62.tgz#6db11e00a11295028c3aeb6c967e2089a3e6fa93" + integrity sha512-J6wLH4tevMnn/2y+MrTpZEVDWf5yvikx0S9TIfpcxjR/nN4XD9eSZrMB3Lt8JqTW/lwFze5MVBdTtVafZs4b3g== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/plugin-active-header-links" "2.0.0-beta.62" + "@vuepress/plugin-back-to-top" "2.0.0-beta.62" + "@vuepress/plugin-container" "2.0.0-beta.62" + "@vuepress/plugin-external-link-icon" "2.0.0-beta.62" + "@vuepress/plugin-git" "2.0.0-beta.62" + "@vuepress/plugin-medium-zoom" "2.0.0-beta.62" + "@vuepress/plugin-nprogress" "2.0.0-beta.62" + "@vuepress/plugin-palette" "2.0.0-beta.62" + "@vuepress/plugin-prismjs" "2.0.0-beta.62" + "@vuepress/plugin-theme-data" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + "@vueuse/core" "^10.1.2" + sass "^1.62.1" + sass-loader "^13.2.2" + vue "^3.3.1" + vue-router "^4.2.0" + +"@vuepress/utils@2.0.0-beta.62": + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/@vuepress/utils/-/utils-2.0.0-beta.62.tgz#d3cda1630161bf5277e68475b4566e48a87e34ee" + integrity sha512-2hyGGrN1XCUapsSlckHc7FWkklSPZfqcM5eDYjxyIT9XpQrXKYn8r0CUVcveyFdHF76Tw0KyP57JCxUDTxHxVg== dependencies: "@types/debug" "^4.1.7" "@types/fs-extra" "^11.0.1" "@types/hash-sum" "^1.0.0" - "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.62" debug "^4.3.4" - fs-extra "^11.1.0" - globby "^13.1.3" + fs-extra "^11.1.1" + globby "^13.1.4" hash-sum "^2.0.0" - ora "^6.1.2" + ora "^6.3.0" picocolors "^1.0.0" upath "^2.0.1" -"@vueuse/core@^9.13.0": - version "9.13.0" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" - integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== +"@vueuse/core@^10.1.0", "@vueuse/core@^10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.1.2.tgz#2499eadec36c5d7109338e3a2b73725040ae8011" + integrity sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA== dependencies: - "@types/web-bluetooth" "^0.0.16" - "@vueuse/metadata" "9.13.0" - "@vueuse/shared" "9.13.0" - vue-demi "*" + "@types/web-bluetooth" "^0.0.17" + "@vueuse/metadata" "10.1.2" + "@vueuse/shared" "10.1.2" + vue-demi ">=0.14.0" -"@vueuse/metadata@9.13.0": - version "9.13.0" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" - integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== +"@vueuse/metadata@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.1.2.tgz#d8ffe557b1042efd03a0aa88540a00c25d193ee3" + integrity sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ== -"@vueuse/shared@9.13.0": - version "9.13.0" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" - integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== +"@vueuse/shared@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.1.2.tgz#31d8733a217a6396eb67706319133bf62cdd8baa" + integrity sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA== dependencies: - vue-demi "*" + vue-demi ">=0.14.0" -"@waline/client@^2.14.9": - version "2.14.9" - resolved "https://registry.yarnpkg.com/@waline/client/-/client-2.14.9.tgz#48d0794fef22ff163b195dcf0c52090e64f95ed7" - integrity sha512-j156AgwKskRNtlBWeFj8niN4j6lwS4xg8BKo1A09p1j78rcGhNxf5S9gmzqW/8oDUbnSILOHtweydiRgWEqBag== +"@waline/client@^2.15.4": + version "2.15.4" + resolved "https://registry.yarnpkg.com/@waline/client/-/client-2.15.4.tgz#0474be85f896fb02c0ed881997e5a1ecfe3c9de2" + integrity sha512-wH5lO4gTlF9SSuKCNC5fDnk4brzZDn4u+bBpgwEyu0Tz0deD59hW6ttMizXAZUi5CGT2Me6XqwIVE4WWRBBs6A== dependencies: - "@vueuse/core" "^9.13.0" + "@vueuse/core" "^10.1.0" autosize "^6.0.1" - marked "^4.2.12" + marked "^4.3.0" vue "^3.2.47" abbrev@^1.0.0: @@ -2183,20 +2331,20 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -artalk@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/artalk/-/artalk-2.5.2.tgz#416acfa433069978221e084d61f3bc39331ef553" - integrity sha512-qwAtSCRIBadaXyLsVps8DDlawis7KQNQpDfEj2h8xbA8LYv1nTUR4tazb4oVRBOwGSpo1cir8WIT3pq/MkiTLg== +artalk@^2.5.5: + version "2.5.5" + resolved "https://registry.yarnpkg.com/artalk/-/artalk-2.5.5.tgz#f0ecc315dca233c89e313ee3d6b21d31e35541a2" + integrity sha512-35Dq9sOquQQlxvqZhRtZMp9g2SS94ryNEfSJy9BP9yq005CZoC64DTCBI2WBG+pd9YenihfB5QWwa+jfCZ/5Ew== dependencies: abortcontroller-polyfill "^1.7.5" hanabi "^0.4.0" insane "^2.6.2" - marked "^4.2.12" + marked "^5.0.1" -artplayer@^4.6.2: - version "4.6.2" - resolved "https://repo.huaweicloud.com/repository/npm/artplayer/-/artplayer-4.6.2.tgz#d56c2887c10086f339722e025e9ece881561aaa9" - integrity sha512-9RMfFFy2wGgHUCnrwk+M2Z5OiLWQcBL+YzkSBwSi6IuJG6oM+TlfJJZt09RL2iag6DNQ+AUYtB879WUHxbqfIQ== +artplayer@^5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/artplayer/-/artplayer-5.0.6.tgz#a8e605e4b1731cea026a8587df5eb58302aa047d" + integrity sha512-GHmtNC/edMtBRQQ74REFL6KsvB1mk/BMh0frsB5eqlVeUEUbUzbgeqVoPH2R1IkoNZVIqQSvMd+sD5IuIKjIUQ== dependencies: option-validator "^2.0.6" @@ -2225,13 +2373,13 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^10.4.13: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== +autoprefixer@^10.4.14: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -2378,7 +2526,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.3, browserslist@^4.21.4: +browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -2439,11 +2587,16 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: +caniuse-lite@^1.0.30001449: version "1.0.30001451" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz#2e197c698fc1373d63e1406d6607ea4617c613f1" integrity sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w== +caniuse-lite@^1.0.30001464: + version "1.0.30001486" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz#56a08885228edf62cbe1ac8980f2b5dae159997e" + integrity sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg== + chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2466,10 +2619,10 @@ chalk@^5.0.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== -chart.js@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.2.1.tgz#d2bd5c98e9a0ae35408975b638f40513b067ba1d" - integrity sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw== +chart.js@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.3.0.tgz#ac363030ab3fec572850d2d872956f32a46326a1" + integrity sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g== dependencies: "@kurkle/color" "^0.3.0" @@ -2554,10 +2707,10 @@ clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== -codem-isoboxer@0.3.6: - version "0.3.6" - resolved "https://repo.huaweicloud.com/repository/npm/codem-isoboxer/-/codem-isoboxer-0.3.6.tgz#867f670459b881d44f39168d5ff2a8f14c16151d" - integrity sha512-LuO8/7LW6XuR5ERn1yavXAfodGRhuY2yP60JTZIw5yNYMCE5lUVbk3NFUCJxjnphQH+Xemp5hOGb1LgUXm00Xw== +codem-isoboxer@0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/codem-isoboxer/-/codem-isoboxer-0.3.9.tgz#842361c9d75b9a2e32f62d99ad8bd8b7e729dd1a" + integrity sha512-4XOTqEzBWrGOZaMd+sTED2hLpzfBbiQCf1W6OBGkIHqk1D8uwy8WFLazVbdQwfDpQ+vf39lqTGPa9IhWW0roTA== collection-visit@^1.0.0: version "1.0.0" @@ -2606,7 +2759,7 @@ commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^8.0.0: +commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== @@ -2729,6 +2882,11 @@ csstype@^2.6.8: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== +csstype@^3.0.2, csstype@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + custom-event-polyfill@^1.0.7: version "1.0.7" resolved "https://repo.huaweicloud.com/repository/npm/custom-event-polyfill/-/custom-event-polyfill-1.0.7.tgz#9bc993ddda937c1a30ccd335614c6c58c4f87aee" @@ -3000,26 +3158,26 @@ d3@^7.4.0, d3@^7.8.2: d3-transition "3" d3-zoom "3" -dagre-d3-es@7.0.9: - version "7.0.9" - resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz#aca12fccd9d09955a4430029ba72ee6934542a8d" - integrity sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w== +dagre-d3-es@7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" + integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== dependencies: d3 "^7.8.2" lodash-es "^4.17.21" -dashjs@^4.6.0: - version "4.6.0" - resolved "https://repo.huaweicloud.com/repository/npm/dashjs/-/dashjs-4.6.0.tgz#124c8371e192f1218746ce60b6aa0f175d4dcda4" - integrity sha512-0PDoSBM9PXb+Io0pRnw2CmO7aV9W8FC/BqBRNhLxzM3/e5Kfj7BLy0OWkkSB58ULg6Md6r+6jkGOTUhut/35rg== +dashjs@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/dashjs/-/dashjs-4.7.0.tgz#be2996b652257de6835f1e442d2e435ef4d139cb" + integrity sha512-+Sx5TJiT9eDOqODi3anXXBIx2oBM6ANMV5dzvCeSvYKwJ72SzX1bcJSPFLm7g7HTsRCh6pM1VL0XWfrzTlz9xw== dependencies: bcp-47-match "^1.0.3" bcp-47-normalize "^1.1.1" - codem-isoboxer "0.3.6" + codem-isoboxer "0.3.9" es6-promise "^4.2.8" fast-deep-equal "2.0.1" html-entities "^1.2.1" - imsc "^1.0.2" + imsc "^1.1.3" localforage "^1.7.1" path-browserify "^1.0.1" ua-parser-js "^1.0.2" @@ -3160,10 +3318,10 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.3.tgz#f4133af0e6a50297fc8874e2eaedc13a3c308c03" - integrity sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ== +dompurify@2.4.5: + version "2.4.5" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87" + integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== domutils@^1.5.1: version "1.7.0" @@ -3321,33 +3479,33 @@ es6-promise@^4.2.5, es6-promise@^4.2.8: resolved "https://repo.huaweicloud.com/repository/npm/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== -esbuild@^0.16.14, esbuild@~0.16.17: - version "0.16.17" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" - integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== +esbuild@^0.17.5, esbuild@~0.17.18: + version "0.17.18" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.18.tgz#f4f8eb6d77384d68cd71c53eb6601c7efe05e746" + integrity sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w== optionalDependencies: - "@esbuild/android-arm" "0.16.17" - "@esbuild/android-arm64" "0.16.17" - "@esbuild/android-x64" "0.16.17" - "@esbuild/darwin-arm64" "0.16.17" - "@esbuild/darwin-x64" "0.16.17" - "@esbuild/freebsd-arm64" "0.16.17" - "@esbuild/freebsd-x64" "0.16.17" - "@esbuild/linux-arm" "0.16.17" - "@esbuild/linux-arm64" "0.16.17" - "@esbuild/linux-ia32" "0.16.17" - "@esbuild/linux-loong64" "0.16.17" - "@esbuild/linux-mips64el" "0.16.17" - "@esbuild/linux-ppc64" "0.16.17" - "@esbuild/linux-riscv64" "0.16.17" - "@esbuild/linux-s390x" "0.16.17" - "@esbuild/linux-x64" "0.16.17" - "@esbuild/netbsd-x64" "0.16.17" - "@esbuild/openbsd-x64" "0.16.17" - "@esbuild/sunos-x64" "0.16.17" - "@esbuild/win32-arm64" "0.16.17" - "@esbuild/win32-ia32" "0.16.17" - "@esbuild/win32-x64" "0.16.17" + "@esbuild/android-arm" "0.17.18" + "@esbuild/android-arm64" "0.17.18" + "@esbuild/android-x64" "0.17.18" + "@esbuild/darwin-arm64" "0.17.18" + "@esbuild/darwin-x64" "0.17.18" + "@esbuild/freebsd-arm64" "0.17.18" + "@esbuild/freebsd-x64" "0.17.18" + "@esbuild/linux-arm" "0.17.18" + "@esbuild/linux-arm64" "0.17.18" + "@esbuild/linux-ia32" "0.17.18" + "@esbuild/linux-loong64" "0.17.18" + "@esbuild/linux-mips64el" "0.17.18" + "@esbuild/linux-ppc64" "0.17.18" + "@esbuild/linux-riscv64" "0.17.18" + "@esbuild/linux-s390x" "0.17.18" + "@esbuild/linux-x64" "0.17.18" + "@esbuild/netbsd-x64" "0.17.18" + "@esbuild/openbsd-x64" "0.17.18" + "@esbuild/sunos-x64" "0.17.18" + "@esbuild/win32-arm64" "0.17.18" + "@esbuild/win32-ia32" "0.17.18" + "@esbuild/win32-x64" "0.17.18" escalade@^3.1.1: version "3.1.1" @@ -3389,21 +3547,6 @@ eve-raphael@0.5.0: resolved "https://registry.yarnpkg.com/eve-raphael/-/eve-raphael-0.5.0.tgz#17c754b792beef3fa6684d79cf5a47c63c4cda30" integrity sha512-jrxnPsCGqng1UZuEp9DecX/AuSyAszATSjf4oEcRxvfxa1Oux4KkIPKBAAWWnpdwfARtr+Q0o9aPYWjsROD7ug== -execa@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-7.0.0.tgz#2a44e20e73797f6c2df23889927972386157d7e4" - integrity sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - execa@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" @@ -3536,14 +3679,14 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flowchart.ts@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/flowchart.ts/-/flowchart.ts-0.1.2.tgz#81c230f4527a38b54db503b341481b132832cf82" - integrity sha512-4N8U2gXTkWUYh57SkCYwnSBM2B9Djia+JjClx/rLA13m0xz2S5BZht/9DvTZH5yXGZkmk7NGxGB15tnbUSI6mg== +flowchart.ts@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/flowchart.ts/-/flowchart.ts-0.1.6.tgz#2ba937122a526b03c19c71f739fa475d52702e84" + integrity sha512-mPvyKIpsHuDnF/M1oQyClLcqRdnVzvxbyBBijlfz5YU8yJWlV9j2QHvFrqkRd3lFor7uQ1M46dRaTQ/bXXEsNg== dependencies: "@types/raphael" "2.3.3" raphael "2.3.0" - tslib "2.4.1" + tslib "2.5.0" for-each@^0.3.3: version "0.3.3" @@ -3569,10 +3712,10 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" -fs-extra@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.0.tgz#5784b102104433bb0e090f48bfc4a30742c357ed" - integrity sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw== +fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -3726,10 +3869,10 @@ globalthis@^1.0.3: dependencies: define-properties "^1.1.3" -globby@^13.1.3: - version "13.1.3" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" - integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== +globby@^13.1.4: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== dependencies: dir-glob "^3.0.1" fast-glob "^3.2.11" @@ -3863,10 +4006,10 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== -hls.js@^1.3.5: - version "1.3.5" - resolved "https://repo.huaweicloud.com/repository/npm/hls.js/-/hls.js-1.3.5.tgz#0e8b0799ecf2feb7ba199f5e95f35ba9552e04f4" - integrity sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew== +hls.js@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.4.3.tgz#9326a680f5905631f86344d0ae155b5ef9d1bad7" + integrity sha512-EE1MjIYDNO+ynbmCpAWfhUwQpyG8gUcKKuGDGgYgfRmW/g+inQUQ8sVVVY5WZaCxEGxDMGLbXhXGepkmDIMvdw== html-entities@^1.2.1: version "1.4.0" @@ -3932,9 +4075,9 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.4.tgz#83260d50889526b4b531a5e293709a77f7c55a2a" integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== -imsc@^1.0.2: +imsc@^1.1.3: version "1.1.3" - resolved "https://repo.huaweicloud.com/repository/npm/imsc/-/imsc-1.1.3.tgz#e96a60a50d4000dd7b44097272768b9fd6a4891d" + resolved "https://registry.yarnpkg.com/imsc/-/imsc-1.1.3.tgz#e96a60a50d4000dd7b44097272768b9fd6a4891d" integrity sha512-IY0hMkVTNoqoYwKEp5UvNNKp/A5jeJUOrIO7judgOyhHT+xC6PA4VBOMAOhdtAYbMRHx9DTgI8p6Z6jhYQPFDA== dependencies: sax "1.2.1" @@ -4319,6 +4462,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -4370,12 +4520,12 @@ jsonpointer@^5.0.0: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -katex@^0.16.4: - version "0.16.4" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.4.tgz#87021bc3bbd80586ef715aeb476794cba6a49ad4" - integrity sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw== +katex@^0.16.7: + version "0.16.7" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.7.tgz#36be1d4ed96e8afdc5863407e70f8fb250aeafd5" + integrity sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA== dependencies: - commander "^8.0.0" + commander "^8.3.0" khroma@^2.0.0: version "2.0.0" @@ -4406,6 +4556,11 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klona@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + layout-base@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" @@ -4540,6 +4695,13 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" + integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4578,10 +4740,15 @@ markdown-it@^13.0.1: mdurl "^1.0.1" uc.micro "^1.0.5" -marked@^4.2.12: - version "4.2.12" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.12.tgz#d69a64e21d71b06250da995dcd065c11083bebb5" - integrity sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw== +marked@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" + integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== + +marked@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-5.0.2.tgz#ac79e78ea7ed9ad31de70b85e274595d9029e534" + integrity sha512-TXksm9GwqXCRNbFUZmMtqNLvy3K2cQHuWmyBDLOrY1e6i9UvZpOTJXoz7fBjYkJkaUFzV9hBFxMuZSyQt8R6KQ== mathjax-full@^3.2.2: version "3.2.2" @@ -4628,19 +4795,20 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.0.2.tgz#8e294ea4890fe86ca7f5a4cd3c10362ec8d3ed98" - integrity sha512-slwoB9WdNUT+/W9VhxLYRLZ0Ey12fIE+cAZjm3FmHTD+0F1uoJETfsNbVS1POnvQZhFYzfT6/z6hJZXgecqVBA== +mermaid@10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.1.0.tgz#6e40d5250174f4750ca6548e4ee00f6ae210855a" + integrity sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA== dependencies: "@braintree/sanitize-url" "^6.0.0" + "@khanacademy/simple-markdown" "^0.8.6" cytoscape "^3.23.0" cytoscape-cose-bilkent "^4.1.0" cytoscape-fcose "^2.1.0" d3 "^7.4.0" - dagre-d3-es "7.0.9" + dagre-d3-es "7.0.10" dayjs "^1.11.7" - dompurify "2.4.3" + dompurify "2.4.5" elkjs "^0.8.2" khroma "^2.0.0" lodash-es "^4.17.21" @@ -4743,10 +4911,10 @@ mj-context-menu@^0.6.1: resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== -mpegts.js@^1.7.2: - version "1.7.2" - resolved "https://repo.huaweicloud.com/repository/npm/mpegts.js/-/mpegts.js-1.7.2.tgz#4bbb7f813fb87514466d74d0dfb75f801b3b117b" - integrity sha512-qQ1ELBDC4IAqpULFuFzp3hoQeKwD5BCR3UM9Lk2+kj9jCWcXl19spF7PdzX0ZljghPHAj/VL2ajBbGyMWk2fgA== +mpegts.js@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/mpegts.js/-/mpegts.js-1.7.3.tgz#a422ed501d778fa86f9eef98d71fd62fc013f262" + integrity sha512-kqZ1C1IsbAQN72cK8vMrzKeM7hwrwSBbFAwVAc7PPweOeoZxCANrc7fAVDKMfYUzxdNkMTnec9tVmlxmKZB0TQ== dependencies: es6-promise "^4.2.5" webworkify-webpack "^2.1.5" @@ -4766,6 +4934,11 @@ nanoid@^3.3.4: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + nanomatch@^1.2.1, nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -4783,6 +4956,11 @@ nanomatch@^1.2.1, nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + node-releases@^2.0.8: version "2.0.10" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" @@ -4902,18 +5080,18 @@ option-validator@^2.0.6: dependencies: kind-of "^6.0.3" -ora@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ora/-/ora-6.1.2.tgz#7b3c1356b42fd90fb1dad043d5dbe649388a0bf5" - integrity sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw== +ora@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-6.3.0.tgz#a314600999f514a989a0904f5c17c8b7c1f7c878" + integrity sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ== dependencies: - bl "^5.0.0" chalk "^5.0.0" cli-cursor "^4.0.0" cli-spinners "^2.6.1" is-interactive "^2.0.0" is-unicode-supported "^1.1.0" log-symbols "^5.1.0" + stdin-discarder "^0.1.0" strip-ansi "^7.0.1" wcwidth "^1.0.1" @@ -5056,7 +5234,7 @@ postcss@^6.0.21: source-map "^0.6.1" supports-color "^5.4.0" -postcss@^8.1.10, postcss@^8.4.21: +postcss@^8.1.10: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -5065,6 +5243,15 @@ postcss@^8.1.10, postcss@^8.4.21: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.4.23: + version "8.4.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" + integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + posthtml-match-helper@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/posthtml-match-helper/-/posthtml-match-helper-1.0.3.tgz#9308f0bdc66398735f7117441feca64f131956d5" @@ -5153,10 +5340,10 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -qrcode@^1.5.1: - version "1.5.1" - resolved "https://repo.huaweicloud.com/repository/npm/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb" - integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg== +qrcode@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170" + integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg== dependencies: dijkstrajs "^1.0.1" encode-utf8 "^1.0.3" @@ -5326,7 +5513,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.1: +resolve@^1.14.2, resolve@^1.19.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -5353,10 +5540,10 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -reveal.js@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/reveal.js/-/reveal.js-4.4.0.tgz#bff589987a842d99bc8f6eb9b2b59f6d9941bf87" - integrity sha512-jIV6C9V2NEUjGzU8L6dUFGpk1KJmq7/EzP2fOW67ggc2c0Cp/PdprWxZ9Qgp46F0T2ZWDCjQ1p3Ytzy5jA6a2w== +reveal.js@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/reveal.js/-/reveal.js-4.5.0.tgz#fc04329aee58dd88862bf1f8e8f85f7993287763" + integrity sha512-Lx1hUWhJR7Y7ScQNyGt7TFzxeviDAswK2B0cn9RwbPZogTMRgS8+FTr+/12KNHOegjvWKH0H0EGwBARNDPTgWQ== robust-predicates@^3.0.0: version "3.0.1" @@ -5380,10 +5567,10 @@ rollup@^2.43.1: optionalDependencies: fsevents "~2.3.2" -rollup@^3.10.0, rollup@^3.17.3: - version "3.17.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.17.3.tgz#ee7c4e1a262da55c491a4788b632fa123315f6ef" - integrity sha512-p5LaCXiiOL/wrOkj8djsIDFmyU9ysUxcyW+EKRLHb6TKldJzXpImjcRSR+vgo09DBdofGcOoLOsRyxxG2n5/qQ== +rollup@^3.21.0, rollup@^3.21.6: + version "3.21.6" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.21.6.tgz#f5649ccdf8fcc7729254faa457cbea9547eb86db" + integrity sha512-SXIICxvxQxR3D4dp/3LDHZIJPC8a4anKMHd4E3Jiz2/JnY+2bEjqrOokAauc5ShGVNFHlEFjBXAXlaxkJqIqSg== optionalDependencies: fsevents "~2.3.2" @@ -5430,19 +5617,18 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.58.3: - version "1.58.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d" - integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== +sass-loader@^13.2.2: + version "13.2.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.2.tgz#f97e803993b24012c10d7ba9676548bf7a6b18b9" + integrity sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA== dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" + klona "^2.0.6" + neo-async "^2.6.2" -sass@^1.60.0: - version "1.60.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.60.0.tgz#657f0c23a302ac494b09a5ba8497b739fb5b5a81" - integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ== +sass@^1.62.1: + version "1.62.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.1.tgz#caa8d6bf098935bc92fc73fa169fb3790cacd029" + integrity sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -5471,10 +5657,10 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@^7.5.0: + version "7.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" + integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== dependencies: lru-cache "^6.0.0" @@ -5651,6 +5837,13 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -5899,15 +6092,15 @@ tslib@2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== -tslib@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -twikoo@^1.6.10: - version "1.6.10" - resolved "https://registry.yarnpkg.com/twikoo/-/twikoo-1.6.10.tgz#4256fa62abf61c0b83b8e855aceeed943126196e" - integrity sha512-5CPfRUzd8kHvNB6ekYXvgEbsIEQuySBOm47VkMh3nI4rj79crT+2v9aCDVuson+KorEngdGfe5MOni0VKNblmQ== +twikoo@^1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/twikoo/-/twikoo-1.6.16.tgz#08457f987aaa8cd91e06a15a1363276b0d2116c9" + integrity sha512-U+yaZsM2h0WBoju5TKrm1sq+pb0WEzIynS8B/x4g7UMS30YlUbKePYU7nKU2bf00xubZvkbmICKRNy07naZhhQ== type-fest@^0.16.0: version "0.16.0" @@ -6068,22 +6261,21 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== -vite@~4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" - integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== +vite@~4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.5.tgz#3871fe0f4b582ea7f49a85386ac80e84826367d9" + integrity sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA== dependencies: - esbuild "^0.16.14" - postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.10.0" + esbuild "^0.17.5" + postcss "^8.4.23" + rollup "^3.21.0" optionalDependencies: fsevents "~2.3.2" -vue-demi@*: - version "0.13.11" - resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99" - integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A== +vue-demi@>=0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.1.tgz#1ed9af03a27642762bfed83d8750805302d0398d" + integrity sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ== vue-router@^4.1.6: version "4.1.6" @@ -6092,7 +6284,14 @@ vue-router@^4.1.6: dependencies: "@vue/devtools-api" "^6.4.5" -vue@^3.2.45, vue@^3.2.47: +vue-router@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.2.0.tgz#558f31978a21ce3accf5122ffdf2cec34a5d2517" + integrity sha512-c+usESa6ZoWsm4PPdzRSyenp5A4dsUtnDJnrI03fY1IpIihA9TK3x5ffgkFDpjhLJZewsXoKURapNLFdZjuqTg== + dependencies: + "@vue/devtools-api" "^6.5.0" + +vue@^3.2.47: version "3.2.47" resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0" integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ== @@ -6103,167 +6302,183 @@ vue@^3.2.45, vue@^3.2.47: "@vue/server-renderer" "3.2.47" "@vue/shared" "3.2.47" -vuepress-plugin-comment2@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.200.tgz#54b6a988b9555830612f81e2785e1a7cd9f645dc" - integrity sha512-JHUxUuFu1Yc7ZgkMdFz+s57WbFizjtXhEVBocs+cQnSZBZSpCkb+pOzU49hAP5EjbWwwj3vLweyEupD6os/cJQ== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@waline/client" "^2.14.9" - artalk "^2.5.2" +vue@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.1.tgz#267372cecd953900412bb00108bb56a591f57d33" + integrity sha512-3Rwy4I5idbPVSDZu6I+fFh6tdDSZbauImCTqLxE7y0LpHtiDvPeY01OI7RkFPbva1nk4hoO0sv/NzosH2h60sg== + dependencies: + "@vue/compiler-dom" "3.3.1" + "@vue/compiler-sfc" "3.3.1" + "@vue/runtime-dom" "3.3.1" + "@vue/server-renderer" "3.3.1" + "@vue/shared" "3.3.1" + +vuepress-plugin-comment2@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.210.tgz#2b82d36dfe9117b41b06fb91ebe7f3a2c23f2a9d" + integrity sha512-yqxRtKWYTc4+rvsvAYXmzMi5i2rLQkpBb9K6DhANwllgZ/Q2mVtccA3mncn7to84A3gxlZmXfJgrYhV3FRwRaw== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + "@waline/client" "^2.15.4" + artalk "^2.5.5" giscus "^1.2.8" - twikoo "^1.6.10" - vue "^3.2.47" - vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.200" - vuepress-shared "2.0.0-beta.200" - -vuepress-plugin-components@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.200.tgz#f691b794436ee28dcd04c9ca7b308c805ec62f45" - integrity sha512-n+EGMshISwiegSpiav1JEeYSxGqByngIFocYYIgEQstjieNRVrf5FRdr41EW+HhIrpaq2ktwmU+YcLS/ZADVDA== - dependencies: - "@stackblitz/sdk" "^1.8.2" - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@vueuse/core" "^9.13.0" - artplayer "^4.6.2" + twikoo "^1.6.16" + vue "^3.3.1" + vue-router "^4.2.0" + vuepress-plugin-sass-palette "2.0.0-beta.210" + vuepress-shared "2.0.0-beta.210" + +vuepress-plugin-components@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.210.tgz#703cfc1d8ac192c27db7fb987f7f3cc0c4b08818" + integrity sha512-DAd/xJL2ZDcoW/7TvzNGW75VQUl53I5iR0P/WoS44kyBV9hfNjqYOfLAUsTieuZE9DDk6o9iXq1AjneSqSMYIw== + dependencies: + "@stackblitz/sdk" "^1.9.0" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + "@vueuse/core" "^10.1.2" + artplayer "^5.0.6" balloon-css "^1.2.0" - dashjs "^4.6.0" - hls.js "^1.3.5" - mpegts.js "^1.7.2" + dashjs "^4.7.0" + hls.js "^1.4.3" + mpegts.js "^1.7.3" plyr "^3.7.8" - qrcode "^1.5.1" - vue "^3.2.47" - vue-router "^4.1.6" - vuepress-plugin-reading-time2 "2.0.0-beta.200" - vuepress-plugin-sass-palette "2.0.0-beta.200" - vuepress-shared "2.0.0-beta.200" - -vuepress-plugin-copy-code2@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.200.tgz#c6734f91e89a2e83a279f3d5cb18dbf3252461b6" - integrity sha512-SPOGaSsUd3uFd1cdc27Y1PLtlJQ9yxOmgyFRLOBGGZ4HV0rUNbkCw1nv9ncfYAQxmyQRtbZSWwRKXXwi/tsltQ== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@vueuse/core" "^9.13.0" + qrcode "^1.5.3" + vue "^3.3.1" + vue-router "^4.2.0" + vuepress-plugin-reading-time2 "2.0.0-beta.210" + vuepress-plugin-sass-palette "2.0.0-beta.210" + vuepress-shared "2.0.0-beta.210" + +vuepress-plugin-copy-code2@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.210.tgz#b2ca94e2e5c794b6f0b636549b9ef3a45df625c9" + integrity sha512-2y78u3oIwcuA1I8pN7/HH727DaOgtwrmblbtUAHWgltK1QbYgOdd5GAJWMvwVBcmXu4JcvM3ypRvZ6gmCIJQYA== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + "@vueuse/core" "^10.1.2" balloon-css "^1.2.0" - vue "^3.2.47" - vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.200" - vuepress-shared "2.0.0-beta.200" - -vuepress-plugin-md-enhance@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.200.tgz#a5a9a34d6fe12351b0d1d723e909e9dd2b9dc676" - integrity sha512-KbBopiIe4N1LUdb6KI0Ndh9VXiHCtrqQ+HC03IWHHNBAoXun/CFpAKTtaOOuxBnPF8hIG4v6eLzs/xfAjuYRBg== - dependencies: - "@babel/core" "^7.21.3" - "@mdit/plugin-align" "^0.4.1" - "@mdit/plugin-attrs" "^0.4.1" - "@mdit/plugin-container" "^0.4.1" - "@mdit/plugin-figure" "^0.4.1" - "@mdit/plugin-footnote" "^0.4.1" - "@mdit/plugin-img-lazyload" "^0.4.1" - "@mdit/plugin-img-mark" "^0.4.1" - "@mdit/plugin-img-size" "^0.4.1" - "@mdit/plugin-include" "^0.4.1" - "@mdit/plugin-katex" "^0.4.1" - "@mdit/plugin-mark" "^0.4.1" - "@mdit/plugin-mathjax" "^0.4.1" - "@mdit/plugin-stylize" "^0.4.1" - "@mdit/plugin-sub" "^0.4.1" - "@mdit/plugin-sup" "^0.4.1" - "@mdit/plugin-tab" "^0.4.1" - "@mdit/plugin-tasklist" "^0.4.1" - "@mdit/plugin-tex" "^0.4.1" - "@mdit/plugin-uml" "^0.4.1" + vue "^3.3.1" + vue-router "^4.2.0" + vuepress-plugin-sass-palette "2.0.0-beta.210" + vuepress-shared "2.0.0-beta.210" + +vuepress-plugin-md-enhance@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.210.tgz#2902bab7b9dbdaed8e67e4733816e6780d165bdf" + integrity sha512-ah9TH9a0NYtud73mtCb7735HGEKcqecDtRvRkcaprmsYFRaWNnHZ9JodGtvzHAXt6Y07hhhOYvWeGcDKQ8Whtw== + dependencies: + "@babel/core" "^7.21.8" + "@mdit/plugin-align" "^0.4.5" + "@mdit/plugin-attrs" "^0.4.5" + "@mdit/plugin-container" "^0.4.5" + "@mdit/plugin-figure" "^0.4.5" + "@mdit/plugin-footnote" "^0.4.5" + "@mdit/plugin-img-lazyload" "^0.4.5" + "@mdit/plugin-img-mark" "^0.4.5" + "@mdit/plugin-img-size" "^0.4.5" + "@mdit/plugin-include" "^0.4.5" + "@mdit/plugin-katex" "^0.4.5" + "@mdit/plugin-mark" "^0.4.5" + "@mdit/plugin-mathjax" "^0.4.5" + "@mdit/plugin-stylize" "^0.4.5" + "@mdit/plugin-sub" "^0.4.5" + "@mdit/plugin-sup" "^0.4.5" + "@mdit/plugin-tab" "^0.4.5" + "@mdit/plugin-tasklist" "^0.4.5" + "@mdit/plugin-tex" "^0.4.5" + "@mdit/plugin-uml" "^0.4.5" + "@types/js-yaml" "^4.0.5" "@types/markdown-it" "^12.2.3" - "@vue/repl" "^1.3.3" - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@vueuse/core" "^9.13.0" + "@vue/repl" "^1.4.1" + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + "@vueuse/core" "^10.1.2" balloon-css "^1.2.0" - chart.js "^4.2.1" + chart.js "^4.3.0" echarts "^5.4.2" - flowchart.ts "^0.1.2" - katex "^0.16.4" + flowchart.ts "0.1.6" + js-yaml "^4.1.0" + katex "^0.16.7" markdown-it "^13.0.1" - mermaid "10.0.2" - reveal.js "^4.4.0" - vue "^3.2.47" - vue-router "^4.1.6" - vuepress-plugin-sass-palette "2.0.0-beta.200" - vuepress-shared "2.0.0-beta.200" - -vuepress-plugin-reading-time2@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.200.tgz#a37c7947b3ff2ee845ceaf1cd60257aa74563676" - integrity sha512-4svs6BowtlSCQcEgRGZmLucsy+DLl25MrSRojuG8rDL8a5UK54XMy5gxUbfPQtoZyJl8vpT7ab86snKQje0V3Q== - dependencies: - vuepress-shared "2.0.0-beta.200" - -vuepress-plugin-sass-palette@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.200.tgz#29a5c1d14de8eb447242d72aa339fd641f077771" - integrity sha512-yhcm3hvmkj4PlK0bAg1Yebx3RwpOygrOIe1EazqA6phuqUIDcLyHI9x9AUmvEvZ7YHC1B0hiExYdb96UFkYl3w== - dependencies: - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" + mermaid "10.1.0" + reveal.js "^4.5.0" + vue "^3.3.1" + vue-router "^4.2.0" + vuepress-plugin-sass-palette "2.0.0-beta.210" + vuepress-shared "2.0.0-beta.210" + +vuepress-plugin-reading-time2@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.210.tgz#b9cb1b2317a49636ae332fbd8400af0e985d0863" + integrity sha512-irHWqejn9YDoHnF/ddk78PlZL+vu/Vjth0nVXzL7b4x9ZFD+tlgQ8+CUG+khxC6E2jgeKIeJBesTaKfCttl7/A== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + vue "^3.3.1" + vuepress-shared "2.0.0-beta.210" + +vuepress-plugin-sass-palette@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.210.tgz#41d40ac01edc0a781cfc3369c2da4f8c64074709" + integrity sha512-t4yySaA7bESxBRN8dcYnhKxzCky23uD8fVB+vSWVsoSMmCIyake16xLvI3DW7xs2uk0g784KiL2pGUivrTK7/A== + dependencies: + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" chokidar "^3.5.3" - sass "^1.60.0" - vuepress-shared "2.0.0-beta.200" - -vuepress-plugin-seo2@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://repo.huaweicloud.com/repository/npm/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.200.tgz#70c06239e84051992ab48afbe4b39a1b2201a51f" - integrity sha512-CC2fCeJT1pTVH+/du7mju8q73aqDOB3JHPjF5QVwamLoWlmQFivgGInFaGtifWMcLNzzeeL5Fgk4OLp+XgGXBw== - dependencies: - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - vuepress-shared "2.0.0-beta.200" - -vuepress-shared@2.0.0-beta.200: - version "2.0.0-beta.200" - resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.200.tgz#5f5837db74a9cebf74b7686bbd1dfa71f418b30d" - integrity sha512-H4TqjpfMR3MkTlStlSvaun1ZpNdhxgX57zVnatSRk9kSr1+VFcRAqLTvDuaSYlMC7i2DDAPKNReQw18h/OBfDw== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - "@vuepress/shared" "2.0.0-beta.61" - "@vuepress/utils" "2.0.0-beta.61" - "@vueuse/core" "^9.13.0" + sass "^1.62.1" + vuepress-shared "2.0.0-beta.210" + +vuepress-plugin-seo2@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.210.tgz#da1feaee7daa4d1fe2708aec990638f02f149167" + integrity sha512-DXVXJxeNHQl1PHIXhoYlDR8jPJJtIrqe5mHf1riEDY9/08J/lCKhjh+JRd6ef7+Hv8GnkEIlhZeZKq7JOiAsLw== + dependencies: + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + vuepress-shared "2.0.0-beta.210" + +vuepress-shared@2.0.0-beta.210: + version "2.0.0-beta.210" + resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.210.tgz#4c6f60def2577e60389644f2ad4f36f966ab512a" + integrity sha512-Rfc5+oeMW7IIZHJe71yBPNRdZTMXbnim9JBikUVv7BHXDNBYrD+uc4AMivOocd5o/W/6k9J/6WEbo6HdQcb8yQ== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + "@vueuse/core" "^10.1.2" cheerio "1.0.0-rc.12" dayjs "^1.11.7" execa "^7.1.1" fflate "^0.7.4" gray-matter "^4.0.3" - semver "^7.3.8" + semver "^7.5.0" striptags "^3.2.0" - vue "^3.2.47" - vue-router "^4.1.6" - -vuepress-vite@2.0.0-beta.61: - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.61.tgz#04058551e6be014e9f2dee14c5d8043b158e032d" - integrity sha512-4mcR8XSY5b36CYkPqF80WvoeGAEjTw6Cr9bMPHrPVSjG4qqyfVpdSdyRtXD+/5aLJB7r/L60J7PI1pKTci1+3w== - dependencies: - "@vuepress/bundler-vite" "2.0.0-beta.61" - "@vuepress/cli" "2.0.0-beta.61" - "@vuepress/core" "2.0.0-beta.61" - "@vuepress/theme-default" "2.0.0-beta.61" - -vuepress@2.0.0-beta.61: - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-2.0.0-beta.61.tgz#f89741a505b71fbe49dba83d8319b1fd0d45116c" - integrity sha512-gpttL0x5ZvI9eTyR/pexBknIAcgrdjAWoiJc7OYd4bIVfwlXAb4GO4A2EwRSX+pIaNOWdcd+sfZA86EMEbrtNg== - dependencies: - vuepress-vite "2.0.0-beta.61" + vue "^3.3.1" + vue-router "^4.2.0" + +vuepress-vite@2.0.0-beta.62: + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.62.tgz#42545f39069f83dcb85ded0323fd30a37947fb41" + integrity sha512-C93T5ZCFMnbdXkZ/R/romtwPPP2zjPN38YZhrM6w6wWjSMDvrG26IFRwluXy+W84O0Pg7xOwqRom0wvO4kCxmA== + dependencies: + "@vuepress/bundler-vite" "2.0.0-beta.62" + "@vuepress/cli" "2.0.0-beta.62" + "@vuepress/core" "2.0.0-beta.62" + "@vuepress/theme-default" "2.0.0-beta.62" + vue "^3.3.1" + +vuepress@2.0.0-beta.62: + version "2.0.0-beta.62" + resolved "https://registry.yarnpkg.com/vuepress/-/vuepress-2.0.0-beta.62.tgz#744e90ee5dffea1afbff31b7814bed1e01ceed61" + integrity sha512-kwoC7RA6PGetWSU/NwV6dJ3VItg+R+K2IpAJ4bKsnRueIqGpDZwPr423nRK0VwDhh2sN7lUn6LoyaybPwWrGZg== + dependencies: + vuepress-vite "2.0.0-beta.62" wcwidth@^1.0.1: version "1.0.1" From ac0af4efdd3b69fdba7577316600cd9e9d55128d Mon Sep 17 00:00:00 2001 From: itlemon Date: Fri, 12 May 2023 22:13:43 +0800 Subject: [PATCH 47/61] =?UTF-8?q?mod:=20=E6=9B=B4=E6=96=B0chatgpt=20README?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/resources/chatgpt/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/resources/chatgpt/README.md b/docs/resources/chatgpt/README.md index 29d49ba..1c2bc18 100644 --- a/docs/resources/chatgpt/README.md +++ b/docs/resources/chatgpt/README.md @@ -1,8 +1,8 @@ # ChatGPT -chatgpt4j 是一个用于访问 ChatGPT API 的 Java 客户端库,支持 OpenAI 全部的[接口](https://platform.openai.com/docs/api-reference/introduction),几行代码就可以帮助用户实现将 ChatGPT 快速接入到自己的项目中。 +chatgpt4j 是一个用于访问 ChatGPT API 的 Java 客户端库,支持 OpenAI 全部的 [接口](https://platform.openai.com/docs/api-reference/introduction),几行代码就可以帮助用户实现将 ChatGPT 快速接入到自己的项目中。 -GitHub地址:https://github.com/itlemon/chatgpt4j +GitHub地址:[https://github.com/itlemon/chatgpt4j](https://github.com/itlemon/chatgpt4j) ## 特性⛳️ From 48a7e6430d2f1b03d621a1b52ba338a5690ed1f3 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 28 May 2023 00:16:17 +0800 Subject: [PATCH 48/61] =?UTF-8?q?mod:=20=E4=BC=98=E5=8C=96=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E7=AE=97=E6=B3=95=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\206\346\237\245\346\211\276\347\256\227\346\263\225.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" index 3b78d3a..b5681d8 100644 --- "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" +++ "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" @@ -62,7 +62,7 @@ class Solution { 复杂度分析: - 时间复杂度:$O(n)$ -- 空间复杂度: $O(1)$ +- 空间复杂度:$O(1)$ 我们做完这一道题,也分析了时间复杂度,那么有办法降低这个时间复杂度吗?或者说,有更优的解法吗?答案是当然有,它就是本节的重点要介绍的解法: `二分查找法` 。 @@ -181,7 +181,7 @@ class Solution { **复杂度分析:** - 时间复杂度:$O(\log_{2}{n})$ ,这里 $n$ 是输入数组的长度 -- 空间复杂度: $O(1)$ +- 空间复杂度:$O(1)$ ### 2.3 二分查找中的细节分析 @@ -246,7 +246,7 @@ class Solution { - $mid = (left + right) / 2$ - $mid = left + (right - left) / 2$ -这两种计算方式有何不同呢?其实在小范围内也没什么不同,第一个大家很好理解,就是首尾相加除以 `2` ,第二个写法,是为了防止整型溢出,什么意思呢?我以 `Java` 举例, `Integer` 类型的最大值是 *2147483647* ,假设某个数组最后一个元素的下标正好为 *2147483647* ,假设要寻找某个目标元素,它在整个数组的右半部分,此时当 left 设置为中间值的下标的时候,再次计算 $mid$ 的时候,中间值下标和 *2147483647* 相加肯定会超过 `Integer` 类型的最大值,此时程序会报错,此时第二种写法就成为了第一种写法的替代者,它不会造成整型溢出。所以在处理 `leetcode` 问题的时候,考虑使用哪种方式,取决于数组的最后一个元素下标会不会造成整型溢出,如果不会造成,为了问题简单化,我推荐第一种写法,如果你想求稳,第二种写法适合你。 +这两种计算方式有何不同呢?其实在小范围内也没什么不同,第一个大家很好理解,就是首尾相加除以 `2` ,第二个写法,是为了防止整型溢出,什么意思呢?我以 `Java` 举例, `Integer` 类型的最大值是 *2147483647* ,假设某个数组最后一个元素的下标正好为 *2147483647* ,假设要寻找某个目标元素,它在整个数组的右半部分,此时当 $left$ 设置为中间值的下标的时候,再次计算 $mid$ 的时候,中间值下标和 *2147483647* 相加肯定会超过 `Integer` 类型的最大值,此时程序会报错,此时第二种写法就成为了第一种写法的替代者,它不会造成整型溢出。所以在处理 `leetcode` 问题的时候,考虑使用哪种方式,取决于数组的最后一个元素下标会不会造成整型溢出,如果不会造成,为了问题简单化,我推荐第一种写法,如果你想求稳,第二种写法适合你。 **第二种:** 向上取整,取右边。 From 24707586da6780b071f5d72ae5a043bb6d15d92e Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 28 May 2023 17:45:33 +0800 Subject: [PATCH 49/61] =?UTF-8?q?mod:=20=E4=BC=98=E5=8C=96=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E7=AE=97=E6=B3=95=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\346\211\276\347\256\227\346\263\225.md" | 88 +++++++++++++++++-- 1 file changed, 82 insertions(+), 6 deletions(-) diff --git "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" index b5681d8..6316da4 100644 --- "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" +++ "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" @@ -360,6 +360,8 @@ class Solution { ### 3.1 猜数字大小 +**原题链接:**[猜数字大小](https://leetcode.cn/problems/guess-number-higher-or-lower/) + **描述:** 猜数字游戏的规则如下: @@ -508,7 +510,7 @@ public class Solution extends GuessGame { **复杂度分析:** - 时间复杂度:$O(\log_{2}{n})$ ,这里 $n$ 是输入数组的长度 -- 空间复杂度: $O(1)$ +- 空间复杂度:$O(1)$ 这里解释一下两种解法中 `mid` 值和判断条件的思路: @@ -517,6 +519,8 @@ public class Solution extends GuessGame { ### 3.2 搜索插入位置 +**原题链接:**[搜索插入位置](https://leetcode.cn/problems/search-insert-position/) + **描述:** 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 $O(log n)$ 的算法。 @@ -551,7 +555,7 @@ public class Solution extends GuessGame { **思路分析:** -我们阅读到题目,从 `排序数组` 、 `目标值` 、$O(log n)$ 等关键字中就可以看出,本道算法题适合使用二分查找算法来做。这道题和别的二分查找算法有点点变异,如果没有找到目标值,那么需要将目标值插入到数组中,并返回目标值的下标。虽然说是要插入目标值,其实不用去插入,只需要返回目标值的下标即可。 +我们阅读到题目,从 `排序数组` 、 `目标值` 、$O(log n)$ 等关键字中就可以看出,本道算法题适合使用二分查找算法来做。这道题和别的二分查找算法有点点变异,如果没有找到目标值,那么需要将目标值插入到数组中,并返回目标值的下标。虽然说是要插入目标值,其实不用真的原数组将目标值插入,只需要返回目标值的下标即可。 这里,其实有两种情况, @@ -630,10 +634,12 @@ class Solution { **复杂度分析:** - 时间复杂度:$O(\log_{2}{n})$ ,这里 $n$ 是输入数组的长度 -- 空间复杂度: $O(1)$ +- 空间复杂度:$O(1)$ ### 3.3 在排序数组中查找元素的第一个和最后一个位置 +**原题链接:**[在排序数组中查找元素的第一个和最后一个位置](https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/) + **描述:** 给你一个按照非递减顺序排列的整数数组 $nums$,和一个目标值 $target$ 。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 $target$ ,返回 $[-1, -1]$ 。你必须设计并实现时间复杂度为 $O(log n)$ 的算法解决此问题。 @@ -734,7 +740,7 @@ class Solution { **复杂度分析:** - 时间复杂度:介于 $O(\log_{2}{n})$ 和 $O(n)$ 之间,这里 $n$ 是输入数组的长度 -- 空间复杂度: $O(1)$ +- 空间复杂度:$O(1)$ **思路2分析:** @@ -851,11 +857,81 @@ class Solution { **复杂度分析:** -- 时间复杂度: $O(\log_{2}{n})$ ,这里 $n$ 是输入数组的长度 -- 空间复杂度: $O(1)$ +- 时间复杂度:$O(\log_{2}{n})$ ,这里 $n$ 是输入数组的长度 +- 空间复杂度:$O(1)$ ### 3.4 x 的平方根 +**原题链接:**[x 的平方根](https://leetcode.cn/problems/sqrtx/description/) + +**描述:** + +给你一个非负整数 `x`,计算并返回 `x` 的**算术平方根** 。由于返回类型是整数,结果只保留**整数部分** ,小数部分将被**舍去 。** + +**注意:**不允许使用任何内置指数函数和算符,例如 `pow(x, 0.5)` 或者 `x ** 0.5` 。 + +**示例1:** + +```java +输入:x = 4 +输出:2 +``` + +**示例2:** + +```java +输入:x = 8 +输出:2 +解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。 +``` + +**提示:** + +- $0 <= x <= 2^31 - 1$ + +**思路分析:** + +根据题意,我们很容易找到这样的隐含条件,其实就是求 $k$ 值,而这个 $k$ 值满足条件 $k^2 <= x$,且 $k$ 在 $0$ 到 $x$ 之间。转换思路就是在递增数组 $[0, 1, ..., k, ..., x]$ 中找到目标值 $k$,目标值 $k$ 满足条件 $k^2 <= x$,思路转换后,我们很快就可以发现,可以使用二分查找法来解决这个问题。 + +**代码展示:** + +```java +class Solution { + public int mySqrt(int x) { + // 定义三个变量,它们分别是左右边界及中间值的下标,由于x有可能为0,所以设置右边界下标为x + // 这样组成的数组可以理解为[0, 1, 2, ..., x] + int left = 0; + int right = x; + int mid; + + // 定一个变量ans,用来记录x的平方根整数部分值,它存在这样的关系:ans^2 <= x + int ans = 0; + + while (left <= right) { + // 这么计算mid,是防止整型溢出,因为x的取值范围是:0 <= x <= 2^31 - 1 + mid = left + (right - left) / 2; + if ((long) mid * mid <= x) { + ans = mid; + left = mid + 1; + } else { + right = mid - 1; + } + } + + return ans; + } +} +``` + +**复杂度分析:** + +- 时间复杂度:$O(\log_{2}{n})$ ,这里 $n$ 是输入数组的长度 +- 空间复杂度:$O(1)$ + + + + + ### 3.5 寻找重复数 ### 3.6 Pow(x, n) From 577e3acb1b7477b70b92f0fbd981f96d65262f53 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sun, 28 May 2023 18:08:05 +0800 Subject: [PATCH 50/61] =?UTF-8?q?mod:=20=E4=BC=98=E5=8C=96=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E7=AE=97=E6=B3=95=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10\206\346\237\245\346\211\276\347\256\227\346\263\225.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" index 6316da4..cce9303 100644 --- "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" +++ "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" @@ -868,7 +868,7 @@ class Solution { 给你一个非负整数 `x`,计算并返回 `x` 的**算术平方根** 。由于返回类型是整数,结果只保留**整数部分** ,小数部分将被**舍去 。** -**注意:**不允许使用任何内置指数函数和算符,例如 `pow(x, 0.5)` 或者 `x ** 0.5` 。 +**注意:** 不允许使用任何内置指数函数和算符,例如 `pow(x, 0.5)` 或者 `x ** 0.5` 。 **示例1:** @@ -887,7 +887,7 @@ class Solution { **提示:** -- $0 <= x <= 2^31 - 1$ +- $0 <= x <= 2^{31} - 1$ **思路分析:** From 8dfbf9546855325cc332c6841e38fd17ac833952 Mon Sep 17 00:00:00 2001 From: itlemon Date: Fri, 2 Jun 2023 14:51:41 +0800 Subject: [PATCH 51/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 20 +- package.json | 11 +- yarn.lock | 1017 +++++++++++++++++++++++++++----------- 3 files changed, 733 insertions(+), 315 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 1b1a7fa..7a29085 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -4,13 +4,13 @@ import {googleAnalyticsPlugin} from '@vuepress/plugin-google-analytics' import {pwaPlugin} from '@vuepress/plugin-pwa' import {pwaPopupPlugin} from '@vuepress/plugin-pwa-popup' import {gitPlugin} from '@vuepress/plugin-git' -import {searchPlugin} from '@vuepress/plugin-search' import {copyCodePlugin} from 'vuepress-plugin-copy-code2' import {commentPlugin} from 'vuepress-plugin-comment2' import {seoPlugin} from 'vuepress-plugin-seo2' import {svgIconPlugin} from '@goy/vuepress-plugin-svg-icons' import {mdEnhancePlugin} from 'vuepress-plugin-md-enhance' import {componentsPlugin} from 'vuepress-plugin-components' +import {searchProPlugin} from 'vuepress-plugin-search-pro' import {head, navbarZh, sidebarZh,} from './configs' @@ -103,17 +103,6 @@ export default defineUserConfig({ contributors: false }), - // docsearch - searchPlugin({ - locales: { - '/': { - placeholder: '搜索', - } - }, - // 排除首页 - isSearchable: (page) => page.path !== '/', - }), - // 代码拷贝插件 copyCodePlugin({ selector: '.theme-default-content div[class*=language-] pre', @@ -159,5 +148,12 @@ export default defineUserConfig({ backToTop: true, } }), + + // 搜索 + searchProPlugin({ + // 配置选项 + indexContent: true, + autoSuggestions: true + }), ], }) \ No newline at end of file diff --git a/package.json b/package.json index 5ed59d3..09138b3 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,12 @@ "@vuepress/plugin-pwa-popup": "2.0.0-beta.62", "@vuepress/plugin-search": "2.0.0-beta.62", "vuepress": "2.0.0-beta.62", - "vuepress-plugin-comment2": "2.0.0-beta.210", - "vuepress-plugin-components": "2.0.0-beta.210", - "vuepress-plugin-copy-code2": "2.0.0-beta.210", - "vuepress-plugin-md-enhance": "2.0.0-beta.210", - "vuepress-plugin-seo2": "2.0.0-beta.210" + "vuepress-plugin-comment2": "2.0.0-beta.219", + "vuepress-plugin-components": "2.0.0-beta.219", + "vuepress-plugin-copy-code2": "2.0.0-beta.219", + "vuepress-plugin-md-enhance": "2.0.0-beta.219", + "vuepress-plugin-search-pro": "^2.0.0-beta.219", + "vuepress-plugin-seo2": "2.0.0-beta.219" }, "scripts": { "docs:dev": "vuepress dev docs --clean-cache", diff --git a/yarn.lock b/yarn.lock index e52e177..a63af9f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,10 +38,10 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== -"@babel/compat-data@^7.21.5": - version "7.21.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" - integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== +"@babel/compat-data@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.3.tgz#cd502a6a0b6e37d7ad72ce7e71a7160a3ae36f7e" + integrity sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ== "@babel/core@^7.11.1": version "7.20.12" @@ -64,21 +64,21 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/core@^7.21.8": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== +"@babel/core@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.1.tgz#5de51c5206f4c6f5533562838337a603c1033cfd" + integrity sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/generator" "^7.22.0" + "@babel/helper-compilation-targets" "^7.22.1" + "@babel/helper-module-transforms" "^7.22.1" + "@babel/helpers" "^7.22.0" + "@babel/parser" "^7.22.0" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -94,12 +94,12 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" - integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== +"@babel/generator@^7.22.0", "@babel/generator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.3" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -130,12 +130,12 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" - integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== +"@babel/helper-compilation-targets@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz#bfcd6b7321ffebe33290d68550e2c9d7eb7c7a58" + integrity sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ== dependencies: - "@babel/compat-data" "^7.21.5" + "@babel/compat-data" "^7.22.0" "@babel/helper-validator-option" "^7.21.0" browserslist "^4.21.3" lru-cache "^5.1.1" @@ -180,10 +180,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-environment-visitor@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== +"@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== "@babel/helper-explode-assignable-expression@^7.18.6": version "7.18.6" @@ -250,19 +250,19 @@ "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" -"@babel/helper-module-transforms@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" - integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== +"@babel/helper-module-transforms@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz#e0cad47fedcf3cae83c11021696376e2d5a50c63" + integrity sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw== dependencies: - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-module-imports" "^7.21.4" "@babel/helper-simple-access" "^7.21.5" "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.0" "@babel/helper-optimise-call-expression@^7.18.6": version "7.18.6" @@ -370,14 +370,14 @@ "@babel/traverse" "^7.20.13" "@babel/types" "^7.20.7" -"@babel/helpers@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" - integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== +"@babel/helpers@^7.22.0": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.3.tgz#53b74351da9684ea2f694bf0877998da26dd830e" + integrity sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w== dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.21.9" + "@babel/traverse" "^7.22.1" + "@babel/types" "^7.22.3" "@babel/highlight@^7.18.6": version "7.18.6" @@ -393,7 +393,7 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== -"@babel/parser@^7.20.15", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": +"@babel/parser@^7.20.15": version "7.21.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== @@ -403,6 +403,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.3.tgz#1d285d67a19162ff9daa358d4cb41d50c06220b3" integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ== +"@babel/parser@^7.21.9", "@babel/parser@^7.22.0", "@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" @@ -1017,6 +1022,15 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" +"@babel/template@^7.21.9": + version "7.21.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.21.9.tgz#bf8dad2859130ae46088a99c1f265394877446fb" + integrity sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ== + dependencies: + "@babel/code-frame" "^7.21.4" + "@babel/parser" "^7.21.9" + "@babel/types" "^7.21.5" + "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" @@ -1033,19 +1047,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== +"@babel/traverse@^7.22.1": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== dependencies: "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" debug "^4.1.0" globals "^11.1.0" @@ -1076,7 +1090,16 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@braintree/sanitize-url@^6.0.0": +"@babel/types@^7.22.0", "@babel/types@^7.22.3", "@babel/types@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== + dependencies: + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@braintree/sanitize-url@^6.0.2": version "6.0.2" resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== @@ -1253,13 +1276,6 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@khanacademy/simple-markdown@^0.8.6": - version "0.8.6" - resolved "https://registry.yarnpkg.com/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz#9c9aef1f5ce2ce60292d13849165965a57c26f25" - integrity sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw== - dependencies: - "@types/react" ">=16.0.0" - "@kurkle/color@^0.3.0": version "0.3.2" resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" @@ -1348,162 +1364,162 @@ resolved "https://registry.yarnpkg.com/@mdit-vue/types/-/types-0.12.0.tgz#096ff57d3590d076f7d7561dbc9956fb0bb89fe1" integrity sha512-mrC4y8n88BYvgcgzq9bvTlDgFyi2zuvzmPilRvRc3Uz1iIvq8mDhxJ0rHKFUNzPEScpDvJdIujqiDrulMqiudA== -"@mdit/plugin-align@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.4.5.tgz#dcb990e6101e5ed3812261be997a2b4ebb7ee521" - integrity sha512-TwZXdfEPbPz2k8S+u9wML5RTO4R3vNxm5wLDuMbPmoT3hwp0cbA6mwYZp7XODEZ4FXLrlG4rnyHHsDoQ8kTBeA== +"@mdit/plugin-align@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-align/-/plugin-align-0.4.6.tgz#e371a04fadbf957e0ee6d87f42d8f9bc9329455d" + integrity sha512-0TUUAKV9kYLw2dgI6fHFGXVVqDkK2+yHrMGve32bKcYniSxEvJpP9lZYbhMC38y8glANV9bFR8kTpX4R6yYK0Q== dependencies: - "@mdit/plugin-container" "0.4.5" + "@mdit/plugin-container" "0.4.6" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-attrs@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.4.5.tgz#141ac2a43d27a0aa56a763ab21e8f4be037f79ca" - integrity sha512-20sfnsVz0IhMMLXJMXhhp8nHF5H8nTnSINlA0bK1b4aaVNLTXXxHqOgXVsfKY+LcjH/rXA1VefItsat0xPN9aw== +"@mdit/plugin-attrs@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-attrs/-/plugin-attrs-0.4.6.tgz#06dbc04a64b72d767c049fdd4b62489ae16dbb40" + integrity sha512-m5fSGUq2pirdiuxmZ/kMXVrrK9NE360+ILGS4pmOF3xz16b2e1c9W2jIf3INg9pigvWWrgghrlcd7lJ6Y5yY2g== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-container@0.4.5", "@mdit/plugin-container@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.4.5.tgz#ada65e16dac2c0b7d25aa597874cc24b7bb618c3" - integrity sha512-fWZAaGYPN5WvJWFXghOiefOGw56lFQrU+UxE1PWb9M2am18Bn6XPbQvrIToHiqOdoSipYpLuZTp6a1Vcap85dQ== +"@mdit/plugin-container@0.4.6", "@mdit/plugin-container@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-container/-/plugin-container-0.4.6.tgz#eb683ba5acced49ec228cd43dd363d556acdab9a" + integrity sha512-AIyP+X+zwDiv3qglWv4KI37xmO0QQXstw/GTPvisr+XHcssHNziui+NLaH/u3GBdloAzBOUmp0Lpwwd6jrsQpA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-figure@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.4.5.tgz#44c11746d92b16a2f84d88fe89a020b2d7842679" - integrity sha512-bCctdCFSa2OnB994NJ2276Ym4sS16HMkJJ/+y6IllWzN33oUowjneCnfoSizE6ysge44QtNDueMhXn2eSPC1TQ== +"@mdit/plugin-figure@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-figure/-/plugin-figure-0.4.6.tgz#47865c252bbb87b8077ec699b7a4ebbeba54b400" + integrity sha512-HwYms37vdJckKIi3FwdeYKIvPrMtr+pvlKZolxFIvky+K3ZmzJIefl5gaEwtMJZdyF8WvnmPgJ+d/du+eX5mVg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-footnote@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.4.5.tgz#63f08e33fb41ab945cbd066d7158e6b03d61c41c" - integrity sha512-XKcnWlnu1vtFwgGdG4sykWLhCkt9mHhbPZlJvQGyXHWcC+W2wo27n82q8nT/fBfrSC+k7mzjGR7+jAtHLup5Xg== +"@mdit/plugin-footnote@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-footnote/-/plugin-footnote-0.4.6.tgz#fdc2db30e674456217a94bf2a2352e88c9d475f8" + integrity sha512-hUIR33uBEymttQ3UXnX3+bX/TvZQiykkrEEhpAIC/sO6VGlcN9hmbZxB8pJgJD/iMGekNT8i5iPoDAc0S3XZRw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-lazyload@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.4.5.tgz#0b732ee4a6695816bbbbcde24facdbc52aa1bda0" - integrity sha512-eYG7YBBOPYwSPOP0ku8RHKWLlQXilcCD9BhqYUc1rMOE/eMNDJakicu8w0IsFunaJMaoFBjtQgn9gPby7+MZwg== +"@mdit/plugin-img-lazyload@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-lazyload/-/plugin-img-lazyload-0.4.6.tgz#752a5005219ef469e0755be4dfa1c2978a81ceb4" + integrity sha512-IZDyCXsGK5Wn1c0Nc2oBEhOogPBYj5yz/m+kqBfdydcRuXId1omtYQzr9XC/gAPExrSiVgW3yLdRNs0dVGpclA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-mark@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.4.5.tgz#9bfbe3d5047688dcc4a7fee21155de04ae8564af" - integrity sha512-e79VUTtW0aJkZXhFswHc4HR2lDsQVBa8i5E0kiFlR8/UiHrn3vP03QbXJs9SILUlaeWtSDmCUTQjsNg/Yd/RDg== +"@mdit/plugin-img-mark@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-mark/-/plugin-img-mark-0.4.6.tgz#aeffb7069316e46d8d2f1fc0954f8c2d73d94630" + integrity sha512-4NsLjnFkC7yATq2lUnHlObIxtyDj4GQlhbHJNP+v8/pkDrbD65vnpdDRopFsa9QI8e09iPlKCIe5KbNTRpP1mw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-img-size@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.4.5.tgz#4554fc4de00732fd3ba7c93e91899355bc0e619e" - integrity sha512-RYnpsi+YAAyG6I7N9WtsOAp4iPCucbABPmjmkqdnoFtFPV3VQHCTA8Y4sKMm/PP/d56L3DVny+UaVSMs0zsdRA== +"@mdit/plugin-img-size@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-img-size/-/plugin-img-size-0.4.6.tgz#e71b853d6677a210c99f6de1066c30339ea51664" + integrity sha512-60porH/uVGYe8VRxzCj0jmSHjc8YUEamd8kfq5UOMUhCAA0udYvZ2QK4jpEPoc49r9SNLiD3jCjThNAsxt3ufg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-include@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.4.5.tgz#9973b630fa403c338c743fc0402939ac2d3eb814" - integrity sha512-oq2fIPWGFUAUfWxxobbs9XuVXk5w0rL5jtqVCCPBKiSHRiTtFtmGm28bNLiiDm5RY7kItOqOrQ6pREE9X8Kdug== +"@mdit/plugin-include@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-include/-/plugin-include-0.4.6.tgz#037c84faee92e06d5bbdfa7455ba85b31af674f6" + integrity sha512-MQaBAcAlk/d8Skyg2fhAVclqE5do5PJdBBD0wsaXIom96TONNZJnOJQrSqGXUhqHGee8iSccMzIaZN6g3XHRVQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" upath "^2.0.1" -"@mdit/plugin-katex@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.4.5.tgz#dc46e807a50fda47a4af225e471c9578778c37e9" - integrity sha512-ELW2n+s1f22sKBSATTllmTjEcui6ALFQbifJ7tdpGczfNZ3bRtUrdGYrN6C4vzataaELcp3MurG0XFfe0oIUCw== +"@mdit/plugin-katex@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-katex/-/plugin-katex-0.4.6.tgz#568f32d115a424cfa725cdb1fe9b3551c33f166b" + integrity sha512-yB26Bwer7DgYOaB1mBkf5dKFgawQSIN850GkMacR3X2f1UMdlSTbHIeB4BZMwYu1+trFcukKjlFsLONns2OObQ== dependencies: - "@mdit/plugin-tex" "0.4.5" + "@mdit/plugin-tex" "0.4.6" "@types/katex" "^0.16.0" "@types/markdown-it" "^12.2.3" katex "^0.16.7" markdown-it "^13.0.1" -"@mdit/plugin-mark@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.4.5.tgz#b20331e63e73989148bf237e8a0552b531ed0411" - integrity sha512-gqC7qUxTq/BaABYwTKg2PBPO4BsugAQso3Nb8VibfPvbEOEJxpg7sCFe1qoYspIQ8e5fxTKQ94cBuuQbTHEABQ== +"@mdit/plugin-mark@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mark/-/plugin-mark-0.4.6.tgz#91d16db40c8642235d076418d637bf341a292f18" + integrity sha512-mpAwN2tW+lT7lmLyI6nb9U2EFSOLU+qT1i5FAT/i2JG7agPN5VYeCTf5QPg6Wj8ujMHv9h/0TXgK6KUSiArWFg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-mathjax@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.4.5.tgz#f55eed218d1f5232d3396254c128576586ba6bf2" - integrity sha512-5AddT0QC+ODH17yvNmx2kAfiY2bVg24HHhsI0nXg0ZX21LMHCjKM6k0Fuvj4BQLB9jYoZDf9v7325W7sRsfedQ== +"@mdit/plugin-mathjax@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-mathjax/-/plugin-mathjax-0.4.6.tgz#d0b304ddb4f9799984a3b02f0195d79c0e028cc0" + integrity sha512-WTVCpipypq8SVcUfc0R+xu/vc/NBcHoOFnPTCapVxU7ejGALU0mPKExRwqOrP9ShR5WAlu137EtAtjIwFAd4zA== dependencies: - "@mdit/plugin-tex" "0.4.5" + "@mdit/plugin-tex" "0.4.6" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" mathjax-full "^3.2.2" upath "^2.0.1" -"@mdit/plugin-stylize@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.4.5.tgz#33fcbd7f695f379f8a8450c10df52fe7117baf86" - integrity sha512-nRgYHFrEewL3lf55IrVsazpOgTwcxnEtLck/ruzYOYhxnvUVUb0tSo8c4rokLAcHq/2s7/UPXjQfb5fMCnwwWQ== +"@mdit/plugin-stylize@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-stylize/-/plugin-stylize-0.4.6.tgz#98280582d95d1537f915c1679febc2ff82662c54" + integrity sha512-/KpsinFtHsl9qGd9mNIwXzQz8t0ls0/UJQVv3u8of9j/twt3W/naQarXGF63HY9PEkl/AjcOZdYfQPOMYZW7AA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sub@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.4.5.tgz#088674fcff847c12ae9d1a5c9c3ea8787b79bb39" - integrity sha512-Q7RLah3SrQDP+OXl38yPLYhSqRLEquN2YELccC0DHGwjBfDHk8wHThnExNJngTaGgkxoBysLfoG6HGX6pby1Mg== +"@mdit/plugin-sub@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sub/-/plugin-sub-0.4.6.tgz#310c6fc034c432442201ff376bc7c7ad4a2a5647" + integrity sha512-Xj8cemPn506cyOXNC1z1hIDBriwFVNHMKQ8GgLbqjI3ztBGE6cDGEIt1QvWejhX9tpLSaoP5YQenTT2uCzVxYg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-sup@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.4.5.tgz#7f7ae5f1ff2f6af6b902f77b25484b08fe0e8496" - integrity sha512-8EWIfqdWLOuA46X7f1NxgIiLJy6giW+DJXlPguwg0bhXQI7b6QZgd7v9nv0IFesRcHwzYdfSbpgXqKFdrUBivw== +"@mdit/plugin-sup@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-sup/-/plugin-sup-0.4.6.tgz#0c617d85eb4f09f2e11c13dcc2149637e44776cc" + integrity sha512-3JyduzEeAFrmdRYAaeyVHKUF6X001zw+fV6k/AOr1VLIru8KZVA+9oFujcz62GngpTgJgX8jeDhLQu02wUVxIg== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tab@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.4.5.tgz#fb74a5b5e656a4041f8438e97ab62ad4cf7c49ec" - integrity sha512-ya3uDEA9I0+MSk8DQaJWrND/ZxBRnLspBouNvn49TqEqvMmLseK140DvKymb2PvnxE4AfJQY+eAeDPzpA7b7yw== +"@mdit/plugin-tab@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tab/-/plugin-tab-0.4.6.tgz#06ad5ce91d8514d518fc830bfb797d7c86a259a5" + integrity sha512-b5XxhMQ+6ucbsa9MX9i7ws4GF47S26BsHiPC/0qiK5ev+eM+RgIQr/FPAqBYx4gF0kzFkrVDRDLqwHKF5zIe3A== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tasklist@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.4.5.tgz#56946beeac938f34fc5469a104d6f964b875e716" - integrity sha512-c5agRjHLa+JWjm6ovs+MsYdjafDAVzo3KbmN8nj8bCm+Rn9CVyOzq/lW0xmCs2I86kiDNZBukaESsIiM8f2s4w== +"@mdit/plugin-tasklist@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tasklist/-/plugin-tasklist-0.4.6.tgz#06f54a341961a391b615f8835b646e08bbd7d0be" + integrity sha512-Qwu4vS8Ei8ErfY7RtTpoG5vjTud4Cwx+QeWEBtStb9eUHmrNMFNq17XcoL1+g8i2LZYFj+RaROiQyjgYpOAwfQ== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-tex@0.4.5", "@mdit/plugin-tex@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.4.5.tgz#af41ec27197c70d0822e180fae13fa0781e39d9a" - integrity sha512-L7ekZLMdzBNqsHzFS00ULyV+6ADtNAw5n7wN48qkE63K7QRWpXKEdXkNQ3LyaUwPCfSm1GgUv/QzI7SYiiL6jg== +"@mdit/plugin-tex@0.4.6", "@mdit/plugin-tex@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-tex/-/plugin-tex-0.4.6.tgz#c6cfc8f0a5041ee3e09317a5ad29e5f269789711" + integrity sha512-yozs2O8Ds0PFPaa6sdrCahJ2O18bwQKNJ2mNecrAt4FoYgHeqvoO7Hr6uK+FH1d55no5QR+LRdK68L2Z2uvp7g== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit/plugin-uml@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.4.5.tgz#5cce9ea97263e4ca599795bc783bf953024b5c3d" - integrity sha512-f9Y2AWz9Lt4hxx0c6VAFh2DZ9/aACJ+Uzrj7dvEmrW13WBNQxOhzxfoyTyo+dQmi7HyNdbz8RDXctJe+Yh+cWg== +"@mdit/plugin-uml@^0.4.6": + version "0.4.6" + resolved "https://registry.yarnpkg.com/@mdit/plugin-uml/-/plugin-uml-0.4.6.tgz#e1a9bcc54e5a00388d6ae383324bd0590a7c8162" + integrity sha512-D7K8i+hxzfNDwy+cdTk+gOos39dSEbQAMYXDAkiY8WONtcBWRdXTtkCf4vqCUo6csbSLNa5pD03SvEFZPFpVPA== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" @@ -1581,6 +1597,13 @@ magic-string "^0.25.0" string.prototype.matchall "^4.0.6" +"@types/debug@^4.0.0": + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== + dependencies: + "@types/ms" "*" + "@types/debug@^4.1.7": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" @@ -1643,6 +1666,13 @@ "@types/linkify-it" "*" "@types/mdurl" "*" +"@types/mdast@^3.0.0": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" + integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== + dependencies: + "@types/unist" "*" + "@types/mdurl@*": version "1.0.2" resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" @@ -1658,25 +1688,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.13.0.tgz#0400d1e6ce87e9d3032c19eb6c58205b0d3f7850" integrity sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg== -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/raphael@2.3.3": +"@types/raphael@^2.3.3": version "2.3.3" resolved "https://registry.yarnpkg.com/@types/raphael/-/raphael-2.3.3.tgz#d264b148bc100ef401a5e13159fd97861cd69e17" integrity sha512-Rhvq0q6wzyvipejki/9w87/pgapyE+s3gO66tdl1oD3qDrow+ek+4vVYAbRkeL58HCCK9EOZKwyjqYJ/TFkmtQ== -"@types/react@>=16.0.0": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" - integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -1684,16 +1700,16 @@ dependencies: "@types/node" "*" -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - "@types/trusted-types@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== +"@types/unist@*", "@types/unist@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" + integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== + "@types/web-bluetooth@^0.0.17": version "0.0.17" resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz#5c9f3c617f64a9735d7b72a7cc671e166d900c40" @@ -1724,6 +1740,16 @@ estree-walker "^2.0.2" source-map-js "^1.0.2" +"@vue/compiler-core@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" + integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== + dependencies: + "@babel/parser" "^7.21.3" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + source-map-js "^1.0.2" + "@vue/compiler-dom@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" @@ -1740,6 +1766,14 @@ "@vue/compiler-core" "3.3.1" "@vue/shared" "3.3.1" +"@vue/compiler-dom@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" + integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== + dependencies: + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + "@vue/compiler-sfc@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" @@ -1772,6 +1806,22 @@ postcss "^8.1.10" source-map-js "^1.0.2" +"@vue/compiler-sfc@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" + integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-ssr" "3.3.4" + "@vue/reactivity-transform" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + postcss "^8.1.10" + source-map-js "^1.0.2" + "@vue/compiler-ssr@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee" @@ -1788,6 +1838,14 @@ "@vue/compiler-dom" "3.3.1" "@vue/shared" "3.3.1" +"@vue/compiler-ssr@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" + integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/shared" "3.3.4" + "@vue/devtools-api@^6.4.5", "@vue/devtools-api@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" @@ -1815,6 +1873,17 @@ estree-walker "^2.0.2" magic-string "^0.30.0" +"@vue/reactivity-transform@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" + integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== + dependencies: + "@babel/parser" "^7.20.15" + "@vue/compiler-core" "3.3.4" + "@vue/shared" "3.3.4" + estree-walker "^2.0.2" + magic-string "^0.30.0" + "@vue/reactivity@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" @@ -1829,6 +1898,13 @@ dependencies: "@vue/shared" "3.3.1" +"@vue/reactivity@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253" + integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== + dependencies: + "@vue/shared" "3.3.4" + "@vue/repl@^1.4.1": version "1.4.1" resolved "https://registry.yarnpkg.com/@vue/repl/-/repl-1.4.1.tgz#40830aaa88e5740c6f6ba493e83a8a55c65dda98" @@ -1850,6 +1926,14 @@ "@vue/reactivity" "3.3.1" "@vue/shared" "3.3.1" +"@vue/runtime-core@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz#4bb33872bbb583721b340f3088888394195967d1" + integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== + dependencies: + "@vue/reactivity" "3.3.4" + "@vue/shared" "3.3.4" + "@vue/runtime-dom@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382" @@ -1868,6 +1952,15 @@ "@vue/shared" "3.3.1" csstype "^3.1.1" +"@vue/runtime-dom@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz#992f2579d0ed6ce961f47bbe9bfe4b6791251566" + integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== + dependencies: + "@vue/runtime-core" "3.3.4" + "@vue/shared" "3.3.4" + csstype "^3.1.1" + "@vue/server-renderer@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0" @@ -1884,6 +1977,14 @@ "@vue/compiler-ssr" "3.3.1" "@vue/shared" "3.3.1" +"@vue/server-renderer@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz#ea46594b795d1536f29bc592dd0f6655f7ea4c4c" + integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== + dependencies: + "@vue/compiler-ssr" "3.3.4" + "@vue/shared" "3.3.4" + "@vue/shared@3.2.47": version "3.2.47" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" @@ -1894,6 +1995,11 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.1.tgz#875a1c1847ec0646fc3dbe5581cb46b49ca3c469" integrity sha512-ybDBtQ+479HL/bkeIOIAwgpeAEACzztkvulJLbK3JMFuTOv4qDivmV3AIsR8RHYJ+RD9tQxcHWBsX4GqEcYrfw== +"@vue/shared@3.3.4": + version "3.3.4" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" + integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== + "@vuepress/bundler-vite@2.0.0-beta.62": version "2.0.0-beta.62" resolved "https://registry.yarnpkg.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.62.tgz#83f6a9ef57cdee551aab3ca5c778791f1b1113df" @@ -2192,7 +2298,7 @@ picocolors "^1.0.0" upath "^2.0.1" -"@vueuse/core@^10.1.0", "@vueuse/core@^10.1.2": +"@vueuse/core@^10.1.2": version "10.1.2" resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.1.2.tgz#2499eadec36c5d7109338e3a2b73725040ae8011" integrity sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA== @@ -2214,15 +2320,15 @@ dependencies: vue-demi ">=0.14.0" -"@waline/client@^2.15.4": - version "2.15.4" - resolved "https://registry.yarnpkg.com/@waline/client/-/client-2.15.4.tgz#0474be85f896fb02c0ed881997e5a1ecfe3c9de2" - integrity sha512-wH5lO4gTlF9SSuKCNC5fDnk4brzZDn4u+bBpgwEyu0Tz0deD59hW6ttMizXAZUi5CGT2Me6XqwIVE4WWRBBs6A== +"@waline/client@^2.15.5": + version "2.15.5" + resolved "https://registry.yarnpkg.com/@waline/client/-/client-2.15.5.tgz#8905b3e4598641aceb94d4168984d428d055af07" + integrity sha512-gLVeojWXRIRvXzVJwz9hfBokfde6KqZs+Adf7Z1SsEC3jAfyiqjOkdYkH93DhgMWyI0ck6nDlsBDLuePsFVifQ== dependencies: - "@vueuse/core" "^10.1.0" + "@vueuse/core" "^10.1.2" autosize "^6.0.1" marked "^4.3.0" - vue "^3.2.47" + vue "^3.3.2" abbrev@^1.0.0: version "1.1.1" @@ -2341,10 +2447,10 @@ artalk@^2.5.5: insane "^2.6.2" marked "^5.0.1" -artplayer@^5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/artplayer/-/artplayer-5.0.6.tgz#a8e605e4b1731cea026a8587df5eb58302aa047d" - integrity sha512-GHmtNC/edMtBRQQ74REFL6KsvB1mk/BMh0frsB5eqlVeUEUbUzbgeqVoPH2R1IkoNZVIqQSvMd+sD5IuIKjIUQ== +artplayer@^5.0.9: + version "5.0.9" + resolved "https://registry.yarnpkg.com/artplayer/-/artplayer-5.0.9.tgz#bb1a5d3fd9b28aef94b8a0de679332a9520f805b" + integrity sha512-IM/DShYdmKFEA9jl08LYbTK2Jfz9s7qIjEH0xWjnxvVArUKZZKcoqwr6i54U0c4grtc/Uvb4wtCd78kvtSVlgw== dependencies: option-validator "^2.0.6" @@ -2619,6 +2725,11 @@ chalk@^5.0.0: resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== +character-entities@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== + chart.js@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.3.0.tgz#ac363030ab3fec572850d2d872956f32a46326a1" @@ -2882,7 +2993,7 @@ csstype@^2.6.8: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== -csstype@^3.0.2, csstype@^3.1.1: +csstype@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== @@ -3194,7 +3305,7 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -3206,6 +3317,13 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decode-named-character-reference@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" + integrity sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg== + dependencies: + character-entities "^2.0.0" + decode-uri-component@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -3265,6 +3383,16 @@ delaunator@5: dependencies: robust-predicates "^3.0.0" +dequal@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + dijkstrajs@^1.0.1: version "1.0.2" resolved "https://repo.huaweicloud.com/repository/npm/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257" @@ -3318,10 +3446,10 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@2.4.5: - version "2.4.5" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87" - integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA== +dompurify@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.3.tgz#4b115d15a091ddc96f232bcef668550a2f6f1430" + integrity sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ== domutils@^1.5.1: version "1.7.0" @@ -3637,10 +3765,10 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -fflate@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" - integrity sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw== +fflate@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.0.tgz#f93ad1dcbe695a25ae378cf2386624969a7cda32" + integrity sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg== filelist@^1.0.1: version "1.0.4" @@ -3679,14 +3807,14 @@ find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -flowchart.ts@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/flowchart.ts/-/flowchart.ts-0.1.6.tgz#2ba937122a526b03c19c71f739fa475d52702e84" - integrity sha512-mPvyKIpsHuDnF/M1oQyClLcqRdnVzvxbyBBijlfz5YU8yJWlV9j2QHvFrqkRd3lFor7uQ1M46dRaTQ/bXXEsNg== +flowchart.ts@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/flowchart.ts/-/flowchart.ts-1.0.0.tgz#05603ddd018c69c3ebc93c953201ebf1bb5b4a98" + integrity sha512-U8FN9kg/U1xPdQ5xW3e/hZBSX7y/07zGESCrJ2mjlT8CLuhzPXHXRJrJ+VyFW0DEJLdj4O7MvJImg3sXeRGt1A== dependencies: - "@types/raphael" "2.3.3" - raphael "2.3.0" - tslib "2.5.0" + "@types/raphael" "^2.3.3" + raphael "^2.3.0" + tslib "^2.5.2" for-each@^0.3.3: version "0.3.3" @@ -4006,10 +4134,10 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== -hls.js@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.4.3.tgz#9326a680f5905631f86344d0ae155b5ef9d1bad7" - integrity sha512-EE1MjIYDNO+ynbmCpAWfhUwQpyG8gUcKKuGDGgYgfRmW/g+inQUQ8sVVVY5WZaCxEGxDMGLbXhXGepkmDIMvdw== +hls.js@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.4.4.tgz#6605a70fdc37e20cc67545ce2602da2dc2427a88" + integrity sha512-Yix3i1klHtTWIj8Fa/yoN5mFreY3eLKGrmVldpkQ+2Bb1PmEok9Ah/VfAzlJnwtInCo4rs5l6/W2tUh76DaSNA== html-entities@^1.2.1: version "1.4.0" @@ -4556,6 +4684,11 @@ kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +kleur@^4.0.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== + klona@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" @@ -4760,6 +4893,31 @@ mathjax-full@^3.2.2: mj-context-menu "^0.6.1" speech-rule-engine "^4.0.6" +mdast-util-from-markdown@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== + dependencies: + "@types/mdast" "^3.0.0" + "@types/unist" "^2.0.0" + decode-named-character-reference "^1.0.0" + mdast-util-to-string "^3.1.0" + micromark "^3.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-decode-string "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + unist-util-stringify-position "^3.0.0" + uvu "^0.5.0" + +mdast-util-to-string@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== + dependencies: + "@types/mdast" "^3.0.0" + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -4795,25 +4953,25 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.1.0.tgz#6e40d5250174f4750ca6548e4ee00f6ae210855a" - integrity sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA== +mermaid@10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.2.0.tgz#72c87fd321dcc687ff6db91a25e86e244c846e1a" + integrity sha512-mYKXlH9ngKdMsJ87VYMdlDZXS+MXDAGKPf3XzDf2vvAPnmRoFm7GFebemOAOWYI1bWSECDyoWTGwesWe6mW1Cw== dependencies: - "@braintree/sanitize-url" "^6.0.0" - "@khanacademy/simple-markdown" "^0.8.6" + "@braintree/sanitize-url" "^6.0.2" cytoscape "^3.23.0" cytoscape-cose-bilkent "^4.1.0" cytoscape-fcose "^2.1.0" d3 "^7.4.0" dagre-d3-es "7.0.10" dayjs "^1.11.7" - dompurify "2.4.5" + dompurify "3.0.3" elkjs "^0.8.2" khroma "^2.0.0" lodash-es "^4.17.21" + mdast-util-from-markdown "^1.3.0" non-layered-tidy-tree-layout "^2.0.2" - stylis "^4.1.2" + stylis "^4.1.3" ts-dedent "^2.2.0" uuid "^9.0.0" web-worker "^1.2.0" @@ -4823,6 +4981,200 @@ mhchemparser@^4.1.0: resolved "https://registry.yarnpkg.com/mhchemparser/-/mhchemparser-4.1.1.tgz#a2142fdab37a02ec8d1b48a445059287790becd5" integrity sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA== +micromark-core-commonmark@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-factory-destination "^1.0.0" + micromark-factory-label "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-factory-title "^1.0.0" + micromark-factory-whitespace "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-html-tag-name "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + +micromark-factory-destination@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-label@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-factory-space@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-title@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-factory-whitespace@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-character@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-1.2.0.tgz#4fedaa3646db249bc58caeb000eb3549a8ca5dcc" + integrity sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg== + dependencies: + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-chunked@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-classify-character@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-combine-extensions@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-types "^1.0.0" + +micromark-util-decode-numeric-character-reference@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" + integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-decode-string@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" + integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== + dependencies: + decode-named-character-reference "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" + integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== + +micromark-util-html-tag-name@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== + +micromark-util-normalize-identifier@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== + dependencies: + micromark-util-symbol "^1.0.0" + +micromark-util-resolve-all@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== + dependencies: + micromark-util-types "^1.0.0" + +micromark-util-sanitize-uri@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-subtokenize@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-util-symbol@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz#813cd17837bdb912d069a12ebe3a44b6f7063142" + integrity sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag== + +micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + +micromark@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== + dependencies: + "@types/debug" "^4.0.0" + debug "^4.0.0" + decode-named-character-reference "^1.0.0" + micromark-core-commonmark "^1.0.1" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-chunked "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-decode-numeric-character-reference "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-subtokenize "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.1" + uvu "^0.5.0" + micromatch@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.0.tgz#5102d4eaf20b6997d6008e3acfe1c44a3fa815e2" @@ -4919,6 +5271,11 @@ mpegts.js@^1.7.3: es6-promise "^4.2.5" webworkify-webpack "^2.1.5" +mri@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -5377,7 +5734,7 @@ rangetouch@^2.0.1: resolved "https://repo.huaweicloud.com/repository/npm/rangetouch/-/rangetouch-2.0.1.tgz#c01105110fd3afca2adcb1a580692837d883cb70" integrity sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA== -raphael@2.3.0: +raphael@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/raphael/-/raphael-2.3.0.tgz#eabeb09dba861a1d4cee077eaafb8c53f3131f89" integrity sha512-w2yIenZAQnp257XUWGni4bLMVxpUpcIl7qgxEgDIXtmSypYtlNxfXWpOBxs7LBTps5sDwhRnrToJrMUrivqNTQ== @@ -5586,6 +5943,13 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== +sade@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== + dependencies: + mri "^1.1.0" + safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -5657,10 +6021,10 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== +semver@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== dependencies: lru-cache "^6.0.0" @@ -5722,6 +6086,11 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== +slimsearch@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/slimsearch/-/slimsearch-0.0.3.tgz#bbe21b23608a4080523dd273d37f2f0ad0f86148" + integrity sha512-T/HDohHPxnj9wodoxSzvOAaxwSasTAp4sm36ECk3aAL/EGnfMSdG2dvTghJFDQfqRlG1k8vN6+Na4IiS14BB8A== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -5947,10 +6316,10 @@ striptags@^3.2.0: resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052" integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw== -stylis@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== +stylis@^4.1.3: + version "4.2.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" @@ -6092,10 +6461,10 @@ tslib@2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== -tslib@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== twikoo@^1.6.16: version "1.6.16" @@ -6181,6 +6550,13 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" +unist-util-stringify-position@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" + integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== + dependencies: + "@types/unist" "^2.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -6261,6 +6637,16 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== +uvu@^0.5.0: + version "0.5.6" + resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" + integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== + dependencies: + dequal "^2.0.0" + diff "^5.0.0" + kleur "^4.0.3" + sade "^1.7.3" + vite@~4.3.5: version "4.3.5" resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.5.tgz#3871fe0f4b582ea7f49a85386ac80e84826367d9" @@ -6291,6 +6677,13 @@ vue-router@^4.2.0: dependencies: "@vue/devtools-api" "^6.5.0" +vue-router@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.2.2.tgz#b0097b66d89ca81c0986be03da244c7b32a4fd81" + integrity sha512-cChBPPmAflgBGmy3tBsjeoe3f3VOSG6naKyY5pjtrqLGbNEXdzCigFUHgBvp9e3ysAtFtEx7OLqcSDh/1Cq2TQ== + dependencies: + "@vue/devtools-api" "^6.5.0" + vue@^3.2.47: version "3.2.47" resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0" @@ -6313,86 +6706,97 @@ vue@^3.3.1: "@vue/server-renderer" "3.3.1" "@vue/shared" "3.3.1" -vuepress-plugin-comment2@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.210.tgz#2b82d36dfe9117b41b06fb91ebe7f3a2c23f2a9d" - integrity sha512-yqxRtKWYTc4+rvsvAYXmzMi5i2rLQkpBb9K6DhANwllgZ/Q2mVtccA3mncn7to84A3gxlZmXfJgrYhV3FRwRaw== +vue@^3.3.2, vue@^3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6" + integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== + dependencies: + "@vue/compiler-dom" "3.3.4" + "@vue/compiler-sfc" "3.3.4" + "@vue/runtime-dom" "3.3.4" + "@vue/server-renderer" "3.3.4" + "@vue/shared" "3.3.4" + +vuepress-plugin-comment2@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-comment2/-/vuepress-plugin-comment2-2.0.0-beta.219.tgz#ab99854d5b42d061cf66a1e81085ba42417f27b4" + integrity sha512-zhOmN2r+uxofG54Y3nGiTZCP6QYjdB1b1f+K18Eh3AVC5q1mv7W3W0puuV/Z201P3WMttyrKCTiFp2oeKeM1Qw== dependencies: "@vuepress/client" "2.0.0-beta.62" "@vuepress/shared" "2.0.0-beta.62" "@vuepress/utils" "2.0.0-beta.62" - "@waline/client" "^2.15.4" + "@waline/client" "^2.15.5" artalk "^2.5.5" giscus "^1.2.8" twikoo "^1.6.16" - vue "^3.3.1" - vue-router "^4.2.0" - vuepress-plugin-sass-palette "2.0.0-beta.210" - vuepress-shared "2.0.0-beta.210" + vue "^3.3.4" + vue-router "^4.2.2" + vuepress-plugin-sass-palette "2.0.0-beta.219" + vuepress-shared "2.0.0-beta.219" -vuepress-plugin-components@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.210.tgz#703cfc1d8ac192c27db7fb987f7f3cc0c4b08818" - integrity sha512-DAd/xJL2ZDcoW/7TvzNGW75VQUl53I5iR0P/WoS44kyBV9hfNjqYOfLAUsTieuZE9DDk6o9iXq1AjneSqSMYIw== +vuepress-plugin-components@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-components/-/vuepress-plugin-components-2.0.0-beta.219.tgz#b1c8373ed6605d5c0e51ecb86a44580b18c55358" + integrity sha512-MZLG28jK+uD7GY5UWCzIuLhwseqQKifEcKvsezNHbRZ+B7mdDRKlEEdViZQVRGvTteOcP6Fo+BoKq7MkG4N4yg== dependencies: "@stackblitz/sdk" "^1.9.0" "@vuepress/client" "2.0.0-beta.62" "@vuepress/shared" "2.0.0-beta.62" "@vuepress/utils" "2.0.0-beta.62" "@vueuse/core" "^10.1.2" - artplayer "^5.0.6" + artplayer "^5.0.9" balloon-css "^1.2.0" dashjs "^4.7.0" - hls.js "^1.4.3" + hls.js "^1.4.4" mpegts.js "^1.7.3" plyr "^3.7.8" qrcode "^1.5.3" - vue "^3.3.1" - vue-router "^4.2.0" - vuepress-plugin-reading-time2 "2.0.0-beta.210" - vuepress-plugin-sass-palette "2.0.0-beta.210" - vuepress-shared "2.0.0-beta.210" + vue "^3.3.4" + vue-router "^4.2.2" + vuepress-plugin-reading-time2 "2.0.0-beta.219" + vuepress-plugin-sass-palette "2.0.0-beta.219" + vuepress-shared "2.0.0-beta.219" -vuepress-plugin-copy-code2@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.210.tgz#b2ca94e2e5c794b6f0b636549b9ef3a45df625c9" - integrity sha512-2y78u3oIwcuA1I8pN7/HH727DaOgtwrmblbtUAHWgltK1QbYgOdd5GAJWMvwVBcmXu4JcvM3ypRvZ6gmCIJQYA== +vuepress-plugin-copy-code2@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-copy-code2/-/vuepress-plugin-copy-code2-2.0.0-beta.219.tgz#6da365c1342f3e315b59ec6b82bdd2ef76937ea6" + integrity sha512-d8hqI2WI1EH2gSKGHN1xthUB59WeJMhUJXdafW+xdGPotdoL7XB0F4Hfv5X8YjSH+ua5e2dlL99fxEAEQqf0fQ== dependencies: "@vuepress/client" "2.0.0-beta.62" "@vuepress/shared" "2.0.0-beta.62" "@vuepress/utils" "2.0.0-beta.62" "@vueuse/core" "^10.1.2" balloon-css "^1.2.0" - vue "^3.3.1" - vue-router "^4.2.0" - vuepress-plugin-sass-palette "2.0.0-beta.210" - vuepress-shared "2.0.0-beta.210" - -vuepress-plugin-md-enhance@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.210.tgz#2902bab7b9dbdaed8e67e4733816e6780d165bdf" - integrity sha512-ah9TH9a0NYtud73mtCb7735HGEKcqecDtRvRkcaprmsYFRaWNnHZ9JodGtvzHAXt6Y07hhhOYvWeGcDKQ8Whtw== - dependencies: - "@babel/core" "^7.21.8" - "@mdit/plugin-align" "^0.4.5" - "@mdit/plugin-attrs" "^0.4.5" - "@mdit/plugin-container" "^0.4.5" - "@mdit/plugin-figure" "^0.4.5" - "@mdit/plugin-footnote" "^0.4.5" - "@mdit/plugin-img-lazyload" "^0.4.5" - "@mdit/plugin-img-mark" "^0.4.5" - "@mdit/plugin-img-size" "^0.4.5" - "@mdit/plugin-include" "^0.4.5" - "@mdit/plugin-katex" "^0.4.5" - "@mdit/plugin-mark" "^0.4.5" - "@mdit/plugin-mathjax" "^0.4.5" - "@mdit/plugin-stylize" "^0.4.5" - "@mdit/plugin-sub" "^0.4.5" - "@mdit/plugin-sup" "^0.4.5" - "@mdit/plugin-tab" "^0.4.5" - "@mdit/plugin-tasklist" "^0.4.5" - "@mdit/plugin-tex" "^0.4.5" - "@mdit/plugin-uml" "^0.4.5" + vue "^3.3.4" + vue-router "^4.2.2" + vuepress-plugin-sass-palette "2.0.0-beta.219" + vuepress-shared "2.0.0-beta.219" + +vuepress-plugin-md-enhance@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-md-enhance/-/vuepress-plugin-md-enhance-2.0.0-beta.219.tgz#f2a2bc3a99007538400eefefe8870e7ae608d6af" + integrity sha512-YHBEMyiyBsvb+iuGOcu+hDXiP90Z7au3qfd9xwchRNG4MyZSS7KLLv4GUTG1FdY0oHbzxtgMz3cX9oILfsNYSQ== + dependencies: + "@babel/core" "^7.22.1" + "@mdit/plugin-align" "^0.4.6" + "@mdit/plugin-attrs" "^0.4.6" + "@mdit/plugin-container" "^0.4.6" + "@mdit/plugin-figure" "^0.4.6" + "@mdit/plugin-footnote" "^0.4.6" + "@mdit/plugin-img-lazyload" "^0.4.6" + "@mdit/plugin-img-mark" "^0.4.6" + "@mdit/plugin-img-size" "^0.4.6" + "@mdit/plugin-include" "^0.4.6" + "@mdit/plugin-katex" "^0.4.6" + "@mdit/plugin-mark" "^0.4.6" + "@mdit/plugin-mathjax" "^0.4.6" + "@mdit/plugin-stylize" "^0.4.6" + "@mdit/plugin-sub" "^0.4.6" + "@mdit/plugin-sup" "^0.4.6" + "@mdit/plugin-tab" "^0.4.6" + "@mdit/plugin-tasklist" "^0.4.6" + "@mdit/plugin-tex" "^0.4.6" + "@mdit/plugin-uml" "^0.4.6" "@types/js-yaml" "^4.0.5" "@types/markdown-it" "^12.2.3" "@vue/repl" "^1.4.1" @@ -6403,50 +6807,67 @@ vuepress-plugin-md-enhance@2.0.0-beta.210: balloon-css "^1.2.0" chart.js "^4.3.0" echarts "^5.4.2" - flowchart.ts "0.1.6" + flowchart.ts "^1.0.0" js-yaml "^4.1.0" katex "^0.16.7" markdown-it "^13.0.1" - mermaid "10.1.0" + mermaid "10.2.0" reveal.js "^4.5.0" - vue "^3.3.1" - vue-router "^4.2.0" - vuepress-plugin-sass-palette "2.0.0-beta.210" - vuepress-shared "2.0.0-beta.210" + vue "^3.3.4" + vue-router "^4.2.2" + vuepress-plugin-sass-palette "2.0.0-beta.219" + vuepress-shared "2.0.0-beta.219" -vuepress-plugin-reading-time2@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.210.tgz#b9cb1b2317a49636ae332fbd8400af0e985d0863" - integrity sha512-irHWqejn9YDoHnF/ddk78PlZL+vu/Vjth0nVXzL7b4x9ZFD+tlgQ8+CUG+khxC6E2jgeKIeJBesTaKfCttl7/A== +vuepress-plugin-reading-time2@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-reading-time2/-/vuepress-plugin-reading-time2-2.0.0-beta.219.tgz#4e85bbff1d12359c756cfe0855256344d4e3c45e" + integrity sha512-uovgoTkgEYABGgF0zRBMBdQ+MM5klGmOMaWjXki9GiuMoJZkZn4GPPGWhR4KHYoy8Smg7B4IRgx0fpZ/26CYnw== dependencies: "@vuepress/client" "2.0.0-beta.62" - vue "^3.3.1" - vuepress-shared "2.0.0-beta.210" + vue "^3.3.4" + vuepress-shared "2.0.0-beta.219" -vuepress-plugin-sass-palette@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.210.tgz#41d40ac01edc0a781cfc3369c2da4f8c64074709" - integrity sha512-t4yySaA7bESxBRN8dcYnhKxzCky23uD8fVB+vSWVsoSMmCIyake16xLvI3DW7xs2uk0g784KiL2pGUivrTK7/A== +vuepress-plugin-sass-palette@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-sass-palette/-/vuepress-plugin-sass-palette-2.0.0-beta.219.tgz#d748ecc65d9b52c4b0fbca7dae8f5da1c0c95701" + integrity sha512-dZFpTymxWOu9CsYHwVyHWDLuEGrEOVu0a2sivva1hRLf9xJ3i3CuNXYFpiWoCXKbdH61B1mRZIBaN+/5Q2+9yQ== dependencies: "@vuepress/shared" "2.0.0-beta.62" "@vuepress/utils" "2.0.0-beta.62" chokidar "^3.5.3" sass "^1.62.1" - vuepress-shared "2.0.0-beta.210" + vuepress-shared "2.0.0-beta.219" + +vuepress-plugin-search-pro@^2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-search-pro/-/vuepress-plugin-search-pro-2.0.0-beta.219.tgz#d57ae95f9162ef685bdcdc5edf9a740ac67c4501" + integrity sha512-2O1Q9gOlcJPeLMVvhF8hZR6r6jQvDelnQJJJ0LX7iC/8NOAtjmW2IBCCUTsn8Bf1gQvM5YHZnRLRhe+arH2Obw== + dependencies: + "@vuepress/client" "2.0.0-beta.62" + "@vuepress/shared" "2.0.0-beta.62" + "@vuepress/utils" "2.0.0-beta.62" + "@vueuse/core" "^10.1.2" + cheerio "1.0.0-rc.12" + chokidar "^3.5.3" + slimsearch "0.0.3" + vue "^3.3.4" + vue-router "^4.2.2" + vuepress-plugin-sass-palette "2.0.0-beta.219" + vuepress-shared "2.0.0-beta.219" -vuepress-plugin-seo2@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.210.tgz#da1feaee7daa4d1fe2708aec990638f02f149167" - integrity sha512-DXVXJxeNHQl1PHIXhoYlDR8jPJJtIrqe5mHf1riEDY9/08J/lCKhjh+JRd6ef7+Hv8GnkEIlhZeZKq7JOiAsLw== +vuepress-plugin-seo2@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-plugin-seo2/-/vuepress-plugin-seo2-2.0.0-beta.219.tgz#e9e415e3e42b30a7f36dba42c02c2a240c2d42e5" + integrity sha512-mtMm1AFpfizPS2LIkybxuF5yMnACGiFBKKsTyPHJf22GY1dGxRavTJrblUdJM79CoXq5yX/Iqrv/GqLVSLt/NQ== dependencies: "@vuepress/shared" "2.0.0-beta.62" "@vuepress/utils" "2.0.0-beta.62" - vuepress-shared "2.0.0-beta.210" + vuepress-shared "2.0.0-beta.219" -vuepress-shared@2.0.0-beta.210: - version "2.0.0-beta.210" - resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.210.tgz#4c6f60def2577e60389644f2ad4f36f966ab512a" - integrity sha512-Rfc5+oeMW7IIZHJe71yBPNRdZTMXbnim9JBikUVv7BHXDNBYrD+uc4AMivOocd5o/W/6k9J/6WEbo6HdQcb8yQ== +vuepress-shared@2.0.0-beta.219: + version "2.0.0-beta.219" + resolved "https://registry.yarnpkg.com/vuepress-shared/-/vuepress-shared-2.0.0-beta.219.tgz#25ae27766489d4faf4e6f31f9459db9b750cf956" + integrity sha512-NJwkVGi8H6O+Ka+UlbMJG5siaz8D7BVWX/4iK/8pq5Qa9Dg4/wamVzx1IokRoE6kAHY/FMLn7dsBlpmDzqDIcw== dependencies: "@vuepress/client" "2.0.0-beta.62" "@vuepress/shared" "2.0.0-beta.62" @@ -6455,12 +6876,12 @@ vuepress-shared@2.0.0-beta.210: cheerio "1.0.0-rc.12" dayjs "^1.11.7" execa "^7.1.1" - fflate "^0.7.4" + fflate "^0.8.0" gray-matter "^4.0.3" - semver "^7.5.0" + semver "^7.5.1" striptags "^3.2.0" - vue "^3.3.1" - vue-router "^4.2.0" + vue "^3.3.4" + vue-router "^4.2.2" vuepress-vite@2.0.0-beta.62: version "2.0.0-beta.62" From 4c62d8fc41eb66a81ac4e3c33a2907599aae8ffe Mon Sep 17 00:00:00 2001 From: itlemon Date: Fri, 2 Jun 2023 14:55:13 +0800 Subject: [PATCH 52/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 09138b3..7b8873a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "vuepress-plugin-components": "2.0.0-beta.219", "vuepress-plugin-copy-code2": "2.0.0-beta.219", "vuepress-plugin-md-enhance": "2.0.0-beta.219", - "vuepress-plugin-search-pro": "^2.0.0-beta.219", + "vuepress-plugin-search-pro": "2.0.0-beta.219", "vuepress-plugin-seo2": "2.0.0-beta.219" }, "scripts": { diff --git a/yarn.lock b/yarn.lock index a63af9f..0e6f323 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6838,7 +6838,7 @@ vuepress-plugin-sass-palette@2.0.0-beta.219: sass "^1.62.1" vuepress-shared "2.0.0-beta.219" -vuepress-plugin-search-pro@^2.0.0-beta.219: +vuepress-plugin-search-pro@2.0.0-beta.219: version "2.0.0-beta.219" resolved "https://registry.yarnpkg.com/vuepress-plugin-search-pro/-/vuepress-plugin-search-pro-2.0.0-beta.219.tgz#d57ae95f9162ef685bdcdc5edf9a740ac67c4501" integrity sha512-2O1Q9gOlcJPeLMVvhF8hZR6r6jQvDelnQJJJ0LX7iC/8NOAtjmW2IBCCUTsn8Bf1gQvM5YHZnRLRhe+arH2Obw== From 087259134bc940f0b72c3442f124b3e3dbf15f12 Mon Sep 17 00:00:00 2001 From: itlemon Date: Sat, 3 Jun 2023 11:39:48 +0800 Subject: [PATCH 53/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 6 ------ package.json | 1 - 2 files changed, 7 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 7a29085..6fcc833 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -7,7 +7,6 @@ import {gitPlugin} from '@vuepress/plugin-git' import {copyCodePlugin} from 'vuepress-plugin-copy-code2' import {commentPlugin} from 'vuepress-plugin-comment2' import {seoPlugin} from 'vuepress-plugin-seo2' -import {svgIconPlugin} from '@goy/vuepress-plugin-svg-icons' import {mdEnhancePlugin} from 'vuepress-plugin-md-enhance' import {componentsPlugin} from 'vuepress-plugin-components' import {searchProPlugin} from 'vuepress-plugin-search-pro' @@ -123,11 +122,6 @@ export default defineUserConfig({ hostname: 'https://codingguide.cn' }), - // svg插件 - svgIconPlugin({ - svgsDir: '.vuepress/public/icons' - }), - // md增强插件 mdEnhancePlugin({ // 使用 KaTeX 启用 TeX 支持 diff --git a/package.json b/package.json index 7b8873a..d28366a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,6 @@ "author": "itlemon ", "license": "MIT", "dependencies": { - "@goy/vuepress-plugin-svg-icons": "5.3.3", "@vuepress/plugin-google-analytics": "2.0.0-beta.62", "@vuepress/plugin-pwa": "2.0.0-beta.62", "@vuepress/plugin-pwa-popup": "2.0.0-beta.62", From 13ed72f691d446dcaebfffb590b94d8d916b281e Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 5 Jun 2023 14:24:34 +0800 Subject: [PATCH 54/61] =?UTF-8?q?mod:=20=E5=8D=87=E7=BA=A7=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 6fcc833..33e3de4 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -145,9 +145,6 @@ export default defineUserConfig({ // 搜索 searchProPlugin({ - // 配置选项 - indexContent: true, - autoSuggestions: true }), ], }) \ No newline at end of file From ba37c3c063bdcb91eee654f4c4c45fbb23c21371 Mon Sep 17 00:00:00 2001 From: itlemon Date: Mon, 5 Jun 2023 23:24:46 +0800 Subject: [PATCH 55/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\346\211\276\347\256\227\346\263\225.md" | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" index cce9303..3d8afe6 100644 --- "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" +++ "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" @@ -928,10 +928,37 @@ class Solution { - 时间复杂度:$O(\log_{2}{n})$ ,这里 $n$ 是输入数组的长度 - 空间复杂度:$O(1)$ +### 3.5 寻找重复数 + **原题链接:**[寻找重复数](https://leetcode.cn/problems/find-the-duplicate-number/description/) +**描述:** + +给定一个包含 $n + 1$ 个整数的数组 $nums$,其数字都在 $[1, n]$ 范围内(包括 $1$ 和 $n$),可知至少存在一个重复的整数。假设 $nums$ 只有 **一个重复的整数** ,返回 **这个重复的数** 。 + +你设计的解决方案必须 **不修改** 数组 $nums$ 且只用常量级 $O(1)$ 的额外空间。 + +**示例1:** + +```java +输入:nums = [1,3,4,2,2] +输出:2 +``` + +**示例2:** + +```java +输入:nums = [3,1,3,4,2] +输出:3 +``` + +**提示:** + +- $1 <= n <= 105$ +- $nums.length == n + 1$ +- $1 <= nums[i] <= n$ +- $nums$ 中 **只有一个整数** 出现 **两次或多次** ,其余整数均只出现 **一次** -### 3.5 寻找重复数 ### 3.6 Pow(x, n) From 3c0edfd6497b7e8dbc0deb971c4a2d344b07fa8c Mon Sep 17 00:00:00 2001 From: itlemon Date: Sat, 16 Mar 2024 22:36:16 +0800 Subject: [PATCH 56/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\346\211\276\347\256\227\346\263\225.md" | 18 + yarn.lock | 1245 +---------------- 2 files changed, 35 insertions(+), 1228 deletions(-) diff --git "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" index 3d8afe6..91147d2 100644 --- "a/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" +++ "b/docs/resources/data-structure-and-algorithm/1-2\346\225\260\347\273\204\347\232\204\344\272\214\345\210\206\346\237\245\346\211\276\347\256\227\346\263\225.md" @@ -959,6 +959,24 @@ class Solution { - $1 <= nums[i] <= n$ - $nums$ 中 **只有一个整数** 出现 **两次或多次** ,其余整数均只出现 **一次** +**思路分析:** + +根据题意可知,数组 $nums$ 中有 $n + 1$ 个整数,且这些数字都在 $[1, n]$ 范围内,那么由此可知,至少 **存在一个重复的整数** ,这里基本可以分为两种情况,我们假设有重复的数字是 $target$ : + +- 第一种是, **仅存在一个重复的整数,也就是 $target$ 出现了两次** ,数组 $nums$ 中, $1$ 到 $n$ 中每个数都占了一个,且仅存在一个重复的数,一共是 $n + 1$ 个数字。 +- 第二种是, **整数 $target$ 重复出现三次(或三次以上)** ,这种情况,在数组 $nums$ 中, $1$ 到 $n$ 中必然有 **某个数字(或某几个)** 没有出现在数组中,被 $target$ 给代替了。 + +第一种情况很好理解,第二种情况中,当整数 $target$ 重复出现三次或三次以上,那么到底有几个数字被 $target$ 替代呢?其实也很好理清楚: + +- 当 $target$ 出现两次,那么 $[1, n]$ 中没有数字被 $target$ 替代了,它对应第一种情况; + +- 当 $target$ 出现三次,那么 $[1, n]$ 中必然有一个数字被 $target$ 替代了; +- 当 $target$ 出现四次,那么 $[1, n]$ 中必然有两个数字被 $target$ 替代了,然后以此类推。 + +分析后就可以得出基本结论,想知道几个数字被 $target$ 代替了,其实就是 $target$ 出现的次数减 $2$ 的关系,这样就可以很快知道 $[1, n]$ 范围内有几个数字没有出现。 + + + ### 3.6 Pow(x, n) diff --git a/yarn.lock b/yarn.lock index 0e6f323..7d9e833 100644 --- a/yarn.lock +++ b/yarn.lock @@ -388,7 +388,7 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.4", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": +"@babel/parser@^7.20.13", "@babel/parser@^7.20.7": version "7.20.15" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== @@ -1214,15 +1214,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.18.tgz#3a8e57153905308db357fd02f57c180ee3a0a1fa" integrity sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg== -"@goy/vuepress-plugin-svg-icons@5.3.3": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@goy/vuepress-plugin-svg-icons/-/vuepress-plugin-svg-icons-5.3.3.tgz#7ae6b3d3ff75523a3462b0fca0472786809dc32a" - integrity sha512-LtVl60F3yMHsTVCMaAd5po7mpnj/kwZcL/yJyMwrQXmNTrAX4WbrE1sNeIXF3g10dw76SBQFjF6x8BeGKriftA== - dependencies: - "@vuepress/client" "2.0.0-beta.61" - svg-mixer "^2.3.14" - vue "^3.2.47" - "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -1720,16 +1711,6 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.2.tgz#eb145aa86e673e5e3620132851200dcd604af8cf" integrity sha512-kNH4wMAqs13UiZe/2If1ioO0Mjz71rr2oALTl2c5ajBIox9Vz/UGW/wGkr7GA3SC6Eb29c1HtzAtxdGfbXAkfQ== -"@vue/compiler-core@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8" - integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/shared" "3.2.47" - estree-walker "^2.0.2" - source-map "^0.6.1" - "@vue/compiler-core@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.1.tgz#4e60a13a4dc65dd1f70e19d30f3746d4f9367af2" @@ -1750,14 +1731,6 @@ estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-dom@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305" - integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ== - dependencies: - "@vue/compiler-core" "3.2.47" - "@vue/shared" "3.2.47" - "@vue/compiler-dom@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.1.tgz#2d94431071377ace74c770aafb6ab2d62205b336" @@ -1774,22 +1747,6 @@ "@vue/compiler-core" "3.3.4" "@vue/shared" "3.3.4" -"@vue/compiler-sfc@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz#1bdc36f6cdc1643f72e2c397eb1a398f5004ad3d" - integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.47" - "@vue/compiler-dom" "3.2.47" - "@vue/compiler-ssr" "3.2.47" - "@vue/reactivity-transform" "3.2.47" - "@vue/shared" "3.2.47" - estree-walker "^2.0.2" - magic-string "^0.25.7" - postcss "^8.1.10" - source-map "^0.6.1" - "@vue/compiler-sfc@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.1.tgz#16a614fe9c85f35ca0e4333793441edb126323fc" @@ -1822,14 +1779,6 @@ postcss "^8.1.10" source-map-js "^1.0.2" -"@vue/compiler-ssr@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee" - integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw== - dependencies: - "@vue/compiler-dom" "3.2.47" - "@vue/shared" "3.2.47" - "@vue/compiler-ssr@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.1.tgz#4572a5ff79fefd1ba68cb57f024763f5d004f7b3" @@ -1846,22 +1795,11 @@ "@vue/compiler-dom" "3.3.4" "@vue/shared" "3.3.4" -"@vue/devtools-api@^6.4.5", "@vue/devtools-api@^6.5.0": +"@vue/devtools-api@^6.5.0": version "6.5.0" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== -"@vue/reactivity-transform@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz#e45df4d06370f8abf29081a16afd25cffba6d84e" - integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.47" - "@vue/shared" "3.2.47" - estree-walker "^2.0.2" - magic-string "^0.25.7" - "@vue/reactivity-transform@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.1.tgz#35000e3bd4d481b228e5f0b97eb652ec9e6894dc" @@ -1884,13 +1822,6 @@ estree-walker "^2.0.2" magic-string "^0.30.0" -"@vue/reactivity@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.47.tgz#1d6399074eadfc3ed35c727e2fd707d6881140b6" - integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ== - dependencies: - "@vue/shared" "3.2.47" - "@vue/reactivity@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.1.tgz#b134186493113f9f8c3fb6d65a047e19825a46e1" @@ -1910,14 +1841,6 @@ resolved "https://registry.yarnpkg.com/@vue/repl/-/repl-1.4.1.tgz#40830aaa88e5740c6f6ba493e83a8a55c65dda98" integrity sha512-7ONz/o1OtS611jW6SdAOZXn4HdN8gfyatcOzcEu+3bDMvgbyr7ZUcbRV6Y4xdkxDARKDBzs+sb3/oz1Na5hAeQ== -"@vue/runtime-core@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.47.tgz#406ebade3d5551c00fc6409bbc1eeb10f32e121d" - integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA== - dependencies: - "@vue/reactivity" "3.2.47" - "@vue/shared" "3.2.47" - "@vue/runtime-core@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.1.tgz#ed244dcb48d4e1e2079bf7d698a218e5b8ef5f62" @@ -1934,15 +1857,6 @@ "@vue/reactivity" "3.3.4" "@vue/shared" "3.3.4" -"@vue/runtime-dom@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz#93e760eeaeab84dedfb7c3eaf3ed58d776299382" - integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA== - dependencies: - "@vue/runtime-core" "3.2.47" - "@vue/shared" "3.2.47" - csstype "^2.6.8" - "@vue/runtime-dom@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.1.tgz#c07aef5b72385a2f22fdc82a203db6eba7f39fb4" @@ -1961,14 +1875,6 @@ "@vue/shared" "3.3.4" csstype "^3.1.1" -"@vue/server-renderer@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0" - integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA== - dependencies: - "@vue/compiler-ssr" "3.2.47" - "@vue/shared" "3.2.47" - "@vue/server-renderer@3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.1.tgz#c750a775ca4abd8213748a540cce7344af00dac4" @@ -1985,12 +1891,7 @@ "@vue/compiler-ssr" "3.3.4" "@vue/shared" "3.3.4" -"@vue/shared@3.2.47": - version "3.2.47" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" - integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== - -"@vue/shared@3.3.1", "@vue/shared@^3.2.47", "@vue/shared@^3.3.1": +"@vue/shared@3.3.1", "@vue/shared@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.1.tgz#875a1c1847ec0646fc3dbe5581cb46b49ca3c469" integrity sha512-ybDBtQ+479HL/bkeIOIAwgpeAEACzztkvulJLbK3JMFuTOv4qDivmV3AIsR8RHYJ+RD9tQxcHWBsX4GqEcYrfw== @@ -2032,16 +1933,6 @@ envinfo "^7.8.1" esbuild "~0.17.18" -"@vuepress/client@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/client/-/client-2.0.0-beta.61.tgz#d36321495924f19d468b71af48ae3a06ab626b93" - integrity sha512-C5QbdQkPsurEsKUkLclVucUAKMzBph9kHMUvfKHJqBaAsiXKYVLa61AICTJeyDkhTYF0faOjmpqmaElfMt1S9w== - dependencies: - "@vue/devtools-api" "^6.5.0" - "@vuepress/shared" "2.0.0-beta.61" - vue "^3.2.47" - vue-router "^4.1.6" - "@vuepress/client@2.0.0-beta.62": version "2.0.0-beta.62" resolved "https://registry.yarnpkg.com/@vuepress/client/-/client-2.0.0-beta.62.tgz#0f9c80263559e2709953e6f34f7f95e08e140381" @@ -2240,14 +2131,6 @@ "@vuepress/utils" "2.0.0-beta.62" vue "^3.3.1" -"@vuepress/shared@2.0.0-beta.61": - version "2.0.0-beta.61" - resolved "https://registry.yarnpkg.com/@vuepress/shared/-/shared-2.0.0-beta.61.tgz#7342602990ccf3a1a4aefcdbe8315b368ed5602b" - integrity sha512-NhOQ1FDr5lDSu5IinNlNNzrF+jGOZ+bMFUyAlCxlTvK9oY6aRBCNwV8dWme+yoh3/zviKHGu62Xp7J2hKAHNZA== - dependencies: - "@mdit-vue/types" "^0.12.0" - "@vue/shared" "^3.2.47" - "@vuepress/shared@2.0.0-beta.62": version "2.0.0-beta.62" resolved "https://registry.yarnpkg.com/@vuepress/shared/-/shared-2.0.0-beta.62.tgz#f766047e1a17ced9bc96057318760118bf17bc93" @@ -2330,11 +2213,6 @@ marked "^4.3.0" vue "^3.3.2" -abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - abortcontroller-polyfill@^1.7.5: version "1.7.5" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" @@ -2345,16 +2223,6 @@ acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== -ajv@^6.5.1: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^8.6.0: version "8.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" @@ -2389,14 +2257,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -2417,26 +2277,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - artalk@^2.5.5: version "2.5.5" resolved "https://registry.yarnpkg.com/artalk/-/artalk-2.5.5.tgz#f0ecc315dca233c89e313ee3d6b21d31e35541a2" @@ -2454,11 +2294,6 @@ artplayer@^5.0.9: dependencies: option-validator "^2.0.6" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - assignment@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/assignment/-/assignment-2.0.0.tgz#ffd17b21bf5d6b22e777b989681a815456a3dd3e" @@ -2474,11 +2309,6 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - autoprefixer@^10.4.14: version "10.4.14" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" @@ -2540,19 +2370,6 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - bcp-47-match@^1.0.0, bcp-47-match@^1.0.3: version "1.0.3" resolved "https://repo.huaweicloud.com/repository/npm/bcp-47-match/-/bcp-47-match-1.0.3.tgz#cb8d03071389a10aff2062b862d6575ffd7cd7ef" @@ -2609,22 +2426,6 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@^2.2.2, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2665,21 +2466,6 @@ cac@^6.7.14: resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" @@ -2703,7 +2489,7 @@ caniuse-lite@^1.0.30001464: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz#56a08885228edf62cbe1ac8980f2b5dae159997e" integrity sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg== -chalk@^2.0.0, chalk@^2.4.1: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2777,16 +2563,6 @@ cheerio@1.0.0-rc.12: optionalDependencies: fsevents "~2.3.2" -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - cli-cursor@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-4.0.0.tgz#3cecfe3734bf4fe02a8361cbdc0f6fe28c6a57ea" @@ -2808,29 +2584,16 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -clone@^1.0.2, clone@^1.0.4: +clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clone@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - codem-isoboxer@0.3.9: version "0.3.9" resolved "https://registry.yarnpkg.com/codem-isoboxer/-/codem-isoboxer-0.3.9.tgz#842361c9d75b9a2e32f62d99ad8bd8b7e729dd1a" integrity sha512-4XOTqEzBWrGOZaMd+sTED2hLpzfBbiQCf1W6OBGkIHqk1D8uwy8WFLazVbdQwfDpQ+vf39lqTGPa9IhWW0roTA== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2865,7 +2628,7 @@ commander@9.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== -commander@^2.19.0, commander@^2.20.0: +commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -2885,33 +2648,11 @@ common-tags@^1.8.0: resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -condense-newlines@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f" - integrity sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg== - dependencies: - extend-shallow "^2.0.1" - is-whitespace "^0.3.0" - kind-of "^3.0.2" - -config-chain@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" @@ -2922,11 +2663,6 @@ convert-source-map@^1.7.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - core-js-compat@^3.25.1: version "3.27.2" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.27.2.tgz#607c50ad6db8fd8326af0b2883ebb987be3786da" @@ -2939,11 +2675,6 @@ core-js@^3.26.1: resolved "https://repo.huaweicloud.com/repository/npm/core-js/-/core-js-3.30.0.tgz#64ac6f83bc7a49fd42807327051701d4b1478dea" integrity sha512-hQotSSARoNh1mYPi9O2YaWeiq/cEB95kOrFb4NCrO4RIFt1qqNpKsaE+vy/L3oiqvND5cThqXzUU3r9F7Efztg== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - cose-base@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" @@ -2988,11 +2719,6 @@ css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -csstype@^2.6.8: - version "2.6.21" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" - integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== - csstype@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" @@ -3298,13 +3024,6 @@ dayjs@^1.11.7: resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -3324,16 +3043,6 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - -deepmerge@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" - integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== - deepmerge@^4.2.2: version "4.3.0" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" @@ -3354,28 +3063,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - delaunator@5: version "5.0.0" resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" @@ -3405,14 +3092,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" @@ -3422,23 +3101,11 @@ dom-serializer@^2.0.0: domhandler "^5.0.2" entities "^4.2.0" -domelementtype@1, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1, domelementtype@^2.3.0: +domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -3451,14 +3118,6 @@ dompurify@3.0.3: resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.3.tgz#4b115d15a091ddc96f232bcef668550a2f6f1430" integrity sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ== -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - domutils@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" @@ -3476,16 +3135,6 @@ echarts@^5.4.2: tslib "2.3.0" zrender "5.4.3" -editorconfig@^0.15.3: - version "0.15.3" - resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5" - integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g== - dependencies: - commander "^2.19.0" - lru-cache "^4.1.5" - semver "^5.6.0" - sigmund "^1.0.1" - ejs@^3.1.6: version "3.1.8" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" @@ -3513,16 +3162,6 @@ encode-utf8@^1.0.3: resolved "https://repo.huaweicloud.com/repository/npm/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" @@ -3538,13 +3177,6 @@ envinfo@^7.8.1: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== -errno@^0.1.3: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.21.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.1.tgz#e6105a099967c08377830a0c9cb589d570dd86c6" @@ -3640,7 +3272,7 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -3690,19 +3322,6 @@ execa@^7.1.1: signal-exit "^3.0.7" strip-final-newline "^3.0.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3710,28 +3329,6 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.2, extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - fast-deep-equal@2.0.1: version "2.0.1" resolved "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -3753,7 +3350,7 @@ fast-glob@^3.2.11: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -3777,16 +3374,6 @@ filelist@^1.0.1: dependencies: minimatch "^5.0.1" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -3794,11 +3381,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ== - find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -3823,23 +3405,11 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - fs-extra@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" @@ -3849,15 +3419,6 @@ fs-extra@^11.1.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -3935,11 +3496,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - giscus@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/giscus/-/giscus-1.2.8.tgz#557964e1cb5e46c4b0abf69ed0b974c0718b8142" @@ -3947,14 +3503,6 @@ giscus@^1.2.8: dependencies: lit "^2.6.1" -glob-all@^3.1.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/glob-all/-/glob-all-3.3.1.tgz#6be2d5d8276902319f640fbf839fbe15b35e7667" - integrity sha512-Y+ESjdI7ZgMwfzanHZYQ87C59jOO0i+Hd+QYtVt9PhLi6d8wlOpzQnfBxWUlaTuAoR3TkybLqqbIoWveU4Ji7Q== - dependencies: - glob "^7.2.3" - yargs "^15.3.1" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3962,7 +3510,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob@^7.1.6, glob@^7.2.3: +glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -3974,17 +3522,6 @@ glob@^7.1.6, glob@^7.2.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4015,7 +3552,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -4076,37 +3613,6 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -4124,11 +3630,6 @@ he@0.5.0: resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" integrity sha512-DoufbNNOFzwRPy8uecq+j+VCPQ+JyDelHTmSgygrA5TsR8Cbw4Qcir5sGtWiusB4BdT89nmlaVDhSJOqC/33vw== -he@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - heap@^0.2.6: version "0.2.7" resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" @@ -4144,18 +3645,6 @@ html-entities@^1.2.1: resolved "https://repo.huaweicloud.com/repository/npm/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== -htmlparser2@^3.9.2: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - htmlparser2@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" @@ -4218,16 +3707,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - insane@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/insane/-/insane-2.6.2.tgz#c2ab68bb3e006ab451560d1b446917329c0a8120" @@ -4250,20 +3734,6 @@ internal-slot@^1.0.3, internal-slot@^1.0.4: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-alphabetical@^1.0.0: version "1.0.4" resolved "https://repo.huaweicloud.com/repository/npm/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -4308,11 +3778,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -4325,20 +3790,6 @@ is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -4351,36 +3802,11 @@ is-decimal@^1.0.0: resolved "https://repo.huaweicloud.com/repository/npm/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: +is-extendable@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -4420,13 +3846,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4437,18 +3856,6 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== -is-plain-obj@^1.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -4516,38 +3923,11 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-whitespace@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" - integrity sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - jake@^10.8.5: version "10.8.5" resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" @@ -4567,16 +3947,6 @@ jest-worker@^26.2.1: merge-stream "^2.0.0" supports-color "^7.0.0" -js-beautify@^1.6.12: - version "1.14.7" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.7.tgz#9206296de33f86dc106d3e50a35b7cf8729703b2" - integrity sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A== - dependencies: - config-chain "^1.1.13" - editorconfig "^0.15.3" - glob "^8.0.3" - nopt "^6.0.0" - js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4607,11 +3977,6 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - json-schema-traverse@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" @@ -4627,13 +3992,6 @@ json5@^2.2.0, json5@^2.2.2: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -4660,25 +4018,6 @@ khroma@^2.0.0: resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0, kind-of@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -4799,14 +4138,6 @@ log-symbols@^5.1.0: chalk "^5.0.0" is-unicode-supported "^1.1.0" -lru-cache@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4835,18 +4166,6 @@ magic-string@^0.30.0: dependencies: "@jridgewell/sourcemap-codec" "^1.4.13" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - markdown-it-anchor@^8.6.7: version "8.6.7" resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" @@ -4928,21 +4247,6 @@ medium-zoom@^1.0.8: resolved "https://registry.yarnpkg.com/medium-zoom/-/medium-zoom-1.0.8.tgz#2bd1fbcf2961fa7b0e318fe284462aa9b8608ed2" integrity sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA== -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-options@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-1.0.1.tgz#2a64b24457becd4e4dc608283247e94ce589aa32" - integrity sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg== - dependencies: - is-plain-obj "^1.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -5175,44 +4479,6 @@ micromark@^3.0.0: micromark-util-types "^1.0.1" uvu "^0.5.0" -micromatch@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.0.tgz#5102d4eaf20b6997d6008e3acfe1c44a3fa815e2" - integrity sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.2.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - extglob "^2.0.2" - fragment-cache "^0.2.1" - kind-of "^5.0.2" - nanomatch "^1.2.1" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -5250,14 +4516,6 @@ mitt@^3.0.0: resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.0.tgz#69ef9bd5c80ff6f57473e8d89326d01c414be0bd" integrity sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ== -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mj-context-menu@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" @@ -5276,11 +4534,6 @@ mri@^1.1.0: resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -5296,23 +4549,6 @@ nanoid@^3.3.6: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== -nanomatch@^1.2.1, nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -5328,20 +4564,6 @@ non-layered-tidy-tree-layout@^2.0.2: resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w== - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -5366,15 +4588,6 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" @@ -5385,13 +4598,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -5402,13 +4608,6 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -5486,11 +4685,6 @@ parse5@^7.0.0: dependencies: entities "^4.4.0" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - path-browserify@^1.0.1: version "1.0.1" resolved "https://repo.huaweicloud.com/repository/npm/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" @@ -5552,18 +4746,6 @@ pngjs@^5.0.0: resolved "https://repo.huaweicloud.com/repository/npm/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb" integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw== -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -postcss-helpers@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/postcss-helpers/-/postcss-helpers-0.3.2.tgz#cf8721d8d6605d2577302f966afefda1fea9929c" - integrity sha512-hppnMXY6Ehe8CgLHQCDWbyUsXvBFggdzftWzznL65MhgZsE8o8pUTYbmUbLst0rps+wyUSLIUJ0bGpV2Tzv7lw== - dependencies: - urijs "^1.18.12" - postcss-load-config@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" @@ -5572,25 +4754,11 @@ postcss-load-config@^4.0.1: lilconfig "^2.0.5" yaml "^2.1.1" -postcss-prefix-selector@^1.6.0: - version "1.16.0" - resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404" - integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q== - postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^6.0.21: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - postcss@^8.1.10: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" @@ -5609,89 +4777,16 @@ postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.0.2" -posthtml-match-helper@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/posthtml-match-helper/-/posthtml-match-helper-1.0.3.tgz#9308f0bdc66398735f7117441feca64f131956d5" - integrity sha512-aeRAPvok2Fs6uzSm85665jdAk5UOd8US2QCkWtGU6yLPlKSwzWTSgZZuABc3UeNy3K1lVk/HV9bRkWJYN05Ymw== - -posthtml-parser@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1" - integrity sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg== - dependencies: - htmlparser2 "^3.9.2" - -posthtml-rename-id@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz#cf7f6eb37146bf1afac31e68f18c6cc19ae61433" - integrity sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw== - dependencies: - escape-string-regexp "1.0.5" - -posthtml-render@^1.1.2, posthtml-render@^1.1.5: - version "1.4.0" - resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.4.0.tgz#40114070c45881cacb93347dae3eff53afbcff13" - integrity sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw== - -posthtml@^0.11.3: - version "0.11.6" - resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.6.tgz#e349d51af7929d0683b9d8c3abd8166beecc90a8" - integrity sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw== - dependencies: - posthtml-parser "^0.4.1" - posthtml-render "^1.1.5" - -postsvg@^2.2.7: - version "2.2.7" - resolved "https://registry.yarnpkg.com/postsvg/-/postsvg-2.2.7.tgz#b345488cec971dcd17dd330b2e613542285940cb" - integrity sha512-TyRnoyEvszrEGOzxaTycnUgJZ0W2Xnd9fOmgfuy61Qjo6JhDPhAIBQ1dspQCvdVpK9KkIlZkSETSjmbO0gVIag== - dependencies: - clone "^1.0.4" - deepmerge "^2.1.0" - posthtml "^0.11.3" - posthtml-match-helper "^1.0.1" - posthtml-parser "^0.4.1" - posthtml-render "^1.1.2" - pretty-bytes@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5" - integrity sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w== - dependencies: - condense-newlines "^0.2.1" - extend-shallow "^2.0.1" - js-beautify "^1.6.12" - prismjs@^1.29.0: version "1.29.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - punycode@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" @@ -5707,16 +4802,6 @@ qrcode@^1.5.3: pngjs "^5.0.0" yargs "^15.3.1" -query-string@^6.0.0: - version "6.14.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.14.1.tgz#7ac2dca46da7f309449ba0f86b1fd28255b0c86a" - integrity sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -5741,20 +4826,7 @@ raphael@^2.3.0: dependencies: eve-raphael "0.5.0" -readable-stream@^2.0.1: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0: +readable-stream@^3.4.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -5794,14 +4866,6 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -5835,21 +4899,6 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw== - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -5865,11 +4914,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - resolve@^1.14.2, resolve@^1.19.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -5887,11 +4931,6 @@ restore-cursor@^4.0.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -5955,11 +4994,6 @@ safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - safe-regex-test@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" @@ -5969,13 +5003,6 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -6011,11 +5038,6 @@ section-matter@^1.0.0: extend-shallow "^2.0.1" kind-of "^6.0.0" -semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -6040,16 +5062,6 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -6071,11 +5083,6 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -sigmund@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" - integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g== - signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" @@ -6091,52 +5098,11 @@ slimsearch@0.0.3: resolved "https://registry.yarnpkg.com/slimsearch/-/slimsearch-0.0.3.tgz#bbe21b23608a4080523dd273d37f2f0ad0f86148" integrity sha512-T/HDohHPxnj9wodoxSzvOAaxwSasTAp4sm36ECk3aAL/EGnfMSdG2dvTghJFDQfqRlG1k8vN6+Na4IiS14BB8A== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -6145,17 +5111,7 @@ source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1: +source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6181,31 +5137,11 @@ speech-rule-engine@^4.0.6: wicked-good-xpath "1.3.0" xmldom-sre "0.1.31" -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - stdin-discarder@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" @@ -6213,11 +5149,6 @@ stdin-discarder@^0.1.0: dependencies: bl "^5.0.0" -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== - string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -6266,13 +5197,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - stringify-object@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -6321,7 +5245,7 @@ stylis@^4.1.3: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -6340,38 +5264,6 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -svg-mixer-utils@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/svg-mixer-utils/-/svg-mixer-utils-0.3.4.tgz#3b8f3e17ac893e1f7d269e0a141eb50d512f1e22" - integrity sha512-szkeG+Jn6DRo7QlnUOYKslm4J6dg37I8E+tLG1PB13U6UhSlkC8teCisyT7ZRGRwTcTxmNizvu+/oe8uJUf5EA== - dependencies: - ajv "^6.5.1" - anymatch "^2.0.0" - memory-fs "^0.4.1" - merge-options "^1.0.0" - postcss-helpers "^0.3.2" - -svg-mixer@^2.3.14: - version "2.3.14" - resolved "https://registry.yarnpkg.com/svg-mixer/-/svg-mixer-2.3.14.tgz#1ff62ef58ef67c67d2dcc26ec0221ebd587db768" - integrity sha512-SixVZCWwEYRLJtxPlKoS0JqkYVDJMHeCLRdozoK/SwIlf9FkoiNoJHkBrDX7j7t9JDB3I37woXbPW0PfMw/GLQ== - dependencies: - clone "^2.1.2" - fs-extra "^5.0.0" - glob-all "^3.1.0" - he "^1.1.1" - merge-options "^1.0.0" - micromatch "3.1.0" - postcss "^6.0.21" - postcss-prefix-selector "^1.6.0" - posthtml-rename-id "^1.0.12" - postsvg "^2.2.7" - pretty "^2.0.0" - query-string "^6.0.0" - svg-mixer-utils "^0.3.4" - traverse "^0.6.6" - url-slug "^2.0.0" - temp-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" @@ -6402,21 +5294,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -6424,16 +5301,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -6441,11 +5308,6 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" -traverse@^0.6.6: - version "0.6.7" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" - integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== - ts-debounce@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/ts-debounce/-/ts-debounce-4.0.0.tgz#33440ef64fab53793c3d546a8ca6ae539ec15841" @@ -6528,21 +5390,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== -unidecode@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/unidecode/-/unidecode-0.1.8.tgz#efbb301538bc45246a9ac8c559d72f015305053e" - integrity sha512-SdoZNxCWpN2tXTCrGkPF/0rL2HEq+i2gwRG1ReBvx8/0yTzC3enHfugOf8A9JBShVwwrRIkLX0YcDUGbzjbVCA== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -6557,24 +5404,11 @@ unist-util-stringify-position@^3.0.0: dependencies: "@types/unist" "^2.0.0" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" @@ -6600,34 +5434,12 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urijs@^1.18.12: - version "1.19.11" - resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.11.tgz#204b0d6b605ae80bea54bea39280cdb7c9f923cc" - integrity sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ== - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - url-polyfill@^1.1.12: version "1.1.12" resolved "https://repo.huaweicloud.com/repository/npm/url-polyfill/-/url-polyfill-1.1.12.tgz#6cdaa17f6b022841b3aec0bf8dbd87ac0cd33331" integrity sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A== -url-slug@^2.0.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/url-slug/-/url-slug-2.3.2.tgz#eab21da0e227deba10610c7b01ec4af20babea21" - integrity sha512-M3aqTb+ur72tp9Sx4P4Teye0uBjk0fFDgZm1mFdnhiFRra1ScQF9xupChhUBxdffxAb2ZXSl5Jnfc/4A8nUmBA== - dependencies: - unidecode "^0.1.8" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -6663,13 +5475,6 @@ vue-demi@>=0.14.0: resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.1.tgz#1ed9af03a27642762bfed83d8750805302d0398d" integrity sha512-rt+yuCtXvscYot9SQQj3WKZJVSriPNqVkpVBNEHPzSgBv7QIYzsS410VqVgvx8f9AAPgjg+XPKvmV3vOqqkJQQ== -vue-router@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.1.6.tgz#b70303737e12b4814578d21d68d21618469375a1" - integrity sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ== - dependencies: - "@vue/devtools-api" "^6.4.5" - vue-router@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.2.0.tgz#558f31978a21ce3accf5122ffdf2cec34a5d2517" @@ -6684,17 +5489,6 @@ vue-router@^4.2.2: dependencies: "@vue/devtools-api" "^6.5.0" -vue@^3.2.47: - version "3.2.47" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.47.tgz#3eb736cbc606fc87038dbba6a154707c8a34cff0" - integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ== - dependencies: - "@vue/compiler-dom" "3.2.47" - "@vue/compiler-sfc" "3.2.47" - "@vue/runtime-dom" "3.2.47" - "@vue/server-renderer" "3.2.47" - "@vue/shared" "3.2.47" - vue@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.1.tgz#267372cecd953900412bb00108bb56a591f57d33" @@ -7154,11 +5948,6 @@ y18n@^4.0.0: resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" From 39aa2ae8de3e5923940ad8a90aa3c7bef1832ac2 Mon Sep 17 00:00:00 2001 From: itlemon Date: Tue, 19 Mar 2024 22:04:12 +0800 Subject: [PATCH 57/61] =?UTF-8?q?mod:=20=E5=AE=8C=E5=96=84=E4=BA=8C?= =?UTF-8?q?=E5=88=86=E6=9F=A5=E6=89=BE=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...king 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 "docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" diff --git "a/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" "b/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" new file mode 100644 index 0000000..c1b03e4 --- /dev/null +++ "b/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" @@ -0,0 +1,2 @@ +# SkyWalking 9.x 快速入门 + From 2c71d9f6b14b40964d9ade377606f575ffa45c55 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 27 Mar 2024 23:13:38 +0800 Subject: [PATCH 58/61] mod: skywalking 9.x --- ...53\351\200\237\345\205\245\351\227\250.md" | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git "a/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" "b/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" index c1b03e4..e37a9b0 100644 --- "a/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" +++ "b/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" @@ -1,2 +1,64 @@ # SkyWalking 9.x 快速入门 +在 SkyWalking 官网 [下载](https://skywalking.apache.org/downloads/) SkyWalking APM v9.7.0版本以及SkyWalking Java Agent v9.1.0版本,如下图所示: + +![image-20240326232806203](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20240326232806203.png) + + + +```shell +# 创建目录 +mkdir -p /development/programs/skywalking +cd /development/programs/skywalking + +# 下载OAP压缩包 +wget https://dlcdn.apache.org/skywalking/9.7.0/apache-skywalking-apm-9.7.0.tar.gz + +# 解压OAP压缩包 +tar -zxvf apache-skywalking-apm-9.7.0.tar.gz + +# 查看解压后的文件 +ll apache-skywalking-apm-bin -ls + +# 文件介绍 + 0 drwxr-xr-x. 2 root root 241 3月 26 23:33 bin # 执行脚本,例如启动脚本等 + 4 drwxr-xr-x. 12 root root 4096 3月 26 23:33 config # 配置文件夹 + 0 drwxr-xr-x. 2 root root 68 3月 26 23:33 config-examples # 配置案例文件夹 + 44 -rw-r--r--. 1 root root 42077 11月 29 05:04 LICENSE # 许可 + 4 drwxr-xr-x. 3 root root 4096 3月 26 23:33 licenses + 4 -rw-r--r--. 1 root root 1605 11月 29 05:04 LICENSE.tpl + 32 -rwxr-xr-x. 1 root root 30503 11月 29 05:04 NOTICE + 16 drwxr-xr-x. 2 root root 12288 11月 29 05:04 oap-libs # SkyWalking OAP Server + 4 -rw-r--r--. 1 root root 1947 11月 29 05:04 README.txt + 0 drwxr-xr-x. 4 root root 52 3月 26 23:33 tools + 0 drwxr-xr-x. 2 root root 76 3月 26 23:33 webapp # SkyWalking Web UI +208 -rwxr-xr-x. 1 root root 211241 11月 29 05:04 zipkin-LICENSE +``` + +启动SkyWalking OAP Server + +修改配置配置文件 `apache-skywalking-apm-bin/config/application.yml` + +我们这里使用的是 ElasticSearch 作为存储,所以需要修改 `storage.selector` 为 elasticsearch,并设置正确的 elasticsearch 的地址,对应的修改配置如下所示: + +![image-20240326234553841](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20240326234553841.png) + +其实这里不去修改配置文件也是可以的,在环境变量中指定 `SW_STORAGE` 和 `SW_STORAGE_ES_CLUSTER_NODES` 即可。由于我的 elasticsearch 和 SkyWalking OAP Server 部署在一起,所以 clusterNodes 就保持默认即可,也就是 localhost:9200 ,读者可以根据服务部署情况进行正确设置即可。 + +启动命令,进入到apache-skywalking-apm-bin目录下,执行: + +bin/oapService.sh + +logs/skywalking-oap-server.log + +```shell +2024-03-27 23:06:26,520 - com.linecorp.armeria.server.Server - 832 [armeria-boss-http-*:9090] INFO [] - Serving HTTP at /0:0:0:0:0:0:0:0%0:9090 - http://127.0.0.1:9090/ +2024-03-27 23:06:26,577 - com.linecorp.armeria.server.Server - 832 [armeria-boss-http-*:12801] INFO [] - Serving HTTP at /0:0:0:0:0:0:0:0%0:12801 - http://127.0.0.1:12801/ +``` + +web + +```shell +2024-03-27 23:10:29,917 - com.linecorp.armeria.server.Server - 832 [armeria-boss-http-*:8080] INFO [] - Serving HTTP at /0:0:0:0:0:0:0:0%0:8080 - http://127.0.0.1:8080/ +``` + From 9f21c042eb3b5d3346956a84925499d57d309e04 Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 27 Mar 2024 23:19:17 +0800 Subject: [PATCH 59/61] mod: skywalking 9.x --- ...53\351\200\237\345\205\245\351\227\250.md" | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git "a/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" "b/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" index e37a9b0..92098dd 100644 --- "a/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" +++ "b/docs/resources/skywalking/1-1SkyWalking 9.x\345\277\253\351\200\237\345\205\245\351\227\250.md" @@ -1,5 +1,32 @@ # SkyWalking 9.x 快速入门 +下载地址:https://www.elastic.co/cn/downloads/elasticsearch + +```shell +# 创建目录 +mkdir -p /development/programs/elasticsearch +cd /development/programs/elasticsearch +wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.2-linux-x86_64.tar.gz +tar -xvf elasticsearch-8.12.2-linux-x86_64.tar.gz +``` + +![image-20240326130647225](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20240326130647225.png) + +注意,如果你安装的 Elasticsearch 是 8.X 版本,需要关闭 security 安全相关的功能。如下图所示: + +![image-20240326131448213](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20240326131448213.png) + +但是配置文件中并没有安全相关的配置,需要启动后才会出现,所以我们使用命令 `bin/elasticsearch` 前台启动一次(如果你是root用户启动,可能会失败,但是没有关系,第一次启动是为了生成安全相关的配置),然后在停止服务,修改安全相关的配置,修改结果如上图所示。 + +切换到其他用户,然后启动elasticsearch + +sudo -iu itlemon + +如果没有其他用户,可以先创建一个,再切换 + +```shell +bin/elasticsearch -d +``` 在 SkyWalking 官网 [下载](https://skywalking.apache.org/downloads/) SkyWalking APM v9.7.0版本以及SkyWalking Java Agent v9.1.0版本,如下图所示: ![image-20240326232806203](https://codingguide-1256975789.cos.ap-beijing.myqcloud.com/codingguide/img/image-20240326232806203.png) From 5d8e8b0b3e1c2915bb5159dd09acd56fee40624a Mon Sep 17 00:00:00 2001 From: itlemon Date: Wed, 22 May 2024 00:21:28 +0800 Subject: [PATCH 60/61] mod: skywalking 9.x --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 183c5af..58b5c44 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,6 +18,6 @@ features: details: 用心分享每一篇文章,持之以恒热衷分享 - title: 聚焦成长 details: 用心深挖每一个重点,点点滴滴聚焦成长 -footer: 皖ICP备18015590号 | MIT Licensed | Copyright © 2022 kuaishou-itlemon & alibaba-wuwei,All rights reserved. +footer: 皖ICP备2024048423号-1 | MIT Licensed | Copyright © 2022 kuaishou-itlemon & alibaba-wuwei,All rights reserved. footerHtml: true --- \ No newline at end of file From 82f8c1d3a9ed9e4c08b69274e71b429fa12470eb Mon Sep 17 00:00:00 2001 From: itlemon Date: Thu, 23 May 2024 19:08:30 +0800 Subject: [PATCH 61/61] =?UTF-8?q?mod:=20=E6=B7=BB=E5=8A=A0=E5=A4=87?= =?UTF-8?q?=E6=A1=88=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 58b5c44..8a2a80b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,6 +18,6 @@ features: details: 用心分享每一篇文章,持之以恒热衷分享 - title: 聚焦成长 details: 用心深挖每一个重点,点点滴滴聚焦成长 -footer: 皖ICP备2024048423号-1 | MIT Licensed | Copyright © 2022 kuaishou-itlemon & alibaba-wuwei,All rights reserved. +footer: 冀公网安备13068402000305 | 皖ICP备2024048423号-1 | MIT Licensed | Copyright © 2022 kuaishou-itlemon & alibaba-wuwei,All rights reserved. footerHtml: true --- \ No newline at end of file