diff --git a/404.html b/404.html new file mode 100644 index 000000000..0bc0fff73 --- /dev/null +++ b/404.html @@ -0,0 +1,23 @@ + + + + + + 404 | Twikoo 文档 + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..fe1afcc6f --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +twikoo.js.org diff --git a/QQ_API.html b/QQ_API.html new file mode 100644 index 000000000..d314caefa --- /dev/null +++ b/QQ_API.html @@ -0,0 +1,121 @@ + + + + + + QQ私有化部署文档 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

QQ私有化部署文档

1. 下载go-cq

前往go-cqhttp release下载对应系统版本。

2. 配置服务

解压

Windows下请使用自己熟悉的解压软件自行解压

Linux下在命令行中输入tar -xzvf [文件名] 使用

Windows 标准方法

双击,根据提示生成运行脚本go-cqhttp_*.exe

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置文件请参考下方config.yml

config.yml配置好后 再次双击运行脚本

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

Linux 标准方法

通过 SSH 连接到服务器

cd到解压目录

输入 , 运行 ./go-cqhttp

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置config.yml

yaml

+# go-cqhttp 默认配置文件
+
+account: # 账号相关
+  uin:  # QQ账号
+  password: '' # 密码为空时使用扫码登录
+  encrypt: false  # 是否开启密码加密
+  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
+  relogin: # 重连设置
+    delay: 3   # 首次重连延迟, 单位秒
+    interval: 3   # 重连间隔
+    max-times: 0  # 最大重连次数, 0为无限制
+
+  # 是否使用服务器下发的新地址进行重连
+  # 注意, 此设置可能导致在海外服务器上连接情况更差
+  use-sso-address: true
+
+heartbeat:
+  # 心跳频率, 单位秒
+  # -1 为关闭心跳
+  interval: 5
+
+message:
+  # 上报数据类型
+  # 可选: string,array
+  post-format: string
+  # 是否忽略无效的CQ码, 如果为假将原样发送
+  ignore-invalid-cqcode: false
+  # 是否强制分片发送消息
+  # 分片发送将会带来更快的速度
+  # 但是兼容性会有些问题
+  force-fragment: false
+  # 是否将url分片发送
+  fix-url: false
+  # 下载图片等请求网络代理
+  proxy-rewrite: ''
+  # 是否上报自身消息
+  report-self-message: false
+  # 移除服务端的Reply附带的At
+  remove-reply-at: false
+  # 为Reply附加更多信息
+  extra-reply-data: false
+
+output:
+  # 日志等级 trace,debug,info,warn,error
+  log-level: warn
+  # 是否启用 DEBUG
+  debug: false # 开启调试模式
+
+# 默认中间件锚点
+default-middlewares: &default
+  # 访问密钥, 强烈推荐在公网的服务器设置
+  access-token: ''
+  # 事件过滤器文件目录
+  filter: ''
+  # API限速设置
+  # 该设置为全局生效
+  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
+  # 目前该限速设置为令牌桶算法, 请参考:
+  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
+  rate-limit:
+    enabled: true # 是否启用限速
+    frequency: 1  # 令牌回复频率, 单位秒
+    bucket: 1     # 令牌桶大小
+
+database: # 数据库相关设置
+  leveldb:
+    # 是否启用内置leveldb数据库
+    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
+    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
+    enable: true
+
+# 连接服务列表
+servers:
+  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
+  #- http: # http 通信
+  #- ws:   # 正向 Websocket
+  #- ws-reverse: # 反向 Websocket
+  #- pprof: #性能分析服务器
+  # HTTP 通信设置
+  - http:
+      # 服务端监听地址
+      host: 127.0.0.1
+      # 服务端监听端口
+      port: 5700
+      # 反向HTTP超时时间, 单位秒
+      # 最小值为5,小于5将会忽略本项设置
+      timeout: 5
+      middlewares:
+        <<: *default # 引用默认中间件
+      # 反向HTTP POST地址列表
+      post:
+      #- url: '' # 地址
+      #  secret: ''           # 密钥
+      #- url: 127.0.0.1:5701 # 地址
+      #  secret: ''          # 密钥

再次运行./go-cqhttp

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

注意:将你配置的端口号在防火墙里面放行或者使用反向代理将你设置的端口绑定到域名

注意:公网使用一定要配置token

3. twikoo配置

在twikoo中QQ私有化API配置项填写如下内容

QQ号 http://你的IP地址:端口号(或者域名)/send_private_msg?user_id=QQ号?token=你配置的token

QQ群 http://你的IP地址:端口号(或者域名)/send_group_msg?token=你配置的token?group_id=群号

配置完成

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/api.html b/api.html new file mode 100644 index 000000000..1c340ccb3 --- /dev/null +++ b/api.html @@ -0,0 +1,85 @@ + + + + + + API 文档 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

API 文档

通过 Twikoo API,主题开发者可以实现一些特殊的功能,例如:在文章列表显示文章评论数,在首页显示最新评论,等。

调用 Twikoo API 前,不需要 执行 twikoo.init()

Get comments count

批量获取文章评论数。

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 不包含协议、域名、参数的文章路径列表,必传参数
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // 评论数是否包括回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回示例: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

Get recent comments

获取最新评论。

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 要求云函数版本 >= 1.6.27。不包含协议、域名、参数的文章路径列表,不传默认获取所有最新评论
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  pageSize: 10, // 获取多少条,默认:10,最大:100
+  includeReply: false // 是否包括最新回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回 Array,包含最新评论的
+  //   * id:           评论 ID
+  //   * url:          评论地址
+  //   * nick:         昵称
+  //   * mailMd5:      邮箱的 MD5 值,可用于展示头像
+  //   * link:         网址
+  //   * comment:      HTML 格式的评论内容
+  //   * commentText:  纯文本格式的评论内容
+  //   * created:      评论时间,格式为毫秒级时间戳
+  //   * avatar:       头像地址(0.2.9 新增)
+  //   * relativeTime: 相对评论时间,如 “1 小时前”(0.2.9 新增)
+  // 返回示例: [ // 从新到旧顺序
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

On Twikoo loaded

Twikoo 成功挂载后的回调函数。
环境 ID 错误、网络异常、挂载失败等情况时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo 加载完成');
+});

On comment loaded

评论加载成功后的回调函数。
发表评论后自动刷新评论时、加载下一页评论时,也会触发。
评论加载失败时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('评论加载完成');
+  }
+});

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/assets/QQ_API.md.CjBeVHHO.js b/assets/QQ_API.md.CjBeVHHO.js new file mode 100644 index 000000000..e91a7c8e7 --- /dev/null +++ b/assets/QQ_API.md.CjBeVHHO.js @@ -0,0 +1,96 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.aNBt3w9_.js";const c=JSON.parse('{"title":"QQ私有化部署文档","description":"","frontmatter":{},"headers":[],"relativePath":"QQ_API.md","filePath":"QQ_API.md","lastUpdated":null}'),l={name:"QQ_API.md"},p=n(`

QQ私有化部署文档

1. 下载go-cq

前往go-cqhttp release下载对应系统版本。

2. 配置服务

解压

Windows下请使用自己熟悉的解压软件自行解压

Linux下在命令行中输入tar -xzvf [文件名] 使用

Windows 标准方法

双击,根据提示生成运行脚本go-cqhttp_*.exe

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置文件请参考下方config.yml

config.yml配置好后 再次双击运行脚本

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

Linux 标准方法

通过 SSH 连接到服务器

cd到解压目录

输入 , 运行 ./go-cqhttp

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置config.yml

yaml

+# go-cqhttp 默认配置文件
+
+account: # 账号相关
+  uin:  # QQ账号
+  password: '' # 密码为空时使用扫码登录
+  encrypt: false  # 是否开启密码加密
+  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
+  relogin: # 重连设置
+    delay: 3   # 首次重连延迟, 单位秒
+    interval: 3   # 重连间隔
+    max-times: 0  # 最大重连次数, 0为无限制
+
+  # 是否使用服务器下发的新地址进行重连
+  # 注意, 此设置可能导致在海外服务器上连接情况更差
+  use-sso-address: true
+
+heartbeat:
+  # 心跳频率, 单位秒
+  # -1 为关闭心跳
+  interval: 5
+
+message:
+  # 上报数据类型
+  # 可选: string,array
+  post-format: string
+  # 是否忽略无效的CQ码, 如果为假将原样发送
+  ignore-invalid-cqcode: false
+  # 是否强制分片发送消息
+  # 分片发送将会带来更快的速度
+  # 但是兼容性会有些问题
+  force-fragment: false
+  # 是否将url分片发送
+  fix-url: false
+  # 下载图片等请求网络代理
+  proxy-rewrite: ''
+  # 是否上报自身消息
+  report-self-message: false
+  # 移除服务端的Reply附带的At
+  remove-reply-at: false
+  # 为Reply附加更多信息
+  extra-reply-data: false
+
+output:
+  # 日志等级 trace,debug,info,warn,error
+  log-level: warn
+  # 是否启用 DEBUG
+  debug: false # 开启调试模式
+
+# 默认中间件锚点
+default-middlewares: &default
+  # 访问密钥, 强烈推荐在公网的服务器设置
+  access-token: ''
+  # 事件过滤器文件目录
+  filter: ''
+  # API限速设置
+  # 该设置为全局生效
+  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
+  # 目前该限速设置为令牌桶算法, 请参考:
+  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
+  rate-limit:
+    enabled: true # 是否启用限速
+    frequency: 1  # 令牌回复频率, 单位秒
+    bucket: 1     # 令牌桶大小
+
+database: # 数据库相关设置
+  leveldb:
+    # 是否启用内置leveldb数据库
+    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
+    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
+    enable: true
+
+# 连接服务列表
+servers:
+  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
+  #- http: # http 通信
+  #- ws:   # 正向 Websocket
+  #- ws-reverse: # 反向 Websocket
+  #- pprof: #性能分析服务器
+  # HTTP 通信设置
+  - http:
+      # 服务端监听地址
+      host: 127.0.0.1
+      # 服务端监听端口
+      port: 5700
+      # 反向HTTP超时时间, 单位秒
+      # 最小值为5,小于5将会忽略本项设置
+      timeout: 5
+      middlewares:
+        <<: *default # 引用默认中间件
+      # 反向HTTP POST地址列表
+      post:
+      #- url: '' # 地址
+      #  secret: ''           # 密钥
+      #- url: 127.0.0.1:5701 # 地址
+      #  secret: ''          # 密钥

再次运行./go-cqhttp

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

注意:将你配置的端口号在防火墙里面放行或者使用反向代理将你设置的端口绑定到域名

注意:公网使用一定要配置token

3. twikoo配置

在twikoo中QQ私有化API配置项填写如下内容

QQ号 http://你的IP地址:端口号(或者域名)/send_private_msg?user_id=QQ号?token=你配置的token

QQ群 http://你的IP地址:端口号(或者域名)/send_group_msg?token=你配置的token?group_id=群号

配置完成

`,33),h=[p];function k(t,e,r,d,E,g){return a(),i("div",null,h)}const A=s(l,[["render",k]]);export{c as __pageData,A as default}; diff --git a/assets/QQ_API.md.CjBeVHHO.lean.js b/assets/QQ_API.md.CjBeVHHO.lean.js new file mode 100644 index 000000000..7297b4952 --- /dev/null +++ b/assets/QQ_API.md.CjBeVHHO.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.aNBt3w9_.js";const c=JSON.parse('{"title":"QQ私有化部署文档","description":"","frontmatter":{},"headers":[],"relativePath":"QQ_API.md","filePath":"QQ_API.md","lastUpdated":null}'),l={name:"QQ_API.md"},p=n("",33),h=[p];function k(t,e,r,d,E,g){return a(),i("div",null,h)}const A=s(l,[["render",k]]);export{c as __pageData,A as default}; diff --git a/assets/api.md.BDdCdCq-.js b/assets/api.md.BDdCdCq-.js new file mode 100644 index 000000000..5915dba76 --- /dev/null +++ b/assets/api.md.BDdCdCq-.js @@ -0,0 +1,60 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.aNBt3w9_.js";const g=JSON.parse('{"title":"API 文档","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),l={name:"api.md"},h=n(`

API 文档

通过 Twikoo API,主题开发者可以实现一些特殊的功能,例如:在文章列表显示文章评论数,在首页显示最新评论,等。

调用 Twikoo API 前,不需要 执行 twikoo.init()

Get comments count

批量获取文章评论数。

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 不包含协议、域名、参数的文章路径列表,必传参数
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // 评论数是否包括回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回示例: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

Get recent comments

获取最新评论。

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 要求云函数版本 >= 1.6.27。不包含协议、域名、参数的文章路径列表,不传默认获取所有最新评论
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  pageSize: 10, // 获取多少条,默认:10,最大:100
+  includeReply: false // 是否包括最新回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回 Array,包含最新评论的
+  //   * id:           评论 ID
+  //   * url:          评论地址
+  //   * nick:         昵称
+  //   * mailMd5:      邮箱的 MD5 值,可用于展示头像
+  //   * link:         网址
+  //   * comment:      HTML 格式的评论内容
+  //   * commentText:  纯文本格式的评论内容
+  //   * created:      评论时间,格式为毫秒级时间戳
+  //   * avatar:       头像地址(0.2.9 新增)
+  //   * relativeTime: 相对评论时间,如 “1 小时前”(0.2.9 新增)
+  // 返回示例: [ // 从新到旧顺序
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

On Twikoo loaded

Twikoo 成功挂载后的回调函数。
环境 ID 错误、网络异常、挂载失败等情况时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo 加载完成');
+});

On comment loaded

评论加载成功后的回调函数。
发表评论后自动刷新评论时、加载下一页评论时,也会触发。
评论加载失败时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('评论加载完成');
+  }
+});
`,27),e=[h];function t(p,k,r,E,d,o){return a(),i("div",null,e)}const y=s(l,[["render",t]]);export{g as __pageData,y as default}; diff --git a/assets/api.md.BDdCdCq-.lean.js b/assets/api.md.BDdCdCq-.lean.js new file mode 100644 index 000000000..15b22d26f --- /dev/null +++ b/assets/api.md.BDdCdCq-.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.aNBt3w9_.js";const g=JSON.parse('{"title":"API 文档","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),l={name:"api.md"},h=n("",27),e=[h];function t(p,k,r,E,d,o){return a(),i("div",null,e)}const y=s(l,[["render",t]]);export{g as __pageData,y as default}; diff --git a/assets/app.BdsoSdps.js b/assets/app.BdsoSdps.js new file mode 100644 index 000000000..87d9710e6 --- /dev/null +++ b/assets/app.BdsoSdps.js @@ -0,0 +1 @@ +import{U as o,a6 as p,a7 as u,a8 as l,a9 as c,aa as f,ab as d,ac as m,ad as h,ae as g,af as A,d as P,u as v,y,x as w,ag as C,ah as R,ai as b,aj as E}from"./chunks/framework.aNBt3w9_.js";import{R as S}from"./chunks/theme.Bngo81ar.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(S),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=v();return y(()=>{w(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&C(),R(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function _(){globalThis.__VITEPRESS__=!0;const e=x(),a=j();a.provide(u,e);const t=l(e.route);return a.provide(c,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function j(){return h(T)}function x(){let e=o,a;return g(t=>{let n=A(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&_().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{_ as createApp}; diff --git a/assets/backend.md.DigxkCdm.js b/assets/backend.md.DigxkCdm.js new file mode 100644 index 000000000..fd9871fa2 --- /dev/null +++ b/assets/backend.md.DigxkCdm.js @@ -0,0 +1,17 @@ +import{_ as e,c as i,o as t,a5 as a}from"./chunks/framework.aNBt3w9_.js";const s="/assets/vercel-1.Czytea8u.png",l="/assets/netlify-1.CBH5jdAK.png",o="/assets/netlify-2.CoU6-6Qj.png",n="/assets/netlify-3.BRAuDkNv.png",r="/assets/netlify-4.BPwUhUpI.png",d="/assets/netlify-5.BSv5GDZV.png",c="/assets/hugging-1.qykHscdz.png",p="/assets/hugging-2.BZLt3AFG.png",h="/assets/hugging-3.BE7bV_x9.png",k="/assets/hugging-4.IZDT8YRp.png",g="/assets/hugging-5.Cw4bsoD7.png",u="/assets/hugging-6.CxsVPwFh.png",b="/assets/hugging-7.ey7RVDUh.png",m="/assets/hugging-8.bn1zLPri.png",f="/assets/hugging-9.BfxLMyMQ.png",x=JSON.parse('{"title":"云函数部署","description":"","frontmatter":{},"headers":[],"relativePath":"backend.md","filePath":"backend.md","lastUpdated":null}'),y={name:"backend.md"},E=a(`

云函数部署

部署方式
推荐度描述
腾讯云一键部署★☆☆☆☆虽然方便,但是仅支持按量计费环境——也就是说,一键部署的环境,当免费资源用尽后,将会产生费用。且按量计费环境无法切换为包年包月环境。免费额度数据库读操作数只有 500 次 / 天,无法支撑 Twikoo 的运行需求
腾讯云手动部署★★☆☆☆手动部署到腾讯云云开发环境,在中国大陆访问速度较快。需要付费购买环境才能部署。
腾讯云命令行部署★☆☆☆☆仅针对有 Node.js 经验的开发者。
Vercel 部署★★★☆☆适用于想要免费部署的用户,在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度。
Railway 部署★★☆☆☆有免费额度但不足以支持一个月连续运行,部署简单,适合全球访问。
Zeabur 部署★☆☆☆☆需要绑定支付宝或信用卡,部署简单,适合中国大陆访问,免费计划环境随时可能会被删除。
Netlify 部署★★★★☆有充足的免费额度,中国大陆访问速度不错。
Hugging Face 部署★★★★☆免费,中国大陆访问速度不错。允许通过 Cloudflare Tunnels 自定义域名。
AWS Lambda 部署★★★☆☆全球最大的云平台,适合已经使用 AWS 全家桶的用户。
Cloudflare workers 部署★★☆☆☆部署需使用命令行,冷启动时间较短,功能有部分限制。
私有部署★★☆☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。
私有部署 (Docker)★★★☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。

腾讯云一键部署

  1. 点击以下按钮将 Twikoo 一键部署到云开发
    部署到云开发
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”

腾讯云手动部署

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐,点击“立即购买”,按提示创建好环境。

提示

  1. 进入云开发控制台
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  4. 进入环境-云函数,点击“新建云函数”
  5. 函数名称请填写:twikoo,创建方式请选择:空白函数,运行环境请选择:Nodejs 16.13,函数内存请选择:128MB,点击“下一步”
  6. 清空输入框中的示例代码,复制以下代码、粘贴到“函数代码”输入框中,点击“确定”
js
exports.main = require('twikoo-func').main
  1. 创建完成后,点击“twikoo"进入云函数详情页,进入“函数代码”标签,点击“文件 - 新建文件”,输入 package.json,回车
  2. 复制以下代码、粘贴到代码框中,点击“保存并安装依赖”
json
{ "dependencies": { "twikoo-func": "1.6.38" } }

腾讯云命令行部署

注意

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐(一般 0 元套餐即可),点击“立即购买”,按提示创建好环境。
  2. 进入云开发控制台
  3. 进入环境-登录授权,启用“匿名登录”
  4. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  5. 克隆本仓库
sh
git clone https://github.com/twikoojs/twikoo.git # 或 git clone https://e.coding.net/imaegoo/twikoo/twikoo.git
+cd twikoo

如果您没有安装 Git,也可以从 Release 页面下载最新的 Source code
如果您所在的地区访问 Github 速度慢,也可以尝试另一个仓库地址:https://imaegoo.coding.net/public/twikoo/twikoo/git

  1. 安装依赖项
sh
npm install -g yarn # 已安装 yarn 可以跳过此步
+yarn install
  1. 授权云开发环境(此命令会弹出浏览器要求授权,需在有图形界面的系统下进行)
sh
yarn run login
  1. 自动部署
sh
yarn deploy -e 您的环境id

Vercel 部署

注意

Vercel 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

默认域名 *.vercel.app 在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度

查看视频教程

  1. 申请 MongoDB Atlas 账号,获取 MongoDB 连接字符串
  2. 申请 Vercel 账号
  3. 点击以下按钮将 Twikoo 一键部署到 Vercel

Deploy

  1. 进入 Settings - Environment Variables,添加环境变量 MONGODB_URI,值为前面记录的数据库连接字符串
  2. 进入 Settings - Deployment Protection,设置 Vercel Authentication 为 Disabled,并 Save

  1. 进入 Deployments , 然后在任意一项后面点击更多(三个点) , 然后点击 Redeploy , 最后点击下面的 Redeploy
  2. 进入 Overview,点击 Domains 下方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示
  3. Vercel Domains(包含 https:// 前缀,例如 https://xxx.vercel.app)即为您的环境 id

Railway 部署

注意

Railway 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Railway 申请并登录账号,点击 New Project - Provision MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Railway 点击 New - GitHub Repo - Configure GitHub App - 授权 GitHub - 选择刚才 fork 的仓库,等待部署完成
  4. 点开环境卡片 - Variables - New Variable,左边输入 PORT 右边输入 8080 然后点 Add
  5. 同样地,添加 MongoDB 相关环境变量 - New Variable - Add Reference - MONGO* - Add,重复步骤以添加 MONGOHOSTMONGOPASSWORDMONGOPORTMONGOUSERMONGO_URL 环境变量。
  6. 点开环境卡片 - Settings - Environment - Domains,绑定一个域名(例如 mytwikoo.up.railway.app
  7. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.up.railway.app

Zeabur 部署

注意

Zeabur 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Zeabur 申请并登录账号,点击部署新服务 - 部署其他服务 - 部署 MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Zeabur 点击部署新服务 - 部署你的源代码 - 授权 GitHub - 选择刚才 fork 的仓库,名称随意

无需配置数据库连接字符串! Zeabur 已自动配置

  1. 部署好后点开环境卡片 - 设置 - 域名,绑定一个域名(例如 mytwikoo.zeabur.app
  2. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.zeabur.app

Netlify 部署

注意

Netlify 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

Netlify 免费等级(Functions Level 0)支持每月 125,000 请求次数和 100 小时函数计算时长

  1. 申请 MongoDB Atlas 账号,获取 MongoDB 连接字符串
  2. 申请并登录 Netlify 账号,创建一个 Team
  3. 打开 twikoojs/twikoo-netlify 点击 fork 将仓库 fork 到自己的账号下
  4. 回到 Netlify,点击 Add new site - Import an existing project

  1. 点击 Deploy with GitHub,如果未授权 GitHub 账号,先授权,然后选择前面 fork 的 twikoo-netlify 项目

  1. 点击 Add environment variables - New variable,Key 输入 MONGODB_URI,Value 输入前面记录的数据库连接字符串,点击 Deploy twikoo-netlify

  1. 部署完成后,点击 Domain settings - 右侧 Options - Edit site name,可以设置属于自己的三级域名(https://xxx.netlify.app

  1. 进入 Site overview,点击上方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示

  1. 云函数地址(包含 https:// 前缀和 /.netlify/functions/twikoo 后缀,例如 https://xxx.netlify.app/.netlify/functions/twikoo)即为您的环境 id

Hugging Face 部署

  1. 申请 MongoDB Atlas 账号,获取 MongoDB 连接字符串
  2. 申请 Hugging Face 账号
  3. 登录,点击 Spaces - Create new Space

  1. 输入 Space name,Select the Space SDK 选择 Docker,Choose a Docker template 选择 Blank,Space hardware 选择 FREE,选择 Public,点击 Create Space

  1. 进入刚刚创建的 Space,点击页面上方的 Settings,滚动到 Variables and secrets 部分,点击 New secret,Name 输入 MONGODB_URI,Value 输入前面记录的数据库连接字符串,点击 Save

  1. 点击页面上方的 Files - Add file - Create a new file

  1. 在 Name your file 中输入 Dockerfile,在 Edit 区域输入以下内容
Dockerfile
FROM imaegoo/twikoo
+ENV TWIKOO_PORT 7860
+EXPOSE 7860

  1. 点击 Commit new file to main
  2. 点击右上角 Settings 右方的菜单(三个点)图标 - Embed this Space,Direct URL 下的内容(例如 https://xxx-xxx.hf.space)即为您的环境 id

如果你需要自定义域名

自定义域名教程由 Hoshino-Yumetsuki 提供

ps:除了 CF_ZERO_TRUST_TOKEN 这个环境变量以外,其他环境变量的配置方式与上一步相同

  1. 申请 Cloudflare Zero Trust,关于申请方式请自行查找

  1. 添加一条隧道,连接方式选择 Cloudflared,名称任意

  1. 添加一个 Public Hostname,回源选择 HTTP,端口选择 8080
  2. Clone Twikoo 仓库,找到 src\\server\\hf-space
  3. 去 Hugging Face 创建一个 Space,然后 Clone 下来,将 hf-space 文件夹内的所有内容复制进去
  4. 在 Hugging Face Space 的设置中添加一个环境变量,变量名 CF_ZERO_TRUST_TOKEN,值是 Tunnels 给的令牌(删掉 cloudflared.exe service install,只保留令牌部分)

  1. Push 到 Hugging Face Space 仓库

AWS Lambda 部署

  1. 注册 AWS 账号并配置 Terraform CLI。
  2. 如需使用托管的 MongoDB 数据库,可申请 MongoDB Atlas 账号。
  3. 参考 src/server/aws-lambda/terraform 目录中 Terraform 代码创建 AWS 资源。
  4. 部署完成后,Terraform 会将 lambda_function_url 打印在屏幕上,您也可以使用 terraform output 获取这一 URL,如:
$ terraform output
+lambda_function_url = "https://axtoiiithbcexamplegq7ozalu0cnkii.lambda-url.us-west-2.on.aws/"

该 URL 即为您的环境 ID,请记下这一 URL 用于前端配置。

Cloudflare workers 部署

请参考 github.com/twikoojs/twikoo-cloudflare

私有部署

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署对服务器系统没有要求,Windows、Ubuntu、CentOS、macOS 等常用系统均支持。

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

  1. 服务端下载安装 Node.js
  2. 安装 Twikoo server: npm i -g tkserver
  3. 根据需要配置环境变量,所有的环境变量都是可选的
名称描述默认值
MONGODB_URIMongoDB 数据库连接字符串,不传则使用 lokijsnull
MONGO_URLMongoDB 数据库连接字符串,不传则使用 lokijsnull
TWIKOO_DATAlokijs 数据库存储路径./data
TWIKOO_PORT端口号8080
TWIKOO_THROTTLEIP 请求限流,当同一 IP 短时间内请求次数超过阈值将对该 IP 返回错误250
TWIKOO_LOCALHOST_ONLYtrue时只监听本地请求,使得 nginx 等服务器反代之后不暴露原始端口null
TWIKOO_LOG_LEVEL日志级别,支持 verbose / info / warn / errorinfo
TWIKOO_IP_HEADERS在一些特殊情况下使用,如使用了CloudFlare CDN 它会将请求 IP 写到请求头的 cf-connecting-ip 字段上,为了能够正确的获取请求 IP 你可以写成 ['headers.cf-connecting-ip'][]
  1. 启动 Twikoo server: tkserver
  2. 访问 http://服务端IP:8080 测试服务是否启动成功
  3. 配置前置代理实现 HTTPS 访问(可以用 Nginx、负载均衡或 Cloudflare 等)
  4. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://twikoo.yourdomain.com

提示

  1. Linux 服务器可以用 nohup tkserver >> tkserver.log 2>&1 & 命令后台启动
  2. 数据默认在 data 目录,请注意定期备份数据
  3. 默认端口为8080,自定义端口使用可使用 TWIKOO_PORT=1234 tkserver 启动。
  4. 配置systemctl服务配合TWIKOO_PORT=1234 tkserver设置开机启动

私有部署 (Docker)

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

Docker

sh
docker run --name twikoo -e TWIKOO_THROTTLE=1000 -p 8080:8080 -v \${PWD}/data:/app/data -d imaegoo/twikoo

Docker Compose

yml
version: '3'
+services:
+  twikoo:
+    image: imaegoo/twikoo
+    container_name: twikoo
+    restart: unless-stopped
+    ports:
+      - 8080:8080
+    environment:
+      TWIKOO_THROTTLE: 1000
+    volumes:
+      - ./data:/app/data
`,94),F=[E];function v(w,_,C,B,D,O){return t(),i("div",null,F)}const q=e(y,[["render",v]]);export{x as __pageData,q as default}; diff --git a/assets/backend.md.DigxkCdm.lean.js b/assets/backend.md.DigxkCdm.lean.js new file mode 100644 index 000000000..eea4ac8a1 --- /dev/null +++ b/assets/backend.md.DigxkCdm.lean.js @@ -0,0 +1 @@ +import{_ as e,c as i,o as t,a5 as a}from"./chunks/framework.aNBt3w9_.js";const s="/assets/vercel-1.Czytea8u.png",l="/assets/netlify-1.CBH5jdAK.png",o="/assets/netlify-2.CoU6-6Qj.png",n="/assets/netlify-3.BRAuDkNv.png",r="/assets/netlify-4.BPwUhUpI.png",d="/assets/netlify-5.BSv5GDZV.png",c="/assets/hugging-1.qykHscdz.png",p="/assets/hugging-2.BZLt3AFG.png",h="/assets/hugging-3.BE7bV_x9.png",k="/assets/hugging-4.IZDT8YRp.png",g="/assets/hugging-5.Cw4bsoD7.png",u="/assets/hugging-6.CxsVPwFh.png",b="/assets/hugging-7.ey7RVDUh.png",m="/assets/hugging-8.bn1zLPri.png",f="/assets/hugging-9.BfxLMyMQ.png",x=JSON.parse('{"title":"云函数部署","description":"","frontmatter":{},"headers":[],"relativePath":"backend.md","filePath":"backend.md","lastUpdated":null}'),y={name:"backend.md"},E=a("",94),F=[E];function v(w,_,C,B,D,O){return t(),i("div",null,F)}const q=e(y,[["render",v]]);export{x as __pageData,q as default}; diff --git a/assets/chunks/VPAlgoliaSearchBox.5FrsXTx7.js b/assets/chunks/VPAlgoliaSearchBox.5FrsXTx7.js new file mode 100644 index 000000000..85161dba8 --- /dev/null +++ b/assets/chunks/VPAlgoliaSearchBox.5FrsXTx7.js @@ -0,0 +1,17 @@ +import{d as mo,a4 as po,L as vo,y as ho,v as yo,R as go,o as bo,c as _o}from"./framework.aNBt3w9_.js";import{u as Oo}from"./theme.Bngo81ar.js";/*! @docsearch/js 3.6.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */function lr(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),r.push.apply(r,n)}return r}function I(t){for(var e=1;e=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function se(t,e){return function(r){if(Array.isArray(r))return r}(t)||function(r,n){var o=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(o!=null){var i,a,c=[],u=!0,s=!1;try{for(o=o.call(r);!(u=(i=o.next()).done)&&(c.push(i.value),!n||c.length!==n);u=!0);}catch(l){s=!0,a=l}finally{try{u||o.return==null||o.return()}finally{if(s)throw a}}return c}}(t,e)||_n(t,e)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function ft(t){return function(e){if(Array.isArray(e))return qt(e)}(t)||function(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}(t)||_n(t)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function _n(t,e){if(t){if(typeof t=="string")return qt(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set"?Array.from(t):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?qt(t,e):void 0}}function qt(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r3)for(r=[r],i=3;i0?Ie(v.type,v.props,v.key,null,v.__v):v)!=null){if(v.__=r,v.__b=r.__b+1,(p=b[l])===null||p&&v.key==p.key&&v.type===p.type)b[l]=void 0;else for(m=0;m<_;m++){if((p=b[m])&&v.key==p.key&&v.type===p.type){b[m]=void 0;break}p=null}Yt(t,v,p=p||mt,o,i,a,c,u,s),d=v.__e,(m=v.ref)&&p.ref!=m&&(y||(y=[]),p.ref&&y.push(p.ref,null,v),y.push(m,v.__c||d,v)),d!=null?(h==null&&(h=d),typeof v.type=="function"&&v.__k!=null&&v.__k===p.__k?v.__d=u=Pn(v,u,t):u=In(t,v,p,b,d,u),s||r.type!=="option"?typeof r.type=="function"&&(r.__d=u):t.value=""):u&&p.__e==u&&u.parentNode!=t&&(u=Ke(p))}for(r.__e=h,l=_;l--;)b[l]!=null&&(typeof r.type=="function"&&b[l].__e!=null&&b[l].__e==r.__d&&(r.__d=Ke(n,l+1)),An(b[l],b[l]));if(y)for(l=0;l3)for(r=[r],i=3;i=r.__.length&&r.__.push({}),r.__[t]}function Gt(t){return pe=1,xn(Nn,t)}function xn(t,e,r){var n=Je(de++,2);return n.t=t,n.__c||(n.__=[r?r(e):Nn(void 0,e),function(o){var i=n.t(n.__[0],o);n.__[0]!==i&&(n.__=[i,n.__[1]],n.__c.setState({}))}],n.__c=L),n.__}function Xt(t,e){var r=Je(de++,3);!w.__s&&er(r.__H,e)&&(r.__=t,r.__H=e,L.__H.__h.push(r))}function _r(t,e){var r=Je(de++,4);!w.__s&&er(r.__H,e)&&(r.__=t,r.__H=e,L.__h.push(r))}function Pt(t,e){var r=Je(de++,7);return er(r.__H,e)&&(r.__=t(),r.__H=e,r.__h=t),r.__}function ko(){Ht.forEach(function(t){if(t.__P)try{t.__H.__h.forEach(ut),t.__H.__h.forEach(Ut),t.__H.__h=[]}catch(e){t.__H.__h=[],w.__e(e,t.__v)}}),Ht=[]}w.__b=function(t){L=null,dr&&dr(t)},w.__r=function(t){hr&&hr(t),de=0;var e=(L=t.__c).__H;e&&(e.__h.forEach(ut),e.__h.forEach(Ut),e.__h=[])},w.diffed=function(t){yr&&yr(t);var e=t.__c;e&&e.__H&&e.__H.__h.length&&(Ht.push(e)!==1&&vr===w.requestAnimationFrame||((vr=w.requestAnimationFrame)||function(r){var n,o=function(){clearTimeout(i),Or&&cancelAnimationFrame(n),setTimeout(r)},i=setTimeout(o,100);Or&&(n=requestAnimationFrame(o))})(ko)),L=void 0},w.__c=function(t,e){e.some(function(r){try{r.__h.forEach(ut),r.__h=r.__h.filter(function(n){return!n.__||Ut(n)})}catch(n){e.some(function(o){o.__h&&(o.__h=[])}),e=[],w.__e(n,r.__v)}}),gr&&gr(t,e)},w.unmount=function(t){br&&br(t);var e=t.__c;if(e&&e.__H)try{e.__H.__.forEach(ut)}catch(r){w.__e(r,e.__v)}};var Or=typeof requestAnimationFrame=="function";function ut(t){var e=L;typeof t.__c=="function"&&t.__c(),L=e}function Ut(t){var e=L;t.__c=t.__(),L=e}function er(t,e){return!t||t.length!==e.length||e.some(function(r,n){return r!==t[n]})}function Nn(t,e){return typeof e=="function"?e(t):e}function Tn(t,e){for(var r in e)t[r]=e[r];return t}function Ft(t,e){for(var r in t)if(r!=="__source"&&!(r in e))return!0;for(var n in e)if(n!=="__source"&&t[n]!==e[n])return!0;return!1}function Bt(t){this.props=t}(Bt.prototype=new W).isPureReactComponent=!0,Bt.prototype.shouldComponentUpdate=function(t,e){return Ft(this.props,t)||Ft(this.state,e)};var Sr=w.__b;w.__b=function(t){t.type&&t.type.__f&&t.ref&&(t.props.ref=t.ref,t.ref=null),Sr&&Sr(t)};var Do=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911,wr=function(t,e){return t==null?null:$($(t).map(e))},Ao={map:wr,forEach:wr,count:function(t){return t?$(t).length:0},only:function(t){var e=$(t);if(e.length!==1)throw"Children.only";return e[0]},toArray:$},Co=w.__e;function ct(){this.__u=0,this.t=null,this.__b=null}function Rn(t){var e=t.__.__c;return e&&e.__e&&e.__e(t)}function je(){this.u=null,this.o=null}w.__e=function(t,e,r){if(t.then){for(var n,o=e;o=o.__;)if((n=o.__c)&&n.__c)return e.__e==null&&(e.__e=r.__e,e.__k=r.__k),n.__c(t,e)}Co(t,e,r)},(ct.prototype=new W).__c=function(t,e){var r=e.__c,n=this;n.t==null&&(n.t=[]),n.t.push(r);var o=Rn(n.__v),i=!1,a=function(){i||(i=!0,r.componentWillUnmount=r.__c,o?o(c):c())};r.__c=r.componentWillUnmount,r.componentWillUnmount=function(){a(),r.__c&&r.__c()};var c=function(){if(!--n.__u){if(n.state.__e){var s=n.state.__e;n.__v.__k[0]=function m(p,v,d){return p&&(p.__v=null,p.__k=p.__k&&p.__k.map(function(h){return m(h,v,d)}),p.__c&&p.__c.__P===v&&(p.__e&&d.insertBefore(p.__e,p.__d),p.__c.__e=!0,p.__c.__P=d)),p}(s,s.__c.__P,s.__c.__O)}var l;for(n.setState({__e:n.__b=null});l=n.t.pop();)l.forceUpdate()}},u=e.__h===!0;n.__u++||u||n.setState({__e:n.__b=n.__v.__k[0]}),t.then(a,a)},ct.prototype.componentWillUnmount=function(){this.t=[]},ct.prototype.render=function(t,e){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),n=this.__v.__k[0].__c;this.__v.__k[0]=function i(a,c,u){return a&&(a.__c&&a.__c.__H&&(a.__c.__H.__.forEach(function(s){typeof s.__c=="function"&&s.__c()}),a.__c.__H=null),(a=Tn({},a)).__c!=null&&(a.__c.__P===u&&(a.__c.__P=c),a.__c=null),a.__k=a.__k&&a.__k.map(function(s){return i(s,c,u)})),a}(this.__b,r,n.__O=n.__P)}this.__b=null}var o=e.__e&&K(X,null,t.fallback);return o&&(o.__h=null),[K(X,null,e.__e?null:t.children),o]};var jr=function(t,e,r){if(++r[1]===r[0]&&t.o.delete(e),t.props.revealOrder&&(t.props.revealOrder[0]!=="t"||!t.o.size))for(r=t.u;r;){for(;r.length>3;)r.pop()();if(r[1]>>1,1),e.i.removeChild(n)}}),We(K(xo,{context:e.context},t.__v),e.l)):e.l&&e.componentWillUnmount()}function Ln(t,e){return K(No,{__v:t,i:e})}(je.prototype=new W).__e=function(t){var e=this,r=Rn(e.__v),n=e.o.get(t);return n[0]++,function(o){var i=function(){e.props.revealOrder?(n.push(o),jr(e,t,n)):o()};r?r(i):i()}},je.prototype.render=function(t){this.u=null,this.o=new Map;var e=$(t.children);t.revealOrder&&t.revealOrder[0]==="b"&&e.reverse();for(var r=e.length;r--;)this.o.set(e[r],this.u=[1,0,this.u]);return t.children},je.prototype.componentDidUpdate=je.prototype.componentDidMount=function(){var t=this;this.o.forEach(function(e,r){jr(t,r,e)})};var qn=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,To=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ro=function(t){return(typeof Symbol<"u"&&Ve(Symbol())=="symbol"?/fil|che|rad/i:/fil|che|ra/i).test(t)};function Mn(t,e,r){return e.__k==null&&(e.textContent=""),We(t,e),typeof r=="function"&&r(),t?t.__c:null}W.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(W.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:e})}})});var Er=w.event;function Lo(){}function qo(){return this.cancelBubble}function Mo(){return this.defaultPrevented}w.event=function(t){return Er&&(t=Er(t)),t.persist=Lo,t.isPropagationStopped=qo,t.isDefaultPrevented=Mo,t.nativeEvent=t};var Hn,Pr={configurable:!0,get:function(){return this.class}},Ir=w.vnode;w.vnode=function(t){var e=t.type,r=t.props,n=r;if(typeof e=="string"){for(var o in n={},r){var i=r[o];o==="value"&&"defaultValue"in r&&i==null||(o==="defaultValue"&&"value"in r&&r.value==null?o="value":o==="download"&&i===!0?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+e)&&!Ro(r.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():To.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():i===null&&(i=void 0),n[o]=i)}e=="select"&&n.multiple&&Array.isArray(n.value)&&(n.value=$(r.children).forEach(function(a){a.props.selected=n.value.indexOf(a.props.value)!=-1})),e=="select"&&n.defaultValue!=null&&(n.value=$(r.children).forEach(function(a){a.props.selected=n.multiple?n.defaultValue.indexOf(a.props.value)!=-1:n.defaultValue==a.props.value})),t.props=n}e&&r.class!=r.className&&(Pr.enumerable="className"in r,r.className!=null&&(n.class=r.className),Object.defineProperty(n,"className",Pr)),t.$$typeof=qn,Ir&&Ir(t)};var kr=w.__r;w.__r=function(t){kr&&kr(t),Hn=t.__c};var Ho={ReactCurrentDispatcher:{current:{readContext:function(t){return Hn.__n[t.__c].props.value}}}};(typeof performance>"u"?"undefined":Ve(performance))=="object"&&typeof performance.now=="function"&&performance.now.bind(performance);function Dr(t){return!!t&&t.$$typeof===qn}var f={useState:Gt,useReducer:xn,useEffect:Xt,useLayoutEffect:_r,useRef:function(t){return pe=5,Pt(function(){return{current:t}},[])},useImperativeHandle:function(t,e,r){pe=6,_r(function(){typeof t=="function"?t(e()):t&&(t.current=e())},r==null?r:r.concat(t))},useMemo:Pt,useCallback:function(t,e){return pe=8,Pt(function(){return t},e)},useContext:function(t){var e=L.context[t.__c],r=Je(de++,9);return r.__c=t,e?(r.__==null&&(r.__=!0,e.sub(L)),e.props.value):t.__},useDebugValue:function(t,e){w.useDebugValue&&w.useDebugValue(e?e(t):t)},version:"16.8.0",Children:Ao,render:Mn,hydrate:function(t,e,r){return Cn(t,e),typeof r=="function"&&r(),t?t.__c:null},unmountComponentAtNode:function(t){return!!t.__k&&(We(null,t),!0)},createPortal:Ln,createElement:K,createContext:function(t,e){var r={__c:e="__cC"+Sn++,__:t,Consumer:function(n,o){return n.children(o)},Provider:function(n){var o,i;return this.getChildContext||(o=[],(i={})[e]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(a){this.props.value!==a.value&&o.some(Mt)},this.sub=function(a){o.push(a);var c=a.componentWillUnmount;a.componentWillUnmount=function(){o.splice(o.indexOf(a),1),c&&c.call(a)}}),n.children}};return r.Provider.__=r.Consumer.contextType=r},createFactory:function(t){return K.bind(null,t)},cloneElement:function(t){return Dr(t)?Io.apply(null,arguments):t},createRef:function(){return{current:null}},Fragment:X,isValidElement:Dr,findDOMNode:function(t){return t&&(t.base||t.nodeType===1&&t)||null},Component:W,PureComponent:Bt,memo:function(t,e){function r(o){var i=this.props.ref,a=i==o.ref;return!a&&i&&(i.call?i(null):i.current=null),e?!e(this.props,o)||!a:Ft(this.props,o)}function n(o){return this.shouldComponentUpdate=r,K(t,o)}return n.displayName="Memo("+(t.displayName||t.name)+")",n.prototype.isReactComponent=!0,n.__f=!0,n},forwardRef:function(t){function e(r,n){var o=Tn({},r);return delete o.ref,t(o,(n=r.ref||n)&&(Ve(n)!="object"||"current"in n)?n:null)}return e.$$typeof=Do,e.render=e,e.prototype.isReactComponent=e.__f=!0,e.displayName="ForwardRef("+(t.displayName||t.name)+")",e},unstable_batchedUpdates:function(t,e){return t(e)},StrictMode:X,Suspense:ct,SuspenseList:je,lazy:function(t){var e,r,n;function o(i){if(e||(e=t()).then(function(a){r=a.default||a},function(a){n=a}),n)throw n;if(!r)throw e;return K(r,i)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Ho};function Uo(){return f.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},f.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function Un(){return f.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},f.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var Fo=["translations"];function Vt(){return Vt=Object.assign||function(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}var Vo=f.forwardRef(function(t,e){var r=t.translations,n=r===void 0?{}:r,o=Bo(t,Fo),i=n.buttonText,a=i===void 0?"Search":i,c=n.buttonAriaLabel,u=c===void 0?"Search":c,s=Fn(Gt(null),2),l=s[0],m=s[1];return Xt(function(){typeof navigator<"u"&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?m("⌘"):m("Ctrl"))},[]),f.createElement("button",Vt({type:"button",className:"DocSearch DocSearch-Button","aria-label":u},o,{ref:e}),f.createElement("span",{className:"DocSearch-Button-Container"},f.createElement(Un,null),f.createElement("span",{className:"DocSearch-Button-Placeholder"},a)),f.createElement("span",{className:"DocSearch-Button-Keys"},l!==null&&f.createElement(f.Fragment,null,f.createElement(Cr,{reactsToKey:l==="Ctrl"?"Ctrl":"Meta"},l==="Ctrl"?f.createElement(Uo,null):l),f.createElement(Cr,{reactsToKey:"k"},"K"))))});function Cr(t){var e=t.reactsToKey,r=t.children,n=Fn(Gt(!1),2),o=n[0],i=n[1];return Xt(function(){if(e)return window.addEventListener("keydown",a),window.addEventListener("keyup",c),function(){window.removeEventListener("keydown",a),window.removeEventListener("keyup",c)};function a(u){u.key===e&&i(!0)}function c(u){u.key!==e&&u.key!=="Meta"||i(!1)}},[e]),f.createElement("kbd",{className:o?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},r)}function Bn(t,e){var r=void 0;return function(){for(var n=arguments.length,o=new Array(n),i=0;it.length)&&(e=t.length);for(var r=0,n=new Array(e);rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function Rr(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),r.push.apply(r,n)}return r}function ve(t){for(var e=1;e1&&arguments[1]!==void 0?arguments[1]:20,r=[],n=0;n=3||r===2&&n>=4||r===1&&n>=10);function i(a,c,u){if(o&&u!==void 0){var s=u[0].__autocomplete_algoliaCredentials,l={"X-Algolia-Application-Id":s.appId,"X-Algolia-API-Key":s.apiKey};t.apply(void 0,[a].concat(Ge(c),[{headers:l}]))}else t.apply(void 0,[a].concat(Ge(c)))}return{init:function(a,c){t("init",{appId:a,apiKey:c})},setUserToken:function(a){t("setUserToken",a)},clickedObjectIDsAfterSearch:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&i("clickedObjectIDsAfterSearch",Xe(c),c[0].items)},clickedObjectIDs:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&i("clickedObjectIDs",Xe(c),c[0].items)},clickedFilters:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&t.apply(void 0,["clickedFilters"].concat(c))},convertedObjectIDsAfterSearch:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&i("convertedObjectIDsAfterSearch",Xe(c),c[0].items)},convertedObjectIDs:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&i("convertedObjectIDs",Xe(c),c[0].items)},convertedFilters:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&t.apply(void 0,["convertedFilters"].concat(c))},viewedObjectIDs:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&c.reduce(function(s,l){var m=l.items,p=Kn(l,$o);return[].concat(Ge(s),Ge(Zo(ve(ve({},p),{},{objectIDs:(m==null?void 0:m.map(function(v){return v.objectID}))||p.objectIDs})).map(function(v){return{items:m,payload:v}})))},[]).forEach(function(s){var l=s.items;return i("viewedObjectIDs",[s.payload],l)})},viewedFilters:function(){for(var a=arguments.length,c=new Array(a),u=0;u0&&t.apply(void 0,["viewedFilters"].concat(c))}}}function Go(t){var e=t.items.reduce(function(r,n){var o;return r[n.__autocomplete_indexName]=((o=r[n.__autocomplete_indexName])!==null&&o!==void 0?o:[]).concat(n),r},{});return Object.keys(e).map(function(r){return{index:r,items:e[r],algoliaSource:["autocomplete"]}})}function kt(t){return t.objectID&&t.__autocomplete_indexName&&t.__autocomplete_queryID}function De(t){return De=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},De(t)}function ie(t){return function(e){if(Array.isArray(e))return Dt(e)}(t)||function(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}(t)||function(e,r){if(e){if(typeof e=="string")return Dt(e,r);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Dt(e,r)}}(t)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function Dt(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&ti({onItemsChange:n,items:p,insights:c,state:m}))}},0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(l){var m=l.setContext,p=l.onSelect,v=l.onActive;a("addAlgoliaAgent","insights-plugin"),m({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:c}}),p(function(d){var h=d.item,y=d.state,b=d.event;kt(h)&&o({state:y,event:b,insights:c,item:h,insightsEvents:[G({eventName:"Item Selected"},Nr({item:h,items:u.current}))]})}),v(function(d){var h=d.item,y=d.state,b=d.event;kt(h)&&i({state:y,event:b,insights:c,item:h,insightsEvents:[G({eventName:"Item Active"},Nr({item:h,items:u.current}))]})})},onStateChange:function(l){var m=l.state;s({state:m})},__autocomplete_pluginOptions:t}}function lt(t,e){var r=e;return{then:function(n,o){return lt(t.then(et(n,r,t),et(o,r,t)),r)},catch:function(n){return lt(t.catch(et(n,r,t)),r)},finally:function(n){return n&&r.onCancelList.push(n),lt(t.finally(et(n&&function(){return r.onCancelList=[],n()},r,t)),r)},cancel:function(){r.isCanceled=!0;var n=r.onCancelList;r.onCancelList=[],n.forEach(function(o){o()})},isCanceled:function(){return r.isCanceled===!0}}}function qr(t){return lt(t,{isCanceled:!1,onCancelList:[]})}function et(t,e,r){return t?function(n){return e.isCanceled?n:t(n)}:r}function Mr(t,e,r,n){if(!r)return null;if(t<0&&(e===null||n!==null&&e===0))return r+t;var o=(e===null?-1:e)+t;return o<=-1||o>=r?n===null?null:0:o}function Hr(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),r.push.apply(r,n)}return r}function Ur(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r0},reshape:function(i){return i.sources}},t),{},{id:(r=t.id)!==null&&r!==void 0?r:"autocomplete-".concat(Ko++),plugins:o,initialState:ae({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},t.initialState),onStateChange:function(i){var a;(a=t.onStateChange)===null||a===void 0||a.call(t,i),o.forEach(function(c){var u;return(u=c.onStateChange)===null||u===void 0?void 0:u.call(c,i)})},onSubmit:function(i){var a;(a=t.onSubmit)===null||a===void 0||a.call(t,i),o.forEach(function(c){var u;return(u=c.onSubmit)===null||u===void 0?void 0:u.call(c,i)})},onReset:function(i){var a;(a=t.onReset)===null||a===void 0||a.call(t,i),o.forEach(function(c){var u;return(u=c.onReset)===null||u===void 0?void 0:u.call(c,i)})},getSources:function(i){return Promise.all([].concat(ci(o.map(function(a){return a.getSources})),[t.getSources]).filter(Boolean).map(function(a){return function(c,u){var s=[];return Promise.resolve(c(u)).then(function(l){return Promise.all(l.filter(function(m){return!!m}).map(function(m){if(m.sourceId,s.includes(m.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(m.sourceId)," is not unique."));s.push(m.sourceId);var p={getItemInputValue:function(d){return d.state.query},getItemUrl:function(){},onSelect:function(d){(0,d.setIsOpen)(!1)},onActive:vt,onResolve:vt};Object.keys(p).forEach(function(d){p[d].__default=!0});var v=Ur(Ur({},p),m);return Promise.resolve(v)}))})}(a,i)})).then(function(a){return ze(a)}).then(function(a){return a.map(function(c){return ae(ae({},c),{},{onSelect:function(u){c.onSelect(u),e.forEach(function(s){var l;return(l=s.onSelect)===null||l===void 0?void 0:l.call(s,u)})},onActive:function(u){c.onActive(u),e.forEach(function(s){var l;return(l=s.onActive)===null||l===void 0?void 0:l.call(s,u)})},onResolve:function(u){c.onResolve(u),e.forEach(function(s){var l;return(l=s.onResolve)===null||l===void 0?void 0:l.call(s,u)})}})})})},navigator:ae({navigate:function(i){var a=i.itemUrl;n.location.assign(a)},navigateNewTab:function(i){var a=i.itemUrl,c=n.open(a,"_blank","noopener");c==null||c.focus()},navigateNewWindow:function(i){var a=i.itemUrl;n.open(a,"_blank","noopener")}},t.navigator)})}function Te(t){return Te=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Te(t)}function Kr(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),r.push.apply(r,n)}return r}function rt(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}var Jr,xt,ot,we=null,$r=(Jr=-1,xt=-1,ot=void 0,function(t){var e=++Jr;return Promise.resolve(t).then(function(r){return ot&&e=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function Me(t){return Me=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Me(t)}var Oi=["props","refresh","store"],Si=["inputElement","formElement","panelElement"],wi=["inputElement"],ji=["inputElement","maxLength"],Ei=["sourceIndex"],Pi=["sourceIndex"],Ii=["item","source","sourceIndex"];function Zr(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),r.push.apply(r,n)}return r}function R(t){for(var e=1;e=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function Di(t){var e=t.props,r=t.refresh,n=t.store,o=re(t,Oi),i=function(a,c){return c!==void 0?"".concat(a,"-").concat(c):a};return{getEnvironmentProps:function(a){var c=a.inputElement,u=a.formElement,s=a.panelElement;function l(m){!n.getState().isOpen&&n.pendingRequests.isEmpty()||m.target===c||[u,s].some(function(p){return v=p,d=m.target,v===d||v.contains(d);var v,d})===!1&&(n.dispatch("blur",null),e.debug||n.pendingRequests.cancelAll())}return R({onTouchStart:l,onMouseDown:l,onTouchMove:function(m){n.getState().isOpen!==!1&&c===e.environment.document.activeElement&&m.target!==c&&c.blur()}},re(a,Si))},getRootProps:function(a){return R({role:"combobox","aria-expanded":n.getState().isOpen,"aria-haspopup":"listbox","aria-owns":n.getState().isOpen?"".concat(e.id,"-list"):void 0,"aria-labelledby":"".concat(e.id,"-label")},a)},getFormProps:function(a){return a.inputElement,R({action:"",noValidate:!0,role:"search",onSubmit:function(c){var u;c.preventDefault(),e.onSubmit(R({event:c,refresh:r,state:n.getState()},o)),n.dispatch("submit",null),(u=a.inputElement)===null||u===void 0||u.blur()},onReset:function(c){var u;c.preventDefault(),e.onReset(R({event:c,refresh:r,state:n.getState()},o)),n.dispatch("reset",null),(u=a.inputElement)===null||u===void 0||u.focus()}},re(a,wi))},getLabelProps:function(a){var c=a||{},u=c.sourceIndex,s=re(c,Ei);return R({htmlFor:"".concat(i(e.id,u),"-input"),id:"".concat(i(e.id,u),"-label")},s)},getInputProps:function(a){var c;function u(y){(e.openOnFocus||n.getState().query)&&le(R({event:y,props:e,query:n.getState().completion||n.getState().query,refresh:r,store:n},o)),n.dispatch("focus",null)}var s=a||{},l=(s.inputElement,s.maxLength),m=l===void 0?512:l,p=re(s,ji),v=fe(n.getState()),d=function(y){return!!(y&&y.match(oi))}(((c=e.environment.navigator)===null||c===void 0?void 0:c.userAgent)||""),h=v!=null&&v.itemUrl&&!d?"go":"search";return R({"aria-autocomplete":"both","aria-activedescendant":n.getState().isOpen&&n.getState().activeItemId!==null?"".concat(e.id,"-item-").concat(n.getState().activeItemId):void 0,"aria-controls":n.getState().isOpen?"".concat(e.id,"-list"):void 0,"aria-labelledby":"".concat(e.id,"-label"),value:n.getState().completion||n.getState().query,id:"".concat(e.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:h,spellCheck:"false",autoFocus:e.autoFocus,placeholder:e.placeholder,maxLength:m,type:"search",onChange:function(y){le(R({event:y,props:e,query:y.currentTarget.value.slice(0,m),refresh:r,store:n},o))},onKeyDown:function(y){(function(b){var _=b.event,S=b.props,O=b.refresh,g=b.store,P=_i(b,gi);if(_.key==="ArrowUp"||_.key==="ArrowDown"){var C=function(){var M=S.environment.document.getElementById("".concat(S.id,"-item-").concat(g.getState().activeItemId));M&&(M.scrollIntoViewIfNeeded?M.scrollIntoViewIfNeeded(!1):M.scrollIntoView(!1))},q=function(){var M=fe(g.getState());if(g.getState().activeItemId!==null&&M){var Ot=M.item,St=M.itemInputValue,$e=M.itemUrl,B=M.source;B.onActive(te({event:_,item:Ot,itemInputValue:St,itemUrl:$e,refresh:O,source:B,state:g.getState()},P))}};_.preventDefault(),g.getState().isOpen===!1&&(S.openOnFocus||g.getState().query)?le(te({event:_,props:S,query:g.getState().query,refresh:O,store:g},P)).then(function(){g.dispatch(_.key,{nextActiveItemId:S.defaultActiveItemId}),q(),setTimeout(C,0)}):(g.dispatch(_.key,{}),q(),C())}else if(_.key==="Escape")_.preventDefault(),g.dispatch(_.key,null),g.pendingRequests.cancelAll();else if(_.key==="Tab")g.dispatch("blur",null),g.pendingRequests.cancelAll();else if(_.key==="Enter"){if(g.getState().activeItemId===null||g.getState().collections.every(function(M){return M.items.length===0}))return void(S.debug||g.pendingRequests.cancelAll());_.preventDefault();var x=fe(g.getState()),D=x.item,N=x.itemInputValue,U=x.itemUrl,F=x.source;if(_.metaKey||_.ctrlKey)U!==void 0&&(F.onSelect(te({event:_,item:D,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P)),S.navigator.navigateNewTab({itemUrl:U,item:D,state:g.getState()}));else if(_.shiftKey)U!==void 0&&(F.onSelect(te({event:_,item:D,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P)),S.navigator.navigateNewWindow({itemUrl:U,item:D,state:g.getState()}));else if(!_.altKey){if(U!==void 0)return F.onSelect(te({event:_,item:D,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P)),void S.navigator.navigate({itemUrl:U,item:D,state:g.getState()});le(te({event:_,nextState:{isOpen:!1},props:S,query:N,refresh:O,store:g},P)).then(function(){F.onSelect(te({event:_,item:D,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P))})}}})(R({event:y,props:e,refresh:r,store:n},o))},onFocus:u,onBlur:vt,onClick:function(y){a.inputElement!==e.environment.document.activeElement||n.getState().isOpen||u(y)}},p)},getPanelProps:function(a){return R({onMouseDown:function(c){c.preventDefault()},onMouseLeave:function(){n.dispatch("mouseleave",null)}},a)},getListProps:function(a){var c=a||{},u=c.sourceIndex,s=re(c,Pi);return R({role:"listbox","aria-labelledby":"".concat(i(e.id,u),"-label"),id:"".concat(i(e.id,u),"-list")},s)},getItemProps:function(a){var c=a.item,u=a.source,s=a.sourceIndex,l=re(a,Ii);return R({id:"".concat(i(e.id,s),"-item-").concat(c.__autocomplete_id),role:"option","aria-selected":n.getState().activeItemId===c.__autocomplete_id,onMouseMove:function(m){if(c.__autocomplete_id!==n.getState().activeItemId){n.dispatch("mousemove",c.__autocomplete_id);var p=fe(n.getState());if(n.getState().activeItemId!==null&&p){var v=p.item,d=p.itemInputValue,h=p.itemUrl,y=p.source;y.onActive(R({event:m,item:v,itemInputValue:d,itemUrl:h,refresh:r,source:y,state:n.getState()},o))}}},onMouseDown:function(m){m.preventDefault()},onClick:function(m){var p=u.getItemInputValue({item:c,state:n.getState()}),v=u.getItemUrl({item:c,state:n.getState()});(v?Promise.resolve():le(R({event:m,nextState:{isOpen:!1},props:e,query:p,refresh:r,store:n},o))).then(function(){u.onSelect(R({event:m,item:c,itemInputValue:p,itemUrl:v,refresh:r,source:u,state:n.getState()},o))})}},l)}}}function He(t){return He=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(t)}function Yr(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),r.push.apply(r,n)}return r}function Ai(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function Gi(t){var e=t.translations,r=e===void 0?{}:e,n=Yi(t,Qi),o=r.noResultsText,i=o===void 0?"No results for":o,a=r.suggestedQueryText,c=a===void 0?"Try searching for":a,u=r.reportMissingResultsText,s=u===void 0?"Believe this query should return results?":u,l=r.reportMissingResultsLinkText,m=l===void 0?"Let us know.":l,p=n.state.context.searchSuggestions;return f.createElement("div",{className:"DocSearch-NoResults"},f.createElement("div",{className:"DocSearch-Screen-Icon"},f.createElement(Ji,null)),f.createElement("p",{className:"DocSearch-Title"},i,' "',f.createElement("strong",null,n.state.query),'"'),p&&p.length>0&&f.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},f.createElement("p",{className:"DocSearch-Help"},c,":"),f.createElement("ul",null,p.slice(0,3).reduce(function(v,d){return[].concat(Zi(v),[f.createElement("li",{key:d},f.createElement("button",{className:"DocSearch-Prefill",key:d,type:"button",onClick:function(){n.setQuery(d.toLowerCase()+" "),n.refresh(),n.inputRef.current.focus()}},d))])},[]))),n.getMissingResultsUrl&&f.createElement("p",{className:"DocSearch-Help"},"".concat(s," "),f.createElement("a",{href:n.getMissingResultsUrl({query:n.state.query}),target:"_blank",rel:"noopener noreferrer"},m)))}var Xi=["hit","attribute","tagName"];function rn(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),r.push.apply(r,n)}return r}function nn(t){for(var e=1;e=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function on(t,e){return e.split(".").reduce(function(r,n){return r!=null&&r[n]?r[n]:null},t)}function ce(t){var e=t.hit,r=t.attribute,n=t.tagName;return K(n===void 0?"span":n,nn(nn({},ta(t,Xi)),{},{dangerouslySetInnerHTML:{__html:on(e,"_snippetResult.".concat(r,".value"))||on(e,r)}}))}function an(t,e){return function(r){if(Array.isArray(r))return r}(t)||function(r,n){var o=r==null?null:typeof Symbol<"u"&&r[Symbol.iterator]||r["@@iterator"];if(o!=null){var i,a,c=[],u=!0,s=!1;try{for(o=o.call(r);!(u=(i=o.next()).done)&&(c.push(i.value),!n||c.length!==n);u=!0);}catch(l){s=!0,a=l}finally{try{u||o.return==null||o.return()}finally{if(s)throw a}}return c}}(t,e)||function(r,n){if(r){if(typeof r=="string")return un(r,n);var o=Object.prototype.toString.call(r).slice(8,-1);if(o==="Object"&&r.constructor&&(o=r.constructor.name),o==="Map"||o==="Set")return Array.from(r);if(o==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return un(r,n)}}(t,e)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function un(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r|<\/mark>)/g,oa=RegExp($n.source);function Qn(t){var e,r,n=t;if(!n.__docsearch_parent&&!t._highlightResult)return t.hierarchy.lvl0;var o=((n.__docsearch_parent?(e=n.__docsearch_parent)===null||e===void 0||(e=e._highlightResult)===null||e===void 0||(e=e.hierarchy)===null||e===void 0?void 0:e.lvl0:(r=t._highlightResult)===null||r===void 0||(r=r.hierarchy)===null||r===void 0?void 0:r.lvl0)||{}).value;return o&&oa.test(o)?o.replace($n,""):o}function Jt(){return Jt=Object.assign||function(t){for(var e=1;e=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function ca(t){var e=t.translations,r=e===void 0?{}:e,n=ua(t,aa),o=r.recentSearchesTitle,i=o===void 0?"Recent":o,a=r.noRecentSearchesText,c=a===void 0?"No recent searches":a,u=r.saveRecentSearchButtonTitle,s=u===void 0?"Save this search":u,l=r.removeRecentSearchButtonTitle,m=l===void 0?"Remove this search from history":l,p=r.favoriteSearchesTitle,v=p===void 0?"Favorite":p,d=r.removeFavoriteSearchButtonTitle,h=d===void 0?"Remove this search from favorites":d;return n.state.status==="idle"&&n.hasCollections===!1?n.disableUserPersonalization?null:f.createElement("div",{className:"DocSearch-StartScreen"},f.createElement("p",{className:"DocSearch-Help"},c)):n.hasCollections===!1?null:f.createElement("div",{className:"DocSearch-Dropdown-Container"},f.createElement(zt,ht({},n,{title:i,collection:n.state.collections[0],renderIcon:function(){return f.createElement("div",{className:"DocSearch-Hit-icon"},f.createElement(Ui,null))},renderAction:function(y){var b=y.item,_=y.runFavoriteTransition,S=y.runDeleteTransition;return f.createElement(f.Fragment,null,f.createElement("div",{className:"DocSearch-Hit-action"},f.createElement("button",{className:"DocSearch-Hit-action-button",title:s,type:"submit",onClick:function(O){O.preventDefault(),O.stopPropagation(),_(function(){n.favoriteSearches.add(b),n.recentSearches.remove(b),n.refresh()})}},f.createElement(tn,null))),f.createElement("div",{className:"DocSearch-Hit-action"},f.createElement("button",{className:"DocSearch-Hit-action-button",title:m,type:"submit",onClick:function(O){O.preventDefault(),O.stopPropagation(),S(function(){n.recentSearches.remove(b),n.refresh()})}},f.createElement(Wt,null))))}})),f.createElement(zt,ht({},n,{title:v,collection:n.state.collections[1],renderIcon:function(){return f.createElement("div",{className:"DocSearch-Hit-icon"},f.createElement(tn,null))},renderAction:function(y){var b=y.item,_=y.runDeleteTransition;return f.createElement("div",{className:"DocSearch-Hit-action"},f.createElement("button",{className:"DocSearch-Hit-action-button",title:h,type:"submit",onClick:function(S){S.preventDefault(),S.stopPropagation(),_(function(){n.favoriteSearches.remove(b),n.refresh()})}},f.createElement(Wt,null)))}})))}var la=["translations"];function yt(){return yt=Object.assign||function(t){for(var e=1;e=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}var fa=f.memo(function(t){var e=t.translations,r=e===void 0?{}:e,n=sa(t,la);if(n.state.status==="error")return f.createElement($i,{translations:r==null?void 0:r.errorScreen});var o=n.state.collections.some(function(i){return i.items.length>0});return n.state.query?o===!1?f.createElement(Gi,yt({},n,{translations:r==null?void 0:r.noResultsScreen})):f.createElement(ia,n):f.createElement(ca,yt({},n,{hasCollections:o,translations:r==null?void 0:r.startScreen}))},function(t,e){return e.state.status==="loading"||e.state.status==="stalled"}),ma=["translations"];function gt(){return gt=Object.assign||function(t){for(var e=1;e=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function va(t){var e=t.translations,r=e===void 0?{}:e,n=pa(t,ma),o=r.resetButtonTitle,i=o===void 0?"Clear the query":o,a=r.resetButtonAriaLabel,c=a===void 0?"Clear the query":a,u=r.cancelButtonText,s=u===void 0?"Cancel":u,l=r.cancelButtonAriaLabel,m=l===void 0?"Cancel":l,p=r.searchInputLabel,v=p===void 0?"Search":p,d=n.getFormProps({inputElement:n.inputRef.current}).onReset;return f.useEffect(function(){n.autoFocus&&n.inputRef.current&&n.inputRef.current.focus()},[n.autoFocus,n.inputRef]),f.useEffect(function(){n.isFromSelection&&n.inputRef.current&&n.inputRef.current.select()},[n.isFromSelection,n.inputRef]),f.createElement(f.Fragment,null,f.createElement("form",{className:"DocSearch-Form",onSubmit:function(h){h.preventDefault()},onReset:d},f.createElement("label",gt({className:"DocSearch-MagnifierLabel"},n.getLabelProps()),f.createElement(Un,null),f.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},v)),f.createElement("div",{className:"DocSearch-LoadingIndicator"},f.createElement(Hi,null)),f.createElement("input",gt({className:"DocSearch-Input",ref:n.inputRef},n.getInputProps({inputElement:n.inputRef.current,autoFocus:n.autoFocus,maxLength:64}))),f.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":c,hidden:!n.state.query},f.createElement(Wt,null))),f.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":m,onClick:n.onClose},s))}var da=["_highlightResult","_snippetResult"];function ha(t,e){if(t==null)return{};var r,n,o=function(a,c){if(a==null)return{};var u,s,l={},m=Object.keys(a);for(s=0;s=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function ya(t){return function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch{return!1}}()===!1?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(e){return window.localStorage.setItem(t,JSON.stringify(e))},getItem:function(){var e=window.localStorage.getItem(t);return e?JSON.parse(e):[]}}}function sn(t){var e=t.key,r=t.limit,n=r===void 0?5:r,o=ya(e),i=o.getItem().slice(0,n);return{add:function(a){var c=a,u=(c._highlightResult,c._snippetResult,ha(c,da)),s=i.findIndex(function(l){return l.objectID===u.objectID});s>-1&&i.splice(s,1),i.unshift(u),i=i.slice(0,n),o.setItem(i)},remove:function(a){i=i.filter(function(c){return c.objectID!==a.objectID}),o.setItem(i)},getAll:function(){return i}}}var ga=["facetName","facetQuery"];function ba(t){var e,r="algoliasearch-client-js-".concat(t.key),n=function(){return e===void 0&&(e=t.localStorage||window.localStorage),e},o=function(){return JSON.parse(n().getItem(r)||"{}")},i=function(c){n().setItem(r,JSON.stringify(c))},a=function(){var c=t.timeToLive?1e3*t.timeToLive:null,u=o(),s=Object.fromEntries(Object.entries(u).filter(function(m){return se(m,2)[1].timestamp!==void 0}));if(i(s),c){var l=Object.fromEntries(Object.entries(s).filter(function(m){var p=se(m,2)[1],v=new Date().getTime();return!(p.timestamp+c2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then(function(){a();var l=JSON.stringify(c);return o()[l]}).then(function(l){return Promise.all([l?l.value:u(),l!==void 0])}).then(function(l){var m=se(l,2),p=m[0],v=m[1];return Promise.all([p,v||s.miss(p)])}).then(function(l){return se(l,1)[0]})},set:function(c,u){return Promise.resolve().then(function(){var s=o();return s[JSON.stringify(c)]={timestamp:new Date().getTime(),value:u},n().setItem(r,JSON.stringify(s)),u})},delete:function(c){return Promise.resolve().then(function(){var u=o();delete u[JSON.stringify(c)],n().setItem(r,JSON.stringify(u))})},clear:function(){return Promise.resolve().then(function(){n().removeItem(r)})}}}function Ee(t){var e=ft(t.caches),r=e.shift();return r===void 0?{get:function(n,o){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return o().then(function(a){return Promise.all([a,i.miss(a)])}).then(function(a){return se(a,1)[0]})},set:function(n,o){return Promise.resolve(o)},delete:function(n){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(n,o){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(n,o,i).catch(function(){return Ee({caches:e}).get(n,o,i)})},set:function(n,o){return r.set(n,o).catch(function(){return Ee({caches:e}).set(n,o)})},delete:function(n){return r.delete(n).catch(function(){return Ee({caches:e}).delete(n)})},clear:function(){return r.clear().catch(function(){return Ee({caches:e}).clear()})}}}function Tt(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{serializable:!0},e={};return{get:function(r,n){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}},i=JSON.stringify(r);if(i in e)return Promise.resolve(t.serializable?JSON.parse(e[i]):e[i]);var a=n(),c=o&&o.miss||function(){return Promise.resolve()};return a.then(function(u){return c(u)}).then(function(){return a})},set:function(r,n){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear:function(){return e={},Promise.resolve()}}}function _a(t){for(var e=t.length-1;e>0;e--){var r=Math.floor(Math.random()*(e+1)),n=t[e];t[e]=t[r],t[r]=n}return t}function Zn(t,e){return e&&Object.keys(e).forEach(function(r){t[r]=e[r](t)}),t}function bt(t){for(var e=arguments.length,r=new Array(e>1?e-1:0),n=1;n0?n:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var me={Read:1,Write:2,Any:3},Yn=1,Oa=2,Gn=3;function Xn(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Yn;return I(I({},t),{},{status:e,lastUpdate:Date.now()})}function eo(t){return typeof t=="string"?{protocol:"https",url:t,accept:me.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||me.Any}}var $t="GET",_t="POST";function Sa(t,e){return Promise.all(e.map(function(r){return t.get(r,function(){return Promise.resolve(Xn(r))})})).then(function(r){var n=r.filter(function(a){return function(c){return c.status===Yn||Date.now()-c.lastUpdate>12e4}(a)}),o=r.filter(function(a){return function(c){return c.status===Gn&&Date.now()-c.lastUpdate<=12e4}(a)}),i=[].concat(ft(n),ft(o));return{getTimeout:function(a,c){return(o.length===0&&a===0?1:o.length+3+a)*c},statelessHosts:i.length>0?i.map(function(a){return eo(a)}):e}})}function mn(t,e,r,n){var o=[],i=function(p,v){if(!(p.method===$t||p.data===void 0&&v.data===void 0)){var d=Array.isArray(p.data)?p.data:I(I({},p.data),v.data);return JSON.stringify(d)}}(r,n),a=function(p,v){var d=I(I({},p.headers),v.headers),h={};return Object.keys(d).forEach(function(y){var b=d[y];h[y.toLowerCase()]=b}),h}(t,n),c=r.method,u=r.method!==$t?{}:I(I({},r.data),n.data),s=I(I(I({"x-algolia-agent":t.userAgent.value},t.queryParameters),u),n.queryParameters),l=0,m=function p(v,d){var h=v.pop();if(h===void 0)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:pn(o)};var y={data:i,headers:a,method:c,url:ja(h,r.path,s),connectTimeout:d(l,t.timeouts.connect),responseTimeout:d(l,n.timeout)},b=function(S){var O={request:y,response:S,host:h,triesLeft:v.length};return o.push(O),O},_={onSuccess:function(S){return function(O){try{return JSON.parse(O.content)}catch(g){throw function(P,C){return{name:"DeserializationError",message:P,response:C}}(g.message,O)}}(S)},onRetry:function(S){var O=b(S);return S.isTimedOut&&l++,Promise.all([t.logger.info("Retryable failure",ro(O)),t.hostsCache.set(h,Xn(h,S.isTimedOut?Gn:Oa))]).then(function(){return p(v,d)})},onFail:function(S){throw b(S),function(O,g){var P=O.content,C=O.status,q=P;try{q=JSON.parse(P).message}catch{}return function(x,D,N){return{name:"ApiError",message:x,status:D,transporterStackTrace:N}}(q,C,g)}(S,pn(o))}};return t.requester.send(y).then(function(S){return function(O,g){return function(P){var C=P.status;return P.isTimedOut||function(q){var x=q.isTimedOut,D=q.status;return!x&&~~D==0}(P)||~~(C/100)!=2&&~~(C/100)!=4}(O)?g.onRetry(O):~~(O.status/100)==2?g.onSuccess(O):g.onFail(O)}(S,_)})};return Sa(t.hostsCache,e).then(function(p){return m(ft(p.statelessHosts).reverse(),p.getTimeout)})}function wa(t){var e={value:"Algolia for JavaScript (".concat(t,")"),add:function(r){var n="; ".concat(r.segment).concat(r.version!==void 0?" (".concat(r.version,")"):"");return e.value.indexOf(n)===-1&&(e.value="".concat(e.value).concat(n)),e}};return e}function ja(t,e,r){var n=to(r),o="".concat(t.protocol,"://").concat(t.url,"/").concat(e.charAt(0)==="/"?e.substr(1):e);return n.length&&(o+="?".concat(n)),o}function to(t){return Object.keys(t).map(function(e){return bt("%s=%s",e,(r=t[e],Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]"?JSON.stringify(t[e]):t[e]));var r}).join("&")}function pn(t){return t.map(function(e){return ro(e)})}function ro(t){var e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return I(I({},t),{},{request:I(I({},t.request),{},{headers:I(I({},t.request.headers),e)})})}var Ea=function(t){var e=t.appId,r=function(i,a,c){var u={"x-algolia-api-key":c,"x-algolia-application-id":a};return{headers:function(){return i===st.WithinHeaders?u:{}},queryParameters:function(){return i===st.WithinQueryParameters?u:{}}}}(t.authMode!==void 0?t.authMode:st.WithinHeaders,e,t.apiKey),n=function(i){var a=i.hostsCache,c=i.logger,u=i.requester,s=i.requestsCache,l=i.responsesCache,m=i.timeouts,p=i.userAgent,v=i.hosts,d=i.queryParameters,h={hostsCache:a,logger:c,requester:u,requestsCache:s,responsesCache:l,timeouts:m,userAgent:p,headers:i.headers,queryParameters:d,hosts:v.map(function(y){return eo(y)}),read:function(y,b){var _=fn(b,h.timeouts.read),S=function(){return mn(h,h.hosts.filter(function(g){return(g.accept&me.Read)!=0}),y,_)};if((_.cacheable!==void 0?_.cacheable:y.cacheable)!==!0)return S();var O={request:y,mappedRequestOptions:_,transporter:{queryParameters:h.queryParameters,headers:h.headers}};return h.responsesCache.get(O,function(){return h.requestsCache.get(O,function(){return h.requestsCache.set(O,S()).then(function(g){return Promise.all([h.requestsCache.delete(O),g])},function(g){return Promise.all([h.requestsCache.delete(O),Promise.reject(g)])}).then(function(g){var P=se(g,2);return P[0],P[1]})})},{miss:function(g){return h.responsesCache.set(O,g)}})},write:function(y,b){return mn(h,h.hosts.filter(function(_){return(_.accept&me.Write)!=0}),y,fn(b,h.timeouts.write))}};return h}(I(I({hosts:[{url:"".concat(e,"-dsn.algolia.net"),accept:me.Read},{url:"".concat(e,".algolia.net"),accept:me.Write}].concat(_a([{url:"".concat(e,"-1.algolianet.com")},{url:"".concat(e,"-2.algolianet.com")},{url:"".concat(e,"-3.algolianet.com")}]))},t),{},{headers:I(I(I({},r.headers()),{"content-type":"application/x-www-form-urlencoded"}),t.headers),queryParameters:I(I({},r.queryParameters()),t.queryParameters)})),o={transporter:n,appId:e,addAlgoliaAgent:function(i,a){n.userAgent.add({segment:i,version:a})},clearCache:function(){return Promise.all([n.requestsCache.clear(),n.responsesCache.clear()]).then(function(){})}};return Zn(o,t.methods)},Pa=function(t){return function(e,r){return e.method===$t?t.transporter.read(e,r):t.transporter.write(e,r)}},no=function(t){return function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n={transporter:t.transporter,appId:t.appId,indexName:e};return Zn(n,r.methods)}},vn=function(t){return function(e,r){var n=e.map(function(o){return I(I({},o),{},{params:to(o.params||{})})});return t.transporter.read({method:_t,path:"1/indexes/*/queries",data:{requests:n},cacheable:!0},r)}},dn=function(t){return function(e,r){return Promise.all(e.map(function(n){var o=n.params,i=o.facetName,a=o.facetQuery,c=wo(o,ga);return no(t)(n.indexName,{methods:{searchForFacetValues:oo}}).searchForFacetValues(i,a,I(I({},r),c))}))}},Ia=function(t){return function(e,r,n){return t.transporter.read({method:_t,path:bt("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},n)}},ka=function(t){return function(e,r){return t.transporter.read({method:_t,path:bt("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},r)}},oo=function(t){return function(e,r,n){return t.transporter.read({method:_t,path:bt("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:r},cacheable:!0},n)}},Da=1,Aa=2,Ca=3;function io(t,e,r){var n,o={appId:t,apiKey:e,timeouts:{connect:1,read:2,write:30},requester:{send:function(i){return new Promise(function(a){var c=new XMLHttpRequest;c.open(i.method,i.url,!0),Object.keys(i.headers).forEach(function(m){return c.setRequestHeader(m,i.headers[m])});var u,s=function(m,p){return setTimeout(function(){c.abort(),a({status:0,content:p,isTimedOut:!0})},1e3*m)},l=s(i.connectTimeout,"Connection timeout");c.onreadystatechange=function(){c.readyState>c.OPENED&&u===void 0&&(clearTimeout(l),u=s(i.responseTimeout,"Socket timeout"))},c.onerror=function(){c.status===0&&(clearTimeout(l),clearTimeout(u),a({content:c.responseText||"Network request failed",status:c.status,isTimedOut:!1}))},c.onload=function(){clearTimeout(l),clearTimeout(u),a({content:c.responseText,status:c.status,isTimedOut:!1})},c.send(i.data)})}},logger:(n=Ca,{debug:function(i,a){return Da>=n&&console.debug(i,a),Promise.resolve()},info:function(i,a){return Aa>=n&&console.info(i,a),Promise.resolve()},error:function(i,a){return console.error(i,a),Promise.resolve()}}),responsesCache:Tt(),requestsCache:Tt({serializable:!1}),hostsCache:Ee({caches:[ba({key:"".concat("4.19.1","-").concat(t)}),Tt()]}),userAgent:wa("4.19.1").add({segment:"Browser",version:"lite"}),authMode:st.WithinQueryParameters};return Ea(I(I(I({},o),r),{},{methods:{search:vn,searchForFacetValues:dn,multipleQueries:vn,multipleSearchForFacetValues:dn,customRequest:Pa,initIndex:function(i){return function(a){return no(i)(a,{methods:{search:ka,searchForFacetValues:oo,findAnswers:Ia}})}}}}))}io.version="4.19.1";var xa=["footer","searchBox"];function Be(){return Be=Object.assign||function(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r=0||(l[u]=a[u]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function La(t){var e=t.appId,r=t.apiKey,n=t.indexName,o=t.placeholder,i=o===void 0?"Search docs":o,a=t.searchParameters,c=t.maxResultsPerGroup,u=t.onClose,s=u===void 0?na:u,l=t.transformItems,m=l===void 0?ln:l,p=t.hitComponent,v=p===void 0?Mi:p,d=t.resultsFooterComponent,h=d===void 0?function(){return null}:d,y=t.navigator,b=t.initialScrollY,_=b===void 0?0:b,S=t.transformSearchClient,O=S===void 0?ln:S,g=t.disableUserPersonalization,P=g!==void 0&&g,C=t.initialQuery,q=C===void 0?"":C,x=t.translations,D=x===void 0?{}:x,N=t.getMissingResultsUrl,U=t.insights,F=U!==void 0&&U,M=D.footer,Ot=D.searchBox,St=Ra(D,xa),$e=Ta(f.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),B=$e[0],ao=$e[1],tr=f.useRef(null),wt=f.useRef(null),rr=f.useRef(null),Qe=f.useRef(null),he=f.useRef(null),Q=f.useRef(10),nr=f.useRef(typeof window<"u"?window.getSelection().toString().slice(0,64):"").current,ee=f.useRef(q||nr).current,or=function(j,k,T){return f.useMemo(function(){var H=io(j,k);return H.addAlgoliaAgent("docsearch","3.6.0"),/docsearch.js \(.*\)/.test(H.transporter.userAgent.value)===!1&&H.addAlgoliaAgent("docsearch-react","3.6.0"),T(H)},[j,k,T])}(e,r,O),oe=f.useRef(sn({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(n),limit:10})).current,ye=f.useRef(sn({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(n),limit:oe.getAll().length===0?7:4})).current,ge=f.useCallback(function(j){if(!P){var k=j.type==="content"?j.__docsearch_parent:j;k&&oe.getAll().findIndex(function(T){return T.objectID===k.objectID})===-1&&ye.add(k)}},[oe,ye,P]),uo=f.useCallback(function(j){if(B.context.algoliaInsightsPlugin&&j.__autocomplete_id){var k=j,T={eventName:"Item Selected",index:k.__autocomplete_indexName,items:[k],positions:[j.__autocomplete_id],queryID:k.__autocomplete_queryID};B.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(T)}},[B.context.algoliaInsightsPlugin]),be=f.useMemo(function(){return Ri({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:ee,context:{searchSuggestions:[]}},insights:F,navigator:y,onStateChange:function(j){ao(j.state)},getSources:function(j){var k=j.query,T=j.state,H=j.setContext,Z=j.setStatus;if(!k)return P?[]:[{sourceId:"recentSearches",onSelect:function(A){var V=A.item,_e=A.event;ge(V),at(_e)||s()},getItemUrl:function(A){return A.item.url},getItems:function(){return ye.getAll()}},{sourceId:"favoriteSearches",onSelect:function(A){var V=A.item,_e=A.event;ge(V),at(_e)||s()},getItemUrl:function(A){return A.item.url},getItems:function(){return oe.getAll()}}];var Y=!!F;return or.search([{query:k,indexName:n,params:Rt({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(Q.current),"hierarchy.lvl2:".concat(Q.current),"hierarchy.lvl3:".concat(Q.current),"hierarchy.lvl4:".concat(Q.current),"hierarchy.lvl5:".concat(Q.current),"hierarchy.lvl6:".concat(Q.current),"content:".concat(Q.current)],snippetEllipsisText:"…",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:Y},a)}]).catch(function(A){throw A.name==="RetryError"&&Z("error"),A}).then(function(A){var V=A.results[0],_e=V.hits,so=V.nbHits,jt=cn(_e,function(Et){return Qn(Et)},c);T.context.searchSuggestions.length0&&(ir(),he.current&&he.current.focus())},[ee,ir]),f.useEffect(function(){function j(){if(wt.current){var k=.01*window.innerHeight;wt.current.style.setProperty("--docsearch-vh","".concat(k,"px"))}}return j(),window.addEventListener("resize",j),function(){window.removeEventListener("resize",j)}},[]),f.createElement("div",Be({ref:tr},lo({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container",B.status==="stalled"&&"DocSearch-Container--Stalled",B.status==="error"&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(j){j.target===j.currentTarget&&s()}}),f.createElement("div",{className:"DocSearch-Modal",ref:wt},f.createElement("header",{className:"DocSearch-SearchBar",ref:rr},f.createElement(va,Be({},be,{state:B,autoFocus:ee.length===0,inputRef:he,isFromSelection:!!ee&&ee===nr,translations:Ot,onClose:s}))),f.createElement("div",{className:"DocSearch-Dropdown",ref:Qe},f.createElement(fa,Be({},be,{indexName:n,state:B,hitComponent:v,resultsFooterComponent:h,disableUserPersonalization:P,recentSearches:ye,favoriteSearches:oe,inputRef:he,translations:St,getMissingResultsUrl:N,onItemClick:function(j,k){uo(j),ge(j),at(k)||s()}}))),f.createElement("footer",{className:"DocSearch-Footer"},f.createElement(qi,{translations:M}))))}function Qt(){return Qt=Object.assign||function(t){for(var e=1;et.length)&&(e=t.length);for(var r=0,n=new Array(e);r1&&arguments[1]!==void 0?arguments[1]:window;return typeof e=="string"?r.document.querySelector(e):e}(t.container,t.environment))}const Ha={id:"docsearch"},Ba=mo({__name:"VPAlgoliaSearchBox",props:{algolia:{}},setup(t){const e=t,r=po(),n=vo(),{site:o,localeIndex:i,lang:a}=Oo();ho(c),yo(i,c);async function c(){var v,d;await go();const l={...e.algolia,...(v=e.algolia.locales)==null?void 0:v[i.value]},m=((d=l.searchParameters)==null?void 0:d.facetFilters)??[],p=[...(Array.isArray(m)?m:[m]).filter(h=>!h.startsWith("lang:")),`lang:${a.value}`];u({...l,searchParameters:{...l.searchParameters,facetFilters:p}})}function u(l){const m=Object.assign({},l,{container:"#docsearch",navigator:{navigate({itemUrl:p}){const{pathname:v}=new URL(window.location.origin+p);n.path===v?window.location.assign(window.location.origin+p):r.go(p)}},transformItems(p){return p.map(v=>Object.assign({},v,{url:s(v.url)}))},hitComponent({hit:p,children:v}){return{__v:null,type:"a",ref:void 0,constructor:void 0,key:void 0,props:{href:p.url,children:v}}}});Ma(m)}function s(l){const{pathname:m,hash:p}=new URL(l,location.origin);return m.replace(/\.html$/,o.value.cleanUrls?"":".html")+p}return(l,m)=>(bo(),_o("div",Ha))}});export{Ba as default}; diff --git a/assets/chunks/framework.aNBt3w9_.js b/assets/chunks/framework.aNBt3w9_.js new file mode 100644 index 000000000..5dde4e6a5 --- /dev/null +++ b/assets/chunks/framework.aNBt3w9_.js @@ -0,0 +1,17 @@ +/** +* @vue/shared v3.4.31 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function hr(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const te={},gt=[],Se=()=>{},po=()=>!1,Dt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),pr=e=>e.startsWith("onUpdate:"),le=Object.assign,gr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},go=Object.prototype.hasOwnProperty,Y=(e,t)=>go.call(e,t),U=Array.isArray,mt=e=>vn(e)==="[object Map]",Fs=e=>vn(e)==="[object Set]",W=e=>typeof e=="function",ie=e=>typeof e=="string",Qe=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",$s=e=>(Z(e)||W(e))&&W(e.then)&&W(e.catch),Hs=Object.prototype.toString,vn=e=>Hs.call(e),mo=e=>vn(e).slice(8,-1),js=e=>vn(e)==="[object Object]",mr=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,yt=hr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),bn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},yo=/-(\w)/g,Ne=bn(e=>e.replace(yo,(t,n)=>n?n.toUpperCase():"")),_o=/\B([A-Z])/g,ft=bn(e=>e.replace(_o,"-$1").toLowerCase()),wn=bn(e=>e.charAt(0).toUpperCase()+e.slice(1)),sn=bn(e=>e?`on${wn(e)}`:""),Ye=(e,t)=>!Object.is(e,t),$n=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},vo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},bo=e=>{const t=ie(e)?Number(e):NaN;return isNaN(t)?e:t};let Vr;const Vs=()=>Vr||(Vr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function yr(e){if(U(e)){const t={};for(let n=0;n{if(n){const r=n.split(Eo);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function _r(e){let t="";if(ie(e))t=e;else if(U(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Ao=e=>ie(e)?e:e==null?"":U(e)||Z(e)&&(e.toString===Hs||!W(e.toString))?Bs(e)?Ao(e.value):JSON.stringify(e,ks,2):String(e),ks=(e,t)=>Bs(t)?ks(e,t.value):mt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],i)=>(n[Hn(r,i)+" =>"]=s,n),{})}:Fs(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Hn(n))}:Qe(t)?Hn(t):Z(t)&&!U(t)&&!js(t)?String(t):t,Hn=(e,t="")=>{var n;return Qe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.31 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let we;class Ro{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=we,!t&&we&&(this.index=(we.scopes||(we.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=we;try{return we=this,t()}finally{we=n}}}on(){we=this}off(){we=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),et()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Ge,n=ct;try{return Ge=!0,ct=this,this._runnings++,Ur(this),this.fn()}finally{Br(this),this._runnings--,ct=n,Ge=t}}stop(){this.active&&(Ur(this),Br(this),this.onStop&&this.onStop(),this.active=!1)}}function Lo(e){return e.value}function Ur(e){e._trackId++,e._depsLength=0}function Br(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},un=new WeakMap,at=Symbol(""),sr=Symbol("");function ve(e,t,n){if(Ge&&ct){let r=un.get(e);r||un.set(e,r=new Map);let s=r.get(n);s||r.set(n,s=Xs(()=>r.delete(n))),Gs(ct,s)}}function je(e,t,n,r,s,i){const o=un.get(e);if(!o)return;let l=[];if(t==="clear")l=[...o.values()];else if(n==="length"&&U(e)){const c=Number(r);o.forEach((u,f)=>{(f==="length"||!Qe(f)&&f>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":U(e)?mr(n)&&l.push(o.get("length")):(l.push(o.get(at)),mt(e)&&l.push(o.get(sr)));break;case"delete":U(e)||(l.push(o.get(at)),mt(e)&&l.push(o.get(sr)));break;case"set":mt(e)&&l.push(o.get(at));break}br();for(const c of l)c&&zs(c,4);wr()}function Po(e,t){const n=un.get(e);return n&&n.get(t)}const Mo=hr("__proto__,__v_isRef,__isVue"),Ys=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Qe)),kr=No();function No(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=J(this);for(let i=0,o=this.length;i{e[t]=function(...n){Ze(),br();const r=J(this)[t].apply(this,n);return wr(),et(),r}}),e}function Fo(e){Qe(e)||(e=String(e));const t=J(this);return ve(t,"has",e),t.hasOwnProperty(e)}class Js{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const s=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(s?i?zo:ti:i?ei:Zs).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=U(t);if(!s){if(o&&Y(kr,n))return Reflect.get(kr,n,r);if(n==="hasOwnProperty")return Fo}const l=Reflect.get(t,n,r);return(Qe(n)?Ys.has(n):Mo(n))||(s||ve(t,"get",n),i)?l:pe(l)?o&&mr(n)?l:l.value:Z(l)?s?Sn(l):Cn(l):l}}class Qs extends Js{constructor(t=!1){super(!1,t)}set(t,n,r,s){let i=t[n];if(!this._isShallow){const c=Mt(i);if(!fn(r)&&!Mt(r)&&(i=J(i),r=J(r)),!U(t)&&pe(i)&&!pe(r))return c?!1:(i.value=r,!0)}const o=U(t)&&mr(n)?Number(n)e,En=e=>Reflect.getPrototypeOf(e);function qt(e,t,n=!1,r=!1){e=e.__v_raw;const s=J(e),i=J(t);n||(Ye(t,i)&&ve(s,"get",t),ve(s,"get",i));const{has:o}=En(s),l=r?Er:n?xr:Nt;if(o.call(s,t))return l(e.get(t));if(o.call(s,i))return l(e.get(i));e!==s&&e.get(t)}function Gt(e,t=!1){const n=this.__v_raw,r=J(n),s=J(e);return t||(Ye(e,s)&&ve(r,"has",e),ve(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function zt(e,t=!1){return e=e.__v_raw,!t&&ve(J(e),"iterate",at),Reflect.get(e,"size",e)}function Kr(e){e=J(e);const t=J(this);return En(t).has.call(t,e)||(t.add(e),je(t,"add",e,e)),this}function Wr(e,t){t=J(t);const n=J(this),{has:r,get:s}=En(n);let i=r.call(n,e);i||(e=J(e),i=r.call(n,e));const o=s.call(n,e);return n.set(e,t),i?Ye(t,o)&&je(n,"set",e,t):je(n,"add",e,t),this}function qr(e){const t=J(this),{has:n,get:r}=En(t);let s=n.call(t,e);s||(e=J(e),s=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return s&&je(t,"delete",e,void 0),i}function Gr(){const e=J(this),t=e.size!==0,n=e.clear();return t&&je(e,"clear",void 0,void 0),n}function Xt(e,t){return function(r,s){const i=this,o=i.__v_raw,l=J(o),c=t?Er:e?xr:Nt;return!e&&ve(l,"iterate",at),o.forEach((u,f)=>r.call(s,c(u),c(f),i))}}function Yt(e,t,n){return function(...r){const s=this.__v_raw,i=J(s),o=mt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=s[e](...r),f=n?Er:t?xr:Nt;return!t&&ve(i,"iterate",c?sr:at),{next(){const{value:h,done:m}=u.next();return m?{value:h,done:m}:{value:l?[f(h[0]),f(h[1])]:f(h),done:m}},[Symbol.iterator](){return this}}}}function Ue(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Vo(){const e={get(i){return qt(this,i)},get size(){return zt(this)},has:Gt,add:Kr,set:Wr,delete:qr,clear:Gr,forEach:Xt(!1,!1)},t={get(i){return qt(this,i,!1,!0)},get size(){return zt(this)},has:Gt,add:Kr,set:Wr,delete:qr,clear:Gr,forEach:Xt(!1,!0)},n={get(i){return qt(this,i,!0)},get size(){return zt(this,!0)},has(i){return Gt.call(this,i,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:Xt(!0,!1)},r={get(i){return qt(this,i,!0,!0)},get size(){return zt(this,!0)},has(i){return Gt.call(this,i,!0)},add:Ue("add"),set:Ue("set"),delete:Ue("delete"),clear:Ue("clear"),forEach:Xt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Yt(i,!1,!1),n[i]=Yt(i,!0,!1),t[i]=Yt(i,!1,!0),r[i]=Yt(i,!0,!0)}),[e,n,t,r]}const[Uo,Bo,ko,Ko]=Vo();function Cr(e,t){const n=t?e?Ko:ko:e?Bo:Uo;return(r,s,i)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(Y(n,s)&&s in r?n:r,s,i)}const Wo={get:Cr(!1,!1)},qo={get:Cr(!1,!0)},Go={get:Cr(!0,!1)};const Zs=new WeakMap,ei=new WeakMap,ti=new WeakMap,zo=new WeakMap;function Xo(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Yo(e){return e.__v_skip||!Object.isExtensible(e)?0:Xo(mo(e))}function Cn(e){return Mt(e)?e:Sr(e,!1,Ho,Wo,Zs)}function Jo(e){return Sr(e,!1,Do,qo,ei)}function Sn(e){return Sr(e,!0,jo,Go,ti)}function Sr(e,t,n,r,s){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=s.get(e);if(i)return i;const o=Yo(e);if(o===0)return e;const l=new Proxy(e,o===2?r:n);return s.set(e,l),l}function At(e){return Mt(e)?At(e.__v_raw):!!(e&&e.__v_isReactive)}function Mt(e){return!!(e&&e.__v_isReadonly)}function fn(e){return!!(e&&e.__v_isShallow)}function ni(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function on(e){return Object.isExtensible(e)&&Ds(e,"__v_skip",!0),e}const Nt=e=>Z(e)?Cn(e):e,xr=e=>Z(e)?Sn(e):e;class ri{constructor(t,n,r,s){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new vr(()=>t(this._value),()=>Rt(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=J(this);return(!t._cacheable||t.effect.dirty)&&Ye(t._value,t._value=t.effect.run())&&Rt(t,4),Tr(t),t.effect._dirtyLevel>=2&&Rt(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function Qo(e,t,n=!1){let r,s;const i=W(e);return i?(r=e,s=Se):(r=e.get,s=e.set),new ri(r,s,i||!s,n)}function Tr(e){var t;Ge&&ct&&(e=J(e),Gs(ct,(t=e.dep)!=null?t:e.dep=Xs(()=>e.dep=void 0,e instanceof ri?e:void 0)))}function Rt(e,t=4,n,r){e=J(e);const s=e.dep;s&&zs(s,t)}function pe(e){return!!(e&&e.__v_isRef===!0)}function oe(e){return ii(e,!1)}function si(e){return ii(e,!0)}function ii(e,t){return pe(e)?e:new Zo(e,t)}class Zo{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:J(t),this._value=n?t:Nt(t)}get value(){return Tr(this),this._value}set value(t){const n=this.__v_isShallow||fn(t)||Mt(t);t=n?t:J(t),Ye(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:Nt(t),Rt(this,4))}}function oi(e){return pe(e)?e.value:e}const el={get:(e,t,n)=>oi(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return pe(s)&&!pe(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function li(e){return At(e)?e:new Proxy(e,el)}class tl{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Tr(this),()=>Rt(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function nl(e){return new tl(e)}class rl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Po(J(this._object),this._key)}}class sl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function il(e,t,n){return pe(e)?e:W(e)?new sl(e):Z(e)&&arguments.length>1?ol(e,t,n):oe(e)}function ol(e,t,n){const r=e[t];return pe(r)?r:new rl(e,t,n)}/** +* @vue/runtime-core v3.4.31 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function ze(e,t,n,r){try{return r?e(...r):e()}catch(s){Vt(s,t,n)}}function xe(e,t,n,r){if(W(e)){const s=ze(e,t,n,r);return s&&$s(s)&&s.catch(i=>{Vt(i,t,n)}),s}if(U(e)){const s=[];for(let i=0;i>>1,s=de[r],i=$t(s);iPe&&de.splice(t,1)}function ul(e){U(e)?_t.push(...e):(!Ke||!Ke.includes(e,e.allowRecurse?it+1:it))&&_t.push(e),ai()}function zr(e,t,n=Ft?Pe+1:0){for(;n$t(n)-$t(r));if(_t.length=0,Ke){Ke.push(...t);return}for(Ke=t,it=0;ite.id==null?1/0:e.id,fl=(e,t)=>{const n=$t(e)-$t(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ui(e){ir=!1,Ft=!0,de.sort(fl);try{for(Pe=0;Peie(E)?E.trim():E)),h&&(s=n.map(vo))}let l,c=r[l=sn(t)]||r[l=sn(Ne(t))];!c&&i&&(c=r[l=sn(ft(t))]),c&&xe(c,e,6,s);const u=r[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(u,e,6,s)}}function fi(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const i=e.emits;let o={},l=!1;if(!W(e)){const c=u=>{const f=fi(u,t,!0);f&&(l=!0,le(o,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Z(e)&&r.set(e,null),null):(U(i)?i.forEach(c=>o[c]=null):le(o,i),Z(e)&&r.set(e,o),o)}function An(e,t){return!e||!Dt(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,ft(t))||Y(e,t))}let he=null,Rn=null;function hn(e){const t=he;return he=e,Rn=e&&e.type.__scopeId||null,t}function ka(e){Rn=e}function Ka(){Rn=null}function hl(e,t=he,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&cs(-1);const i=hn(t);let o;try{o=e(...s)}finally{hn(i),r._d&&cs(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function jn(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:f,props:h,data:m,setupState:E,ctx:A,inheritAttrs:L}=e,B=hn(e);let q,D;try{if(n.shapeFlag&4){const y=s||r,M=y;q=Ae(u.call(M,y,f,h,E,m,A)),D=l}else{const y=t;q=Ae(y.length>1?y(h,{attrs:l,slots:o,emit:c}):y(h,null)),D=t.props?l:pl(l)}}catch(y){Pt.length=0,Vt(y,e,1),q=se(me)}let g=q;if(D&&L!==!1){const y=Object.keys(D),{shapeFlag:M}=g;y.length&&M&7&&(i&&y.some(pr)&&(D=gl(D,i)),g=Je(g,D,!1,!0))}return n.dirs&&(g=Je(g,null,!1,!0),g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&(g.transition=n.transition),q=g,hn(B),q}const pl=e=>{let t;for(const n in e)(n==="class"||n==="style"||Dt(n))&&((t||(t={}))[n]=e[n]);return t},gl=(e,t)=>{const n={};for(const r in e)(!pr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function ml(e,t,n){const{props:r,children:s,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Xr(r,o,u):!!o;if(c&8){const f=t.dynamicProps;for(let h=0;he.__isSuspense;function gi(e,t){t&&t.pendingBranch?U(e)?t.effects.push(...e):t.effects.push(e):ul(e)}function On(e,t,n=ue,r=!1){if(n){const s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Ze();const l=Bt(n),c=xe(t,n,e,o);return l(),et(),c});return r?s.unshift(i):s.push(i),i}}const Ve=e=>(t,n=ue)=>{(!kt||e==="sp")&&On(e,(...r)=>t(...r),n)},vl=Ve("bm"),Ct=Ve("m"),bl=Ve("bu"),wl=Ve("u"),mi=Ve("bum"),In=Ve("um"),El=Ve("sp"),Cl=Ve("rtg"),Sl=Ve("rtc");function xl(e,t=ue){On("ec",e,t)}function Le(e,t,n,r){const s=e.dirs,i=t&&t.dirs;for(let o=0;ot(o,l,void 0,i));else{const o=Object.keys(e);s=new Array(o.length);for(let l=0,c=o.length;l!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function za(e){W(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:i,suspensible:o=!0,onError:l}=e;let c=null,u,f=0;const h=()=>(f++,c=null,m()),m=()=>{let E;return c||(E=c=t().catch(A=>{if(A=A instanceof Error?A:new Error(String(A)),l)return new Promise((L,B)=>{l(A,()=>L(h()),()=>B(A),f+1)});throw A}).then(A=>E!==c&&c?c:(A&&(A.__esModule||A[Symbol.toStringTag]==="Module")&&(A=A.default),u=A,A)))};return Rr({name:"AsyncComponentWrapper",__asyncLoader:m,get __asyncResolved(){return u},setup(){const E=ue;if(u)return()=>Dn(u,E);const A=D=>{c=null,Vt(D,E,13,!r)};if(o&&E.suspense||kt)return m().then(D=>()=>Dn(D,E)).catch(D=>(A(D),()=>r?se(r,{error:D}):null));const L=oe(!1),B=oe(),q=oe(!!s);return s&&setTimeout(()=>{q.value=!1},s),i!=null&&setTimeout(()=>{if(!L.value&&!B.value){const D=new Error(`Async component timed out after ${i}ms.`);A(D),B.value=D}},i),m().then(()=>{L.value=!0,E.parent&&Ut(E.parent.vnode)&&(E.parent.effect.dirty=!0,Tn(E.parent.update))}).catch(D=>{A(D),B.value=D}),()=>{if(L.value&&u)return Dn(u,E);if(B.value&&r)return se(r,{error:B.value});if(n&&!q.value)return se(n)}}})}function Dn(e,t){const{ref:n,props:r,children:s,ce:i}=t.vnode,o=se(e,r,s);return o.ref=n,o.ce=i,delete t.vnode.ce,o}function Xa(e,t,n={},r,s){if(he.isCE||he.parent&&vt(he.parent)&&he.parent.isCE)return t!=="default"&&(n.name=t),se("slot",n,r&&r());let i=e[t];i&&i._c&&(i._d=!1),ji();const o=i&&yi(i(n)),l=Vi(_e,{key:n.key||o&&o.key||`_${t}`},o||(r?r():[]),o&&e._===1?64:-2);return!s&&l.scopeId&&(l.slotScopeIds=[l.scopeId+"-s"]),i&&i._c&&(i._d=!0),l}function yi(e){return e.some(t=>yn(t)?!(t.type===me||t.type===_e&&!yi(t.children)):!0)?e:null}function Ya(e,t){const n={};for(const r in e)n[/[A-Z]/.test(r)?`on:${r}`:sn(r)]=e[r];return n}const or=e=>e?Ki(e)?Pr(e):or(e.parent):null,Ot=le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>or(e.parent),$root:e=>or(e.root),$emit:e=>e.emit,$options:e=>Or(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Tn(e.update)}),$nextTick:e=>e.n||(e.n=xn.bind(e.proxy)),$watch:e=>Xl.bind(e)}),Vn=(e,t)=>e!==te&&!e.__isScriptSetup&&Y(e,t),Tl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:i,accessCache:o,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const E=o[t];if(E!==void 0)switch(E){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(Vn(r,t))return o[t]=1,r[t];if(s!==te&&Y(s,t))return o[t]=2,s[t];if((u=e.propsOptions[0])&&Y(u,t))return o[t]=3,i[t];if(n!==te&&Y(n,t))return o[t]=4,n[t];lr&&(o[t]=0)}}const f=Ot[t];let h,m;if(f)return t==="$attrs"&&ve(e.attrs,"get",""),f(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&Y(n,t))return o[t]=4,n[t];if(m=c.config.globalProperties,Y(m,t))return m[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return Vn(s,t)?(s[t]=n,!0):r!==te&&Y(r,t)?(r[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},o){let l;return!!n[o]||e!==te&&Y(e,o)||Vn(t,o)||(l=i[0])&&Y(l,o)||Y(r,o)||Y(Ot,o)||Y(s.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ja(){return Al().slots}function Al(){const e=Pn();return e.setupContext||(e.setupContext=qi(e))}function Jr(e){return U(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let lr=!0;function Rl(e){const t=Or(e),n=e.proxy,r=e.ctx;lr=!1,t.beforeCreate&&Qr(t.beforeCreate,e,"bc");const{data:s,computed:i,methods:o,watch:l,provide:c,inject:u,created:f,beforeMount:h,mounted:m,beforeUpdate:E,updated:A,activated:L,deactivated:B,beforeDestroy:q,beforeUnmount:D,destroyed:g,unmounted:y,render:M,renderTracked:O,renderTriggered:k,errorCaptured:V,serverPrefetch:P,expose:w,inheritAttrs:N,components:x,directives:G,filters:ne}=t;if(u&&Ol(u,r,null),o)for(const X in o){const $=o[X];W($)&&(r[X]=$.bind(n))}if(s){const X=s.call(n,n);Z(X)&&(e.data=Cn(X))}if(lr=!0,i)for(const X in i){const $=i[X],Fe=W($)?$.bind(n,n):W($.get)?$.get.bind(n,n):Se,Kt=!W($)&&W($.set)?$.set.bind(n):Se,tt=re({get:Fe,set:Kt});Object.defineProperty(r,X,{enumerable:!0,configurable:!0,get:()=>tt.value,set:Oe=>tt.value=Oe})}if(l)for(const X in l)_i(l[X],r,n,X);if(c){const X=W(c)?c.call(n):c;Reflect.ownKeys(X).forEach($=>{Fl($,X[$])})}f&&Qr(f,e,"c");function H(X,$){U($)?$.forEach(Fe=>X(Fe.bind(n))):$&&X($.bind(n))}if(H(vl,h),H(Ct,m),H(bl,E),H(wl,A),H(Yl,L),H(Jl,B),H(xl,V),H(Sl,O),H(Cl,k),H(mi,D),H(In,y),H(El,P),U(w))if(w.length){const X=e.exposed||(e.exposed={});w.forEach($=>{Object.defineProperty(X,$,{get:()=>n[$],set:Fe=>n[$]=Fe})})}else e.exposed||(e.exposed={});M&&e.render===Se&&(e.render=M),N!=null&&(e.inheritAttrs=N),x&&(e.components=x),G&&(e.directives=G)}function Ol(e,t,n=Se){U(e)&&(e=cr(e));for(const r in e){const s=e[r];let i;Z(s)?"default"in s?i=bt(s.from||r,s.default,!0):i=bt(s.from||r):i=bt(s),pe(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[r]=i}}function Qr(e,t,n){xe(U(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function _i(e,t,n,r){const s=r.includes(".")?Pi(n,r):()=>n[r];if(ie(e)){const i=t[e];W(i)&&Me(s,i)}else if(W(e))Me(s,e.bind(n));else if(Z(e))if(U(e))e.forEach(i=>_i(i,t,n,r));else{const i=W(e.handler)?e.handler.bind(n):t[e.handler];W(i)&&Me(s,i,e)}}function Or(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(u=>pn(c,u,o,!0)),pn(c,t,o)),Z(t)&&i.set(t,c),c}function pn(e,t,n,r=!1){const{mixins:s,extends:i}=t;i&&pn(e,i,n,!0),s&&s.forEach(o=>pn(e,o,n,!0));for(const o in t)if(!(r&&o==="expose")){const l=Il[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Il={data:Zr,props:es,emits:es,methods:Tt,computed:Tt,beforeCreate:ge,created:ge,beforeMount:ge,mounted:ge,beforeUpdate:ge,updated:ge,beforeDestroy:ge,beforeUnmount:ge,destroyed:ge,unmounted:ge,activated:ge,deactivated:ge,errorCaptured:ge,serverPrefetch:ge,components:Tt,directives:Tt,watch:Pl,provide:Zr,inject:Ll};function Zr(e,t){return t?e?function(){return le(W(e)?e.call(this,this):e,W(t)?t.call(this,this):t)}:t:e}function Ll(e,t){return Tt(cr(e),cr(t))}function cr(e){if(U(e)){const t={};for(let n=0;n1)return n&&W(t)?t.call(r&&r.proxy):t}}const bi={},wi=()=>Object.create(bi),Ei=e=>Object.getPrototypeOf(e)===bi;function $l(e,t,n,r=!1){const s={},i=wi();e.propsDefaults=Object.create(null),Ci(e,t,s,i);for(const o in e.propsOptions[0])o in s||(s[o]=void 0);n?e.props=r?s:Jo(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function Hl(e,t,n,r){const{props:s,attrs:i,vnode:{patchFlag:o}}=e,l=J(s),[c]=e.propsOptions;let u=!1;if((r||o>0)&&!(o&16)){if(o&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[m,E]=Si(h,t,!0);le(o,m),E&&l.push(...E)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return Z(e)&&r.set(e,gt),gt;if(U(i))for(let f=0;f-1,E[1]=L<0||A-1||Y(E,"default"))&&l.push(h)}}}const u=[o,l];return Z(e)&&r.set(e,u),u}function ts(e){return e[0]!=="$"&&!yt(e)}function ns(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function rs(e,t){return ns(e)===ns(t)}function ss(e,t){return U(t)?t.findIndex(n=>rs(n,e)):W(t)&&rs(t,e)?0:-1}const xi=e=>e[0]==="_"||e==="$stable",Ir=e=>U(e)?e.map(Ae):[Ae(e)],jl=(e,t,n)=>{if(t._n)return t;const r=hl((...s)=>Ir(t(...s)),n);return r._c=!1,r},Ti=(e,t,n)=>{const r=e._ctx;for(const s in e){if(xi(s))continue;const i=e[s];if(W(i))t[s]=jl(s,i,r);else if(i!=null){const o=Ir(i);t[s]=()=>o}}},Ai=(e,t)=>{const n=Ir(t);e.slots.default=()=>n},Dl=(e,t)=>{const n=e.slots=wi();if(e.vnode.shapeFlag&32){const r=t._;r?(le(n,t),Ds(n,"_",r,!0)):Ti(t,n)}else t&&Ai(e,t)},Vl=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,o=te;if(r.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(le(s,t),!n&&l===1&&delete s._):(i=!t.$stable,Ti(t,s)),o=t}else t&&(Ai(e,t),o={default:1});if(i)for(const l in s)!xi(l)&&o[l]==null&&delete s[l]};function gn(e,t,n,r,s=!1){if(U(e)){e.forEach((m,E)=>gn(m,t&&(U(t)?t[E]:t),n,r,s));return}if(vt(r)&&!s)return;const i=r.shapeFlag&4?Pr(r.component):r.el,o=s?null:i,{i:l,r:c}=e,u=t&&t.r,f=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(u!=null&&u!==c&&(ie(u)?(f[u]=null,Y(h,u)&&(h[u]=null)):pe(u)&&(u.value=null)),W(c))ze(c,l,12,[o,f]);else{const m=ie(c),E=pe(c);if(m||E){const A=()=>{if(e.f){const L=m?Y(h,c)?h[c]:f[c]:c.value;s?U(L)&&gr(L,i):U(L)?L.includes(i)||L.push(i):m?(f[c]=[i],Y(h,c)&&(h[c]=f[c])):(c.value=[i],e.k&&(f[e.k]=c.value))}else m?(f[c]=o,Y(h,c)&&(h[c]=o)):E&&(c.value=o,e.k&&(f[e.k]=o))};o?(A.id=-1,ye(A,n)):A()}}}let is=!1;const pt=()=>{is||(console.error("Hydration completed but contains mismatches."),is=!0)},Ul=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Bl=e=>e.namespaceURI.includes("MathML"),Jt=e=>{if(Ul(e))return"svg";if(Bl(e))return"mathml"},Qt=e=>e.nodeType===8;function kl(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,f=(g,y)=>{if(!y.hasChildNodes()){n(null,g,y),dn(),y._vnode=g;return}h(y.firstChild,g,null,null,null),dn(),y._vnode=g},h=(g,y,M,O,k,V=!1)=>{V=V||!!y.dynamicChildren;const P=Qt(g)&&g.data==="[",w=()=>L(g,y,M,O,k,P),{type:N,ref:x,shapeFlag:G,patchFlag:ne}=y;let ce=g.nodeType;y.el=g,ne===-2&&(V=!1,y.dynamicChildren=null);let H=null;switch(N){case wt:ce!==3?y.children===""?(c(y.el=s(""),o(g),g),H=g):H=w():(g.data!==y.children&&(pt(),g.data=y.children),H=i(g));break;case me:D(g)?(H=i(g),q(y.el=g.content.firstChild,g,M)):ce!==8||P?H=w():H=i(g);break;case Lt:if(P&&(g=i(g),ce=g.nodeType),ce===1||ce===3){H=g;const X=!y.children.length;for(let $=0;${V=V||!!y.dynamicChildren;const{type:P,props:w,patchFlag:N,shapeFlag:x,dirs:G,transition:ne}=y,ce=P==="input"||P==="option";if(ce||N!==-1){G&&Le(y,null,M,"created");let H=!1;if(D(g)){H=Ri(O,ne)&&M&&M.vnode.props&&M.vnode.props.appear;const $=g.content.firstChild;H&&ne.beforeEnter($),q($,g,M),y.el=g=$}if(x&16&&!(w&&(w.innerHTML||w.textContent))){let $=E(g.firstChild,y,g,M,O,k,V);for(;$;){pt();const Fe=$;$=$.nextSibling,l(Fe)}}else x&8&&g.textContent!==y.children&&(pt(),g.textContent=y.children);if(w)if(ce||!V||N&48)for(const $ in w)(ce&&($.endsWith("value")||$==="indeterminate")||Dt($)&&!yt($)||$[0]===".")&&r(g,$,null,w[$],void 0,void 0,M);else w.onClick&&r(g,"onClick",null,w.onClick,void 0,void 0,M);let X;(X=w&&w.onVnodeBeforeMount)&&Ce(X,M,y),G&&Le(y,null,M,"beforeMount"),((X=w&&w.onVnodeMounted)||G||H)&&gi(()=>{X&&Ce(X,M,y),H&&ne.enter(g),G&&Le(y,null,M,"mounted")},O)}return g.nextSibling},E=(g,y,M,O,k,V,P)=>{P=P||!!y.dynamicChildren;const w=y.children,N=w.length;for(let x=0;x{const{slotScopeIds:P}=y;P&&(k=k?k.concat(P):P);const w=o(g),N=E(i(g),y,w,M,O,k,V);return N&&Qt(N)&&N.data==="]"?i(y.anchor=N):(pt(),c(y.anchor=u("]"),w,N),N)},L=(g,y,M,O,k,V)=>{if(pt(),y.el=null,V){const N=B(g);for(;;){const x=i(g);if(x&&x!==N)l(x);else break}}const P=i(g),w=o(g);return l(g),n(null,y,w,P,M,O,Jt(w),k),P},B=(g,y="[",M="]")=>{let O=0;for(;g;)if(g=i(g),g&&Qt(g)&&(g.data===y&&O++,g.data===M)){if(O===0)return i(g);O--}return g},q=(g,y,M)=>{const O=y.parentNode;O&&O.replaceChild(g,y);let k=M;for(;k;)k.vnode.el===y&&(k.vnode.el=k.subTree.el=g),k=k.parent},D=g=>g.nodeType===1&&g.tagName.toLowerCase()==="template";return[f,h]}const ye=gi;function Kl(e){return Wl(e,kl)}function Wl(e,t){const n=Vs();n.__VUE__=!0;const{insert:r,remove:s,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:f,parentNode:h,nextSibling:m,setScopeId:E=Se,insertStaticContent:A}=e,L=(a,d,p,_=null,v=null,S=null,R=void 0,C=null,T=!!d.dynamicChildren)=>{if(a===d)return;a&&!lt(a,d)&&(_=Wt(a),Oe(a,v,S,!0),a=null),d.patchFlag===-2&&(T=!1,d.dynamicChildren=null);const{type:b,ref:I,shapeFlag:j}=d;switch(b){case wt:B(a,d,p,_);break;case me:q(a,d,p,_);break;case Lt:a==null&&D(d,p,_,R);break;case _e:x(a,d,p,_,v,S,R,C,T);break;default:j&1?M(a,d,p,_,v,S,R,C,T):j&6?G(a,d,p,_,v,S,R,C,T):(j&64||j&128)&&b.process(a,d,p,_,v,S,R,C,T,dt)}I!=null&&v&&gn(I,a&&a.ref,S,d||a,!d)},B=(a,d,p,_)=>{if(a==null)r(d.el=l(d.children),p,_);else{const v=d.el=a.el;d.children!==a.children&&u(v,d.children)}},q=(a,d,p,_)=>{a==null?r(d.el=c(d.children||""),p,_):d.el=a.el},D=(a,d,p,_)=>{[a.el,a.anchor]=A(a.children,d,p,_,a.el,a.anchor)},g=({el:a,anchor:d},p,_)=>{let v;for(;a&&a!==d;)v=m(a),r(a,p,_),a=v;r(d,p,_)},y=({el:a,anchor:d})=>{let p;for(;a&&a!==d;)p=m(a),s(a),a=p;s(d)},M=(a,d,p,_,v,S,R,C,T)=>{d.type==="svg"?R="svg":d.type==="math"&&(R="mathml"),a==null?O(d,p,_,v,S,R,C,T):P(a,d,v,S,R,C,T)},O=(a,d,p,_,v,S,R,C)=>{let T,b;const{props:I,shapeFlag:j,transition:F,dirs:K}=a;if(T=a.el=o(a.type,S,I&&I.is,I),j&8?f(T,a.children):j&16&&V(a.children,T,null,_,v,Un(a,S),R,C),K&&Le(a,null,_,"created"),k(T,a,a.scopeId,R,_),I){for(const ee in I)ee!=="value"&&!yt(ee)&&i(T,ee,null,I[ee],S,a.children,_,v,$e);"value"in I&&i(T,"value",null,I.value,S),(b=I.onVnodeBeforeMount)&&Ce(b,_,a)}K&&Le(a,null,_,"beforeMount");const z=Ri(v,F);z&&F.beforeEnter(T),r(T,d,p),((b=I&&I.onVnodeMounted)||z||K)&&ye(()=>{b&&Ce(b,_,a),z&&F.enter(T),K&&Le(a,null,_,"mounted")},v)},k=(a,d,p,_,v)=>{if(p&&E(a,p),_)for(let S=0;S<_.length;S++)E(a,_[S]);if(v){let S=v.subTree;if(d===S){const R=v.vnode;k(a,R,R.scopeId,R.slotScopeIds,v.parent)}}},V=(a,d,p,_,v,S,R,C,T=0)=>{for(let b=T;b{const C=d.el=a.el;let{patchFlag:T,dynamicChildren:b,dirs:I}=d;T|=a.patchFlag&16;const j=a.props||te,F=d.props||te;let K;if(p&&nt(p,!1),(K=F.onVnodeBeforeUpdate)&&Ce(K,p,d,a),I&&Le(d,a,p,"beforeUpdate"),p&&nt(p,!0),b?w(a.dynamicChildren,b,C,p,_,Un(d,v),S):R||$(a,d,C,null,p,_,Un(d,v),S,!1),T>0){if(T&16)N(C,d,j,F,p,_,v);else if(T&2&&j.class!==F.class&&i(C,"class",null,F.class,v),T&4&&i(C,"style",j.style,F.style,v),T&8){const z=d.dynamicProps;for(let ee=0;ee{K&&Ce(K,p,d,a),I&&Le(d,a,p,"updated")},_)},w=(a,d,p,_,v,S,R)=>{for(let C=0;C{if(p!==_){if(p!==te)for(const C in p)!yt(C)&&!(C in _)&&i(a,C,p[C],null,R,d.children,v,S,$e);for(const C in _){if(yt(C))continue;const T=_[C],b=p[C];T!==b&&C!=="value"&&i(a,C,b,T,R,d.children,v,S,$e)}"value"in _&&i(a,"value",p.value,_.value,R)}},x=(a,d,p,_,v,S,R,C,T)=>{const b=d.el=a?a.el:l(""),I=d.anchor=a?a.anchor:l("");let{patchFlag:j,dynamicChildren:F,slotScopeIds:K}=d;K&&(C=C?C.concat(K):K),a==null?(r(b,p,_),r(I,p,_),V(d.children||[],p,I,v,S,R,C,T)):j>0&&j&64&&F&&a.dynamicChildren?(w(a.dynamicChildren,F,p,v,S,R,C),(d.key!=null||v&&d===v.subTree)&&Oi(a,d,!0)):$(a,d,p,I,v,S,R,C,T)},G=(a,d,p,_,v,S,R,C,T)=>{d.slotScopeIds=C,a==null?d.shapeFlag&512?v.ctx.activate(d,p,_,R,T):ne(d,p,_,v,S,R,T):ce(a,d,T)},ne=(a,d,p,_,v,S,R)=>{const C=a.component=ac(a,_,v);if(Ut(a)&&(C.ctx.renderer=dt),uc(C),C.asyncDep){if(v&&v.registerDep(C,H,R),!a.el){const T=C.subTree=se(me);q(null,T,d,p)}}else H(C,a,d,p,v,S,R)},ce=(a,d,p)=>{const _=d.component=a.component;if(ml(a,d,p))if(_.asyncDep&&!_.asyncResolved){X(_,d,p);return}else _.next=d,al(_.update),_.effect.dirty=!0,_.update();else d.el=a.el,_.vnode=d},H=(a,d,p,_,v,S,R)=>{const C=()=>{if(a.isMounted){let{next:I,bu:j,u:F,parent:K,vnode:z}=a;{const ht=Ii(a);if(ht){I&&(I.el=z.el,X(a,I,R)),ht.asyncDep.then(()=>{a.isUnmounted||C()});return}}let ee=I,Q;nt(a,!1),I?(I.el=z.el,X(a,I,R)):I=z,j&&$n(j),(Q=I.props&&I.props.onVnodeBeforeUpdate)&&Ce(Q,K,I,z),nt(a,!0);const ae=jn(a),Te=a.subTree;a.subTree=ae,L(Te,ae,h(Te.el),Wt(Te),a,v,S),I.el=ae.el,ee===null&&yl(a,ae.el),F&&ye(F,v),(Q=I.props&&I.props.onVnodeUpdated)&&ye(()=>Ce(Q,K,I,z),v)}else{let I;const{el:j,props:F}=d,{bm:K,m:z,parent:ee}=a,Q=vt(d);if(nt(a,!1),K&&$n(K),!Q&&(I=F&&F.onVnodeBeforeMount)&&Ce(I,ee,d),nt(a,!0),j&&Fn){const ae=()=>{a.subTree=jn(a),Fn(j,a.subTree,a,v,null)};Q?d.type.__asyncLoader().then(()=>!a.isUnmounted&&ae()):ae()}else{const ae=a.subTree=jn(a);L(null,ae,p,_,a,v,S),d.el=ae.el}if(z&&ye(z,v),!Q&&(I=F&&F.onVnodeMounted)){const ae=d;ye(()=>Ce(I,ee,ae),v)}(d.shapeFlag&256||ee&&vt(ee.vnode)&&ee.vnode.shapeFlag&256)&&a.a&&ye(a.a,v),a.isMounted=!0,d=p=_=null}},T=a.effect=new vr(C,Se,()=>Tn(b),a.scope),b=a.update=()=>{T.dirty&&T.run()};b.id=a.uid,nt(a,!0),b()},X=(a,d,p)=>{d.component=a;const _=a.vnode.props;a.vnode=d,a.next=null,Hl(a,d.props,_,p),Vl(a,d.children,p),Ze(),zr(a),et()},$=(a,d,p,_,v,S,R,C,T=!1)=>{const b=a&&a.children,I=a?a.shapeFlag:0,j=d.children,{patchFlag:F,shapeFlag:K}=d;if(F>0){if(F&128){Kt(b,j,p,_,v,S,R,C,T);return}else if(F&256){Fe(b,j,p,_,v,S,R,C,T);return}}K&8?(I&16&&$e(b,v,S),j!==b&&f(p,j)):I&16?K&16?Kt(b,j,p,_,v,S,R,C,T):$e(b,v,S,!0):(I&8&&f(p,""),K&16&&V(j,p,_,v,S,R,C,T))},Fe=(a,d,p,_,v,S,R,C,T)=>{a=a||gt,d=d||gt;const b=a.length,I=d.length,j=Math.min(b,I);let F;for(F=0;FI?$e(a,v,S,!0,!1,j):V(d,p,_,v,S,R,C,T,j)},Kt=(a,d,p,_,v,S,R,C,T)=>{let b=0;const I=d.length;let j=a.length-1,F=I-1;for(;b<=j&&b<=F;){const K=a[b],z=d[b]=T?qe(d[b]):Ae(d[b]);if(lt(K,z))L(K,z,p,null,v,S,R,C,T);else break;b++}for(;b<=j&&b<=F;){const K=a[j],z=d[F]=T?qe(d[F]):Ae(d[F]);if(lt(K,z))L(K,z,p,null,v,S,R,C,T);else break;j--,F--}if(b>j){if(b<=F){const K=F+1,z=KF)for(;b<=j;)Oe(a[b],v,S,!0),b++;else{const K=b,z=b,ee=new Map;for(b=z;b<=F;b++){const be=d[b]=T?qe(d[b]):Ae(d[b]);be.key!=null&&ee.set(be.key,b)}let Q,ae=0;const Te=F-z+1;let ht=!1,Hr=0;const St=new Array(Te);for(b=0;b=Te){Oe(be,v,S,!0);continue}let Ie;if(be.key!=null)Ie=ee.get(be.key);else for(Q=z;Q<=F;Q++)if(St[Q-z]===0&<(be,d[Q])){Ie=Q;break}Ie===void 0?Oe(be,v,S,!0):(St[Ie-z]=b+1,Ie>=Hr?Hr=Ie:ht=!0,L(be,d[Ie],p,null,v,S,R,C,T),ae++)}const jr=ht?ql(St):gt;for(Q=jr.length-1,b=Te-1;b>=0;b--){const be=z+b,Ie=d[be],Dr=be+1{const{el:S,type:R,transition:C,children:T,shapeFlag:b}=a;if(b&6){tt(a.component.subTree,d,p,_);return}if(b&128){a.suspense.move(d,p,_);return}if(b&64){R.move(a,d,p,dt);return}if(R===_e){r(S,d,p);for(let j=0;jC.enter(S),v);else{const{leave:j,delayLeave:F,afterLeave:K}=C,z=()=>r(S,d,p),ee=()=>{j(S,()=>{z(),K&&K()})};F?F(S,z,ee):ee()}else r(S,d,p)},Oe=(a,d,p,_=!1,v=!1)=>{const{type:S,props:R,ref:C,children:T,dynamicChildren:b,shapeFlag:I,patchFlag:j,dirs:F,memoIndex:K}=a;if(j===-2&&(v=!1),C!=null&&gn(C,null,p,a,!0),K!=null&&(d.renderCache[K]=void 0),I&256){d.ctx.deactivate(a);return}const z=I&1&&F,ee=!vt(a);let Q;if(ee&&(Q=R&&R.onVnodeBeforeUnmount)&&Ce(Q,d,a),I&6)ho(a.component,p,_);else{if(I&128){a.suspense.unmount(p,_);return}z&&Le(a,null,d,"beforeUnmount"),I&64?a.type.remove(a,d,p,dt,_):b&&(S!==_e||j>0&&j&64)?$e(b,d,p,!1,!0):(S===_e&&j&384||!v&&I&16)&&$e(T,d,p),_&&Fr(a)}(ee&&(Q=R&&R.onVnodeUnmounted)||z)&&ye(()=>{Q&&Ce(Q,d,a),z&&Le(a,null,d,"unmounted")},p)},Fr=a=>{const{type:d,el:p,anchor:_,transition:v}=a;if(d===_e){fo(p,_);return}if(d===Lt){y(a);return}const S=()=>{s(p),v&&!v.persisted&&v.afterLeave&&v.afterLeave()};if(a.shapeFlag&1&&v&&!v.persisted){const{leave:R,delayLeave:C}=v,T=()=>R(p,S);C?C(a.el,S,T):T()}else S()},fo=(a,d)=>{let p;for(;a!==d;)p=m(a),s(a),a=p;s(d)},ho=(a,d,p)=>{const{bum:_,scope:v,update:S,subTree:R,um:C,m:T,a:b}=a;os(T),os(b),_&&$n(_),v.stop(),S&&(S.active=!1,Oe(R,a,d,p)),C&&ye(C,d),ye(()=>{a.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},$e=(a,d,p,_=!1,v=!1,S=0)=>{for(let R=S;Ra.shapeFlag&6?Wt(a.component.subTree):a.shapeFlag&128?a.suspense.next():m(a.anchor||a.el);let Mn=!1;const $r=(a,d,p)=>{a==null?d._vnode&&Oe(d._vnode,null,null,!0):L(d._vnode||null,a,d,null,null,null,p),Mn||(Mn=!0,zr(),dn(),Mn=!1),d._vnode=a},dt={p:L,um:Oe,m:tt,r:Fr,mt:ne,mc:V,pc:$,pbc:w,n:Wt,o:e};let Nn,Fn;return t&&([Nn,Fn]=t(dt)),{render:$r,hydrate:Nn,createApp:Nl($r,Nn)}}function Un({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function nt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Ri(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Oi(e,t,n=!1){const r=e.children,s=t.children;if(U(r)&&U(s))for(let i=0;i>1,e[n[l]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ii(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ii(t)}function os(e){if(e)for(let t=0;tbt(Gl);function Li(e,t){return Ln(e,null,t)}function Qa(e,t){return Ln(e,null,{flush:"post"})}const Zt={};function Me(e,t,n){return Ln(e,t,n)}function Ln(e,t,{immediate:n,deep:r,flush:s,once:i,onTrack:o,onTrigger:l}=te){if(t&&i){const O=t;t=(...k)=>{O(...k),M()}}const c=ue,u=O=>r===!0?O:ot(O,r===!1?1:void 0);let f,h=!1,m=!1;if(pe(e)?(f=()=>e.value,h=fn(e)):At(e)?(f=()=>u(e),h=!0):U(e)?(m=!0,h=e.some(O=>At(O)||fn(O)),f=()=>e.map(O=>{if(pe(O))return O.value;if(At(O))return u(O);if(W(O))return ze(O,c,2)})):W(e)?t?f=()=>ze(e,c,2):f=()=>(E&&E(),xe(e,c,3,[A])):f=Se,t&&r){const O=f;f=()=>ot(O())}let E,A=O=>{E=g.onStop=()=>{ze(O,c,4),E=g.onStop=void 0}},L;if(kt)if(A=Se,t?n&&xe(t,c,3,[f(),m?[]:void 0,A]):f(),s==="sync"){const O=zl();L=O.__watcherHandles||(O.__watcherHandles=[])}else return Se;let B=m?new Array(e.length).fill(Zt):Zt;const q=()=>{if(!(!g.active||!g.dirty))if(t){const O=g.run();(r||h||(m?O.some((k,V)=>Ye(k,B[V])):Ye(O,B)))&&(E&&E(),xe(t,c,3,[O,B===Zt?void 0:m&&B[0]===Zt?[]:B,A]),B=O)}else g.run()};q.allowRecurse=!!t;let D;s==="sync"?D=q:s==="post"?D=()=>ye(q,c&&c.suspense):(q.pre=!0,c&&(q.id=c.uid),D=()=>Tn(q));const g=new vr(f,Se,D),y=Ks(),M=()=>{g.stop(),y&&gr(y.effects,g)};return t?n?q():B=g.run():s==="post"?ye(g.run.bind(g),c&&c.suspense):g.run(),L&&L.push(M),M}function Xl(e,t,n){const r=this.proxy,s=ie(e)?e.includes(".")?Pi(r,e):()=>r[e]:e.bind(r,r);let i;W(t)?i=t:(i=t.handler,n=t);const o=Bt(this),l=Ln(s,i.bind(r),n);return o(),l}function Pi(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s{ot(r,t,n)});else if(js(e)){for(const r in e)ot(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&ot(e[r],t,n)}return e}const Ut=e=>e.type.__isKeepAlive;function Yl(e,t){Mi(e,"a",t)}function Jl(e,t){Mi(e,"da",t)}function Mi(e,t,n=ue){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(On(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Ut(s.parent.vnode)&&Ql(r,t,n,s),s=s.parent}}function Ql(e,t,n,r){const s=On(t,e,r,!0);In(()=>{gr(r[t],s)},n)}const We=Symbol("_leaveCb"),en=Symbol("_enterCb");function Zl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ct(()=>{e.isMounted=!0}),mi(()=>{e.isUnmounting=!0}),e}const Ee=[Function,Array],Ni={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ee,onEnter:Ee,onAfterEnter:Ee,onEnterCancelled:Ee,onBeforeLeave:Ee,onLeave:Ee,onAfterLeave:Ee,onLeaveCancelled:Ee,onBeforeAppear:Ee,onAppear:Ee,onAfterAppear:Ee,onAppearCancelled:Ee},Fi=e=>{const t=e.subTree;return t.component?Fi(t.component):t},ec={name:"BaseTransition",props:Ni,setup(e,{slots:t}){const n=Pn(),r=Zl();return()=>{const s=t.default&&Hi(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){for(const m of s)if(m.type!==me){i=m;break}}const o=J(e),{mode:l}=o;if(r.isLeaving)return Bn(i);const c=ls(i);if(!c)return Bn(i);let u=ur(c,o,r,n,m=>u=m);mn(c,u);const f=n.subTree,h=f&&ls(f);if(h&&h.type!==me&&!lt(c,h)&&Fi(n).type!==me){const m=ur(h,o,r,n);if(mn(h,m),l==="out-in"&&c.type!==me)return r.isLeaving=!0,m.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Bn(i);l==="in-out"&&c.type!==me&&(m.delayLeave=(E,A,L)=>{const B=$i(r,h);B[String(h.key)]=h,E[We]=()=>{A(),E[We]=void 0,delete u.delayedLeave},u.delayedLeave=L})}return i}}},tc=ec;function $i(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function ur(e,t,n,r,s){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:f,onEnterCancelled:h,onBeforeLeave:m,onLeave:E,onAfterLeave:A,onLeaveCancelled:L,onBeforeAppear:B,onAppear:q,onAfterAppear:D,onAppearCancelled:g}=t,y=String(e.key),M=$i(n,e),O=(P,w)=>{P&&xe(P,r,9,w)},k=(P,w)=>{const N=w[1];O(P,w),U(P)?P.every(x=>x.length<=1)&&N():P.length<=1&&N()},V={mode:o,persisted:l,beforeEnter(P){let w=c;if(!n.isMounted)if(i)w=B||c;else return;P[We]&&P[We](!0);const N=M[y];N&<(e,N)&&N.el[We]&&N.el[We](),O(w,[P])},enter(P){let w=u,N=f,x=h;if(!n.isMounted)if(i)w=q||u,N=D||f,x=g||h;else return;let G=!1;const ne=P[en]=ce=>{G||(G=!0,ce?O(x,[P]):O(N,[P]),V.delayedLeave&&V.delayedLeave(),P[en]=void 0)};w?k(w,[P,ne]):ne()},leave(P,w){const N=String(e.key);if(P[en]&&P[en](!0),n.isUnmounting)return w();O(m,[P]);let x=!1;const G=P[We]=ne=>{x||(x=!0,w(),ne?O(L,[P]):O(A,[P]),P[We]=void 0,M[N]===e&&delete M[N])};M[N]=e,E?k(E,[P,G]):G()},clone(P){const w=ur(P,t,n,r,s);return s&&s(w),w}};return V}function Bn(e){if(Ut(e))return e=Je(e),e.children=null,e}function ls(e){if(!Ut(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&W(n.default))return n.default()}}function mn(e,t){e.shapeFlag&6&&e.component?mn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Hi(e,t=!1,n){let r=[],s=0;for(let i=0;i1)for(let i=0;ie.__isTeleport,_e=Symbol.for("v-fgt"),wt=Symbol.for("v-txt"),me=Symbol.for("v-cmt"),Lt=Symbol.for("v-stc"),Pt=[];let Re=null;function ji(e=!1){Pt.push(Re=e?null:[])}function rc(){Pt.pop(),Re=Pt[Pt.length-1]||null}let Ht=1;function cs(e){Ht+=e}function Di(e){return e.dynamicChildren=Ht>0?Re||gt:null,rc(),Ht>0&&Re&&Re.push(e),e}function Za(e,t,n,r,s,i){return Di(Bi(e,t,n,r,s,i,!0))}function Vi(e,t,n,r,s){return Di(se(e,t,n,r,s,!0))}function yn(e){return e?e.__v_isVNode===!0:!1}function lt(e,t){return e.type===t.type&&e.key===t.key}const Ui=({key:e})=>e??null,ln=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ie(e)||pe(e)||W(e)?{i:he,r:e,k:t,f:!!n}:e:null);function Bi(e,t=null,n=null,r=0,s=null,i=e===_e?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ui(t),ref:t&&ln(t),scopeId:Rn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:he};return l?(Lr(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),Ht>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const se=sc;function sc(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===hi)&&(e=me),yn(e)){const l=Je(e,t,!0);return n&&Lr(l,n),Ht>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag=-2,l}if(pc(e)&&(e=e.__vccOpts),t){t=ic(t);let{class:l,style:c}=t;l&&!ie(l)&&(t.class=_r(l)),Z(c)&&(ni(c)&&!U(c)&&(c=le({},c)),t.style=yr(c))}const o=ie(e)?1:_l(e)?128:nc(e)?64:Z(e)?4:W(e)?2:0;return Bi(e,t,n,r,s,o,i,!0)}function ic(e){return e?ni(e)||Ei(e)?le({},e):e:null}function Je(e,t,n=!1,r=!1){const{props:s,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?oc(s||{},t):s,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Ui(u),ref:t&&t.ref?n&&i?U(i)?i.concat(ln(t)):[i,ln(t)]:ln(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==_e?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Je(e.ssContent),ssFallback:e.ssFallback&&Je(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&mn(f,c.clone(f)),f}function ki(e=" ",t=0){return se(wt,null,e,t)}function eu(e,t){const n=se(Lt,null,e);return n.staticCount=t,n}function tu(e="",t=!1){return t?(ji(),Vi(me,null,e)):se(me,null,e)}function Ae(e){return e==null||typeof e=="boolean"?se(me):U(e)?se(_e,null,e.slice()):typeof e=="object"?qe(e):se(wt,null,String(e))}function qe(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Je(e)}function Lr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(U(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Lr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!Ei(t)?t._ctx=he:s===3&&he&&(he.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else W(t)?(t={default:t,_ctx:he},n=32):(t=String(t),r&64?(n=16,t=[ki(t)]):n=8);e.children=t,e.shapeFlag|=n}function oc(...e){const t={};for(let n=0;nue||he;let _n,fr;{const e=Vs(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),i=>{s.length>1?s.forEach(o=>o(i)):s[0](i)}};_n=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),fr=t("__VUE_SSR_SETTERS__",n=>kt=n)}const Bt=e=>{const t=ue;return _n(e),e.scope.on(),()=>{e.scope.off(),_n(t)}},as=()=>{ue&&ue.scope.off(),_n(null)};function Ki(e){return e.vnode.shapeFlag&4}let kt=!1;function uc(e,t=!1){t&&fr(t);const{props:n,children:r}=e.vnode,s=Ki(e);$l(e,n,s,t),Dl(e,r);const i=s?fc(e,t):void 0;return t&&fr(!1),i}function fc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Tl);const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?qi(e):null,i=Bt(e);Ze();const o=ze(r,e,0,[e.props,s]);if(et(),i(),$s(o)){if(o.then(as,as),t)return o.then(l=>{us(e,l,t)}).catch(l=>{Vt(l,e,0)});e.asyncDep=o}else us(e,o,t)}else Wi(e,t)}function us(e,t,n){W(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=li(t)),Wi(e,n)}let fs;function Wi(e,t,n){const r=e.type;if(!e.render){if(!t&&fs&&!r.render){const s=r.template||Or(e).template;if(s){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,u=le(le({isCustomElement:i,delimiters:l},o),c);r.render=fs(s,u)}}e.render=r.render||Se}{const s=Bt(e);Ze();try{Rl(e)}finally{et(),s()}}}const dc={get(e,t){return ve(e,"get",""),e[t]}};function qi(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,dc),slots:e.slots,emit:e.emit,expose:t}}function Pr(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(li(on(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ot)return Ot[n](e)},has(t,n){return n in t||n in Ot}})):e.proxy}function hc(e,t=!0){return W(e)?e.displayName||e.name:e.name||t&&e.__name}function pc(e){return W(e)&&"__vccOpts"in e}const re=(e,t)=>Qo(e,t,kt);function dr(e,t,n){const r=arguments.length;return r===2?Z(t)&&!U(t)?yn(t)?se(e,null,[t]):se(e,t):se(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&yn(n)&&(n=[n]),se(e,t,n))}const gc="3.4.31";/** +* @vue/runtime-dom v3.4.31 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const mc="http://www.w3.org/2000/svg",yc="http://www.w3.org/1998/Math/MathML",He=typeof document<"u"?document:null,ds=He&&He.createElement("template"),_c={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?He.createElementNS(mc,e):t==="mathml"?He.createElementNS(yc,e):n?He.createElement(e,{is:n}):He.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>He.createTextNode(e),createComment:e=>He.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>He.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,i){const o=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{ds.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=ds.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Be="transition",xt="animation",jt=Symbol("_vtc"),Gi=(e,{slots:t})=>dr(tc,vc(e),t);Gi.displayName="Transition";const zi={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Gi.props=le({},Ni,zi);const rt=(e,t=[])=>{U(e)?e.forEach(n=>n(...t)):e&&e(...t)},hs=e=>e?U(e)?e.some(t=>t.length>1):e.length>1:!1;function vc(e){const t={};for(const x in e)x in zi||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:E=`${n}-leave-to`}=e,A=bc(s),L=A&&A[0],B=A&&A[1],{onBeforeEnter:q,onEnter:D,onEnterCancelled:g,onLeave:y,onLeaveCancelled:M,onBeforeAppear:O=q,onAppear:k=D,onAppearCancelled:V=g}=t,P=(x,G,ne)=>{st(x,G?f:l),st(x,G?u:o),ne&&ne()},w=(x,G)=>{x._isLeaving=!1,st(x,h),st(x,E),st(x,m),G&&G()},N=x=>(G,ne)=>{const ce=x?k:D,H=()=>P(G,x,ne);rt(ce,[G,H]),ps(()=>{st(G,x?c:i),ke(G,x?f:l),hs(ce)||gs(G,r,L,H)})};return le(t,{onBeforeEnter(x){rt(q,[x]),ke(x,i),ke(x,o)},onBeforeAppear(x){rt(O,[x]),ke(x,c),ke(x,u)},onEnter:N(!1),onAppear:N(!0),onLeave(x,G){x._isLeaving=!0;const ne=()=>w(x,G);ke(x,h),ke(x,m),Cc(),ps(()=>{x._isLeaving&&(st(x,h),ke(x,E),hs(y)||gs(x,r,B,ne))}),rt(y,[x,ne])},onEnterCancelled(x){P(x,!1),rt(g,[x])},onAppearCancelled(x){P(x,!0),rt(V,[x])},onLeaveCancelled(x){w(x),rt(M,[x])}})}function bc(e){if(e==null)return null;if(Z(e))return[kn(e.enter),kn(e.leave)];{const t=kn(e);return[t,t]}}function kn(e){return bo(e)}function ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[jt]||(e[jt]=new Set)).add(t)}function st(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[jt];n&&(n.delete(t),n.size||(e[jt]=void 0))}function ps(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let wc=0;function gs(e,t,n,r){const s=e._endId=++wc,i=()=>{s===e._endId&&r()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=Ec(e,t);if(!o)return r();const u=o+"end";let f=0;const h=()=>{e.removeEventListener(u,m),i()},m=E=>{E.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[A]||"").split(", "),s=r(`${Be}Delay`),i=r(`${Be}Duration`),o=ms(s,i),l=r(`${xt}Delay`),c=r(`${xt}Duration`),u=ms(l,c);let f=null,h=0,m=0;t===Be?o>0&&(f=Be,h=o,m=i.length):t===xt?u>0&&(f=xt,h=u,m=c.length):(h=Math.max(o,u),f=h>0?o>u?Be:xt:null,m=f?f===Be?i.length:c.length:0);const E=f===Be&&/\b(transform|all)(,|$)/.test(r(`${Be}Property`).toString());return{type:f,timeout:h,propCount:m,hasTransform:E}}function ms(e,t){for(;e.lengthys(n)+ys(e[r])))}function ys(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Cc(){return document.body.offsetHeight}function Sc(e,t,n){const r=e[jt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const _s=Symbol("_vod"),xc=Symbol("_vsh"),Tc=Symbol(""),Ac=/(^|;)\s*display\s*:/;function Rc(e,t,n){const r=e.style,s=ie(n);let i=!1;if(n&&!s){if(t)if(ie(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&cn(r,l,"")}else for(const o in t)n[o]==null&&cn(r,o,"");for(const o in n)o==="display"&&(i=!0),cn(r,o,n[o])}else if(s){if(t!==n){const o=r[Tc];o&&(n+=";"+o),r.cssText=n,i=Ac.test(n)}}else t&&e.removeAttribute("style");_s in e&&(e[_s]=i?r.display:"",e[xc]&&(r.display="none"))}const vs=/\s*!important$/;function cn(e,t,n){if(U(n))n.forEach(r=>cn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Oc(e,t);vs.test(n)?e.setProperty(ft(r),n.replace(vs,""),"important"):e[r]=n}}const bs=["Webkit","Moz","ms"],Kn={};function Oc(e,t){const n=Kn[t];if(n)return n;let r=Ne(t);if(r!=="filter"&&r in e)return Kn[t]=r;r=wn(r);for(let s=0;sWn||(Fc.then(()=>Wn=0),Wn=Date.now());function Hc(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;xe(jc(r,n.value),t,5,[r])};return n.value=e,n.attached=$c(),n}function jc(e,t){if(U(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const xs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Dc=(e,t,n,r,s,i,o,l,c)=>{const u=s==="svg";t==="class"?Sc(e,r,u):t==="style"?Rc(e,n,r):Dt(t)?pr(t)||Mc(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Vc(e,t,r,u))?(Ic(e,t,r,i,o,l,c),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Es(e,t,r,u,o,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Es(e,t,r,u))};function Vc(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&xs(t)&&W(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return xs(t)&&ie(n)?!1:t in e}const Uc=["ctrl","shift","alt","meta"],Bc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Uc.some(n=>e[`${n}Key`]&&!t.includes(n))},nu=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const i=ft(s.key);if(t.some(o=>o===i||kc[o]===i))return e(s)})},Kc=le({patchProp:Dc},_c);let qn,Ts=!1;function Wc(){return qn=Ts?qn:Kl(Kc),Ts=!0,qn}const su=(...e)=>{const t=Wc().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Gc(r);if(s)return n(s,!0,qc(s))},t};function qc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Gc(e){return ie(e)?document.querySelector(e):e}const iu=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},zc="modulepreload",Xc=function(e){return"/"+e},As={},ou=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),o=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));s=Promise.all(n.map(l=>{if(l=Xc(l),l in As)return;As[l]=!0;const c=l.endsWith(".css"),u=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${u}`))return;const f=document.createElement("link");if(f.rel=c?"stylesheet":zc,c||(f.as="script",f.crossOrigin=""),f.href=l,o&&f.setAttribute("nonce",o),document.head.appendChild(f),c)return new Promise((h,m)=>{f.addEventListener("load",h),f.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${l}`)))})}))}return s.then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})},Yc=window.__VP_SITE_DATA__;function Mr(e){return Ks()?(Io(e),!0):!1}function Xe(e){return typeof e=="function"?e():oi(e)}const Xi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Jc=Object.prototype.toString,Qc=e=>Jc.call(e)==="[object Object]",Yi=()=>{},Rs=Zc();function Zc(){var e,t;return Xi&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ea(e,t){function n(...r){return new Promise((s,i)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(i)})}return n}const Ji=e=>e();function ta(e=Ji){const t=oe(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...i)=>{t.value&&e(...i)};return{isActive:Sn(t),pause:n,resume:r,eventFilter:s}}function na(e){return Pn()}function Qi(...e){if(e.length!==1)return il(...e);const t=e[0];return typeof t=="function"?Sn(nl(()=>({get:t,set:Yi}))):oe(t)}function ra(e,t,n={}){const{eventFilter:r=Ji,...s}=n;return Me(e,ea(r,t),s)}function sa(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=ta(r);return{stop:ra(e,t,{...s,eventFilter:i}),pause:o,resume:l,isActive:c}}function Nr(e,t=!0,n){na()?Ct(e,n):t?e():xn(e)}function Zi(e){var t;const n=Xe(e);return(t=n==null?void 0:n.$el)!=null?t:n}const De=Xi?window:void 0;function Et(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=De):[t,n,r,s]=e,!t)return Yi;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const i=[],o=()=>{i.forEach(f=>f()),i.length=0},l=(f,h,m,E)=>(f.addEventListener(h,m,E),()=>f.removeEventListener(h,m,E)),c=Me(()=>[Zi(t),Xe(s)],([f,h])=>{if(o(),!f)return;const m=Qc(h)?{...h}:h;i.push(...n.flatMap(E=>r.map(A=>l(f,E,A,m))))},{immediate:!0,flush:"post"}),u=()=>{c(),o()};return Mr(u),u}function ia(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function lu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=De,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=r,c=ia(t);return Et(s,i,f=>{f.repeat&&Xe(l)||c(f)&&n(f)},o)}function oa(){const e=oe(!1),t=Pn();return t&&Ct(()=>{e.value=!0},t),e}function la(e){const t=oa();return re(()=>(t.value,!!e()))}function eo(e,t={}){const{window:n=De}=t,r=la(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const i=oe(!1),o=u=>{i.value=u.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",o):s.removeListener(o))},c=Li(()=>{r.value&&(l(),s=n.matchMedia(Xe(e)),"addEventListener"in s?s.addEventListener("change",o):s.addListener(o),i.value=s.matches)});return Mr(()=>{c(),l(),s=void 0}),i}const tn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},nn="__vueuse_ssr_handlers__",ca=aa();function aa(){return nn in tn||(tn[nn]=tn[nn]||{}),tn[nn]}function to(e,t){return ca[e]||t}function ua(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const fa={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Os="vueuse-storage";function da(e,t,n,r={}){var s;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:f,window:h=De,eventFilter:m,onError:E=w=>{console.error(w)},initOnMounted:A}=r,L=(f?si:oe)(typeof t=="function"?t():t);if(!n)try{n=to("getDefaultStorage",()=>{var w;return(w=De)==null?void 0:w.localStorage})()}catch(w){E(w)}if(!n)return L;const B=Xe(t),q=ua(B),D=(s=r.serializer)!=null?s:fa[q],{pause:g,resume:y}=sa(L,()=>O(L.value),{flush:i,deep:o,eventFilter:m});h&&l&&Nr(()=>{Et(h,"storage",V),Et(h,Os,P),A&&V()}),A||V();function M(w,N){h&&h.dispatchEvent(new CustomEvent(Os,{detail:{key:e,oldValue:w,newValue:N,storageArea:n}}))}function O(w){try{const N=n.getItem(e);if(w==null)M(N,null),n.removeItem(e);else{const x=D.write(w);N!==x&&(n.setItem(e,x),M(N,x))}}catch(N){E(N)}}function k(w){const N=w?w.newValue:n.getItem(e);if(N==null)return c&&B!=null&&n.setItem(e,D.write(B)),B;if(!w&&u){const x=D.read(N);return typeof u=="function"?u(x,B):q==="object"&&!Array.isArray(x)?{...B,...x}:x}else return typeof N!="string"?N:D.read(N)}function V(w){if(!(w&&w.storageArea!==n)){if(w&&w.key==null){L.value=B;return}if(!(w&&w.key!==e)){g();try{(w==null?void 0:w.newValue)!==D.write(L.value)&&(L.value=k(w))}catch(N){E(N)}finally{w?xn(y):y()}}}}function P(w){V(w.detail)}return L}function no(e){return eo("(prefers-color-scheme: dark)",e)}function ha(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=De,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},m=no({window:s}),E=re(()=>m.value?"dark":"light"),A=c||(o==null?Qi(r):da(o,r,i,{window:s,listenToStorageChanges:l})),L=re(()=>A.value==="auto"?E.value:A.value),B=to("updateHTMLAttrs",(y,M,O)=>{const k=typeof y=="string"?s==null?void 0:s.document.querySelector(y):Zi(y);if(!k)return;let V;if(f&&(V=s.document.createElement("style"),V.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),s.document.head.appendChild(V)),M==="class"){const P=O.split(/\s/g);Object.values(h).flatMap(w=>(w||"").split(/\s/g)).filter(Boolean).forEach(w=>{P.includes(w)?k.classList.add(w):k.classList.remove(w)})}else k.setAttribute(M,O);f&&(s.getComputedStyle(V).opacity,document.head.removeChild(V))});function q(y){var M;B(t,n,(M=h[y])!=null?M:y)}function D(y){e.onChanged?e.onChanged(y,q):q(y)}Me(L,D,{flush:"post",immediate:!0}),Nr(()=>D(L.value));const g=re({get(){return u?A.value:L.value},set(y){A.value=y}});try{return Object.assign(g,{store:A,system:E,state:L})}catch{return g}}function pa(e={}){const{valueDark:t="dark",valueLight:n="",window:r=De}=e,s=ha({...e,onChanged:(l,c)=>{var u;e.onChanged?(u=e.onChanged)==null||u.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=re(()=>s.system?s.system.value:no({window:r}).value?"dark":"light");return re({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?s.value="auto":s.value=c}})}function Gn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function ro(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const zn=new WeakMap;function cu(e,t=!1){const n=oe(t);let r=null,s="";Me(Qi(e),l=>{const c=Gn(Xe(l));if(c){const u=c;if(zn.get(u)||zn.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(s=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=Gn(Xe(e));!l||n.value||(Rs&&(r=Et(l,"touchmove",c=>{ga(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=Gn(Xe(e));!l||!n.value||(Rs&&(r==null||r()),l.style.overflow=s,zn.delete(l),n.value=!1)};return Mr(o),re({get(){return n.value},set(l){l?i():o()}})}function au(e={}){const{window:t=De,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const r=oe(t.scrollX),s=oe(t.scrollY),i=re({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),o=re({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Et(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function uu(e={}){const{window:t=De,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:r=Number.POSITIVE_INFINITY,listenOrientation:s=!0,includeScrollbar:i=!0}=e,o=oe(n),l=oe(r),c=()=>{t&&(i?(o.value=t.innerWidth,l.value=t.innerHeight):(o.value=t.document.documentElement.clientWidth,l.value=t.document.documentElement.clientHeight))};if(c(),Nr(c),Et("resize",c,{passive:!0}),s){const u=eo("(orientation: portrait)");Me(u,()=>c())}return{width:o,height:l}}var Xn={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1},Yn={};const so=/^(?:[a-z]+:|\/\/)/i,ma="vitepress-theme-appearance",ya=/#.*$/,_a=/[?#].*$/,va=/(?:(^|\/)index)?\.(?:md|html)$/,fe=typeof document<"u",io={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function ba(e,t,n=!1){if(t===void 0)return!1;if(e=Is(`/${e}`),n)return new RegExp(t).test(e);if(Is(t)!==e)return!1;const r=t.match(ya);return r?(fe?location.hash:"")===r[0]:!0}function Is(e){return decodeURI(e).replace(_a,"").replace(va,"$1")}function wa(e){return so.test(e)}function Ea(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!wa(n)&&ba(t,`/${n}/`,!0))||"root"}function Ca(e,t){var r,s,i,o,l,c,u;const n=Ea(e,t);return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:lo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function oo(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=Sa(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function Sa(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function xa(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([i,o])=>i===n&&o[s[0]]===s[1])}function lo(e,t){return[...e.filter(n=>!xa(t,n)),...t]}const Ta=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Aa=/^[a-z]:/i;function Ls(e){const t=Aa.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ta,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Jn=new Set;function Ra(e){if(Jn.size===0){const n=typeof process=="object"&&(Yn==null?void 0:Yn.VITE_EXTRA_EXTENSIONS)||(Xn==null?void 0:Xn.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(r=>Jn.add(r))}const t=e.split(".").pop();return t==null||!Jn.has(t.toLowerCase())}const Oa=Symbol(),ut=si(Yc);function fu(e){const t=re(()=>Ca(ut.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?oe(!0):n?pa({storageKey:ma,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),s=oe(fe?location.hash:"");return fe&&window.addEventListener("hashchange",()=>{s.value=location.hash}),Me(()=>e.data,()=>{s.value=fe?location.hash:""}),{site:t,theme:re(()=>t.value.themeConfig),page:re(()=>e.data),frontmatter:re(()=>e.data.frontmatter),params:re(()=>e.data.params),lang:re(()=>t.value.lang),dir:re(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:re(()=>t.value.localeIndex||"root"),title:re(()=>oo(t.value,e.data)),description:re(()=>e.data.description||t.value.description),isDark:r,hash:re(()=>s.value)}}function Ia(){const e=bt(Oa);if(!e)throw new Error("vitepress data not properly injected in app");return e}function La(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ps(e){return so.test(e)||!e.startsWith("/")?e:La(ut.value.base,e)}function Pa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),fe){const n="/";t=Ls(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Ls(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let an=[];function du(e){an.push(e),In(()=>{an=an.filter(t=>t!==e)})}function Ma(){let e=ut.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Ms(e,n);else if(Array.isArray(e))for(const r of e){const s=Ms(r,n);if(s){t=s;break}}return t}function Ms(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}const Na=Symbol(),co="http://a.com",Fa=()=>({path:"/",component:null,data:io});function hu(e,t){const n=Cn(Fa()),r={route:n,go:s};async function s(l=fe?location.href:"/"){var c,u;l=Qn(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(fe&&l!==Qn(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((u=r.onAfterRouteChanged)==null?void 0:u.call(r,l)))}let i=null;async function o(l,c=0,u=!1){var m;if(await((m=r.onBeforePageLoad)==null?void 0:m.call(r,l))===!1)return;const f=new URL(l,co),h=i=f.pathname;try{let E=await e(h);if(!E)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:A,__pageData:L}=E;if(!A)throw new Error(`Invalid route component: ${A}`);n.path=fe?h:Ps(h),n.component=on(A),n.data=on(L),fe&&xn(()=>{let B=ut.value.base+L.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ut.value.cleanUrls&&!B.endsWith("/")&&(B+=".html"),B!==f.pathname&&(f.pathname=B,l=B+f.search+f.hash,history.replaceState({},"",l)),f.hash&&!c){let q=null;try{q=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(D){console.warn(D)}if(q){Ns(q,f.hash);return}}window.scrollTo(0,c)})}}catch(E){if(!/fetch|Page not found/.test(E.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(E),!u)try{const A=await fetch(ut.value.base+"hashmap.json");window.__VP_HASH_MAP__=await A.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=fe?h:Ps(h),n.component=t?on(t):null;const A=fe?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...io,relativePath:A}}}}return fe&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:f,origin:h,pathname:m,hash:E,search:A}=new URL(u,c.baseURI),L=new URL(location.href);h===L.origin&&Ra(m)&&(l.preventDefault(),m===L.pathname&&A===L.search?(E!==L.hash&&(history.pushState({},"",f),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:L.href,newURL:f}))),E?Ns(c,E,c.classList.contains("header-anchor")):window.scrollTo(0,0)):s(f))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(Qn(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function $a(){const e=bt(Na);if(!e)throw new Error("useRouter() is called without provider.");return e}function ao(){return $a().route}function Ns(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(r).paddingTop,10),o=window.scrollY+r.getBoundingClientRect().top-Ma()+i;requestAnimationFrame(s)}}function Qn(e){const t=new URL(e,co);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ut.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Zn=()=>an.forEach(e=>e()),pu=Rr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=ao(),{site:n}=Ia();return()=>dr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?dr(t.component,{onVnodeMounted:Zn,onVnodeUpdated:Zn,onVnodeUnmounted:Zn}):"404 Page Not Found"])}}),gu=Rr({setup(e,{slots:t}){const n=oe(!1);return Ct(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function mu(){fe&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const i=r.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[s];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function yu(){if(fe){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,i=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),Ha(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function Ha(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function _u(e,t){let n=!0,r=[];const s=i=>{if(n){n=!1,i.forEach(l=>{const c=er(l);for(const u of document.head.children)if(u.isEqualNode(c)){r.push(u);return}});return}const o=i.map(er);r.forEach((l,c)=>{const u=o.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete r[c])}),o.forEach(l=>l&&document.head.appendChild(l)),r=[...r,...o].filter(Boolean)};Li(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=oo(o,i);u!==document.title&&(document.title=u);const f=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==f&&h.setAttribute("content",f):er(["meta",{name:"description",content:f}]),s(lo(o.head,Da(c)))})}function er([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function ja(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Da(e){return e.filter(t=>!ja(t))}const tr=new Set,uo=()=>document.createElement("link"),Va=e=>{const t=uo();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Ua=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let rn;const Ba=fe&&(rn=uo())&&rn.relList&&rn.relList.supports&&rn.relList.supports("prefetch")?Va:Ua;function vu(){if(!fe||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!tr.has(c)){tr.add(c);const u=Pa(c);u&&Ba(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):tr.add(l))})})};Ct(r);const s=ao();Me(()=>s.path,r),In(()=>{n&&n.disconnect()})}export{Ya as $,Qa as A,wl as B,Ma as C,Wa as D,Ga as E,_e as F,si as G,du as H,se as I,qa as J,so as K,ao as L,oc as M,bt as N,uu as O,yr as P,lu as Q,xn as R,au as S,Gi as T,fe as U,Sn as V,za as W,ou as X,cu as Y,Fl as Z,iu as _,ki as a,ru as a0,mi as a1,nu as a2,Ja as a3,$a as a4,eu as a5,_u as a6,Na as a7,fu as a8,Oa as a9,pu as aa,gu as ab,ut as ac,su as ad,hu as ae,Pa as af,vu as ag,yu as ah,mu as ai,dr as aj,Vi as b,Za as c,Rr as d,tu as e,Ra as f,Ps as g,re as h,wa as i,Bi as j,oi as k,Ka as l,ba as m,_r as n,ji as o,ka as p,eo as q,Xa as r,oe as s,Ao as t,Ia as u,Me as v,hl as w,Li as x,Ct as y,In as z}; diff --git a/assets/chunks/katex.B5umXGHV.js b/assets/chunks/katex.B5umXGHV.js new file mode 100644 index 000000000..deae2457e --- /dev/null +++ b/assets/chunks/katex.B5umXGHV.js @@ -0,0 +1 @@ +const s="/assets/katex.D3zUHQ6F.png";export{s as _}; diff --git a/assets/chunks/readme-3.hEA_5CR-.js b/assets/chunks/readme-3.hEA_5CR-.js new file mode 100644 index 000000000..0715d9784 --- /dev/null +++ b/assets/chunks/readme-3.hEA_5CR-.js @@ -0,0 +1 @@ +const s="/assets/logo.KgWMX3A2.png",t="/assets/readme-1.CjiL5qF9.png",a="/assets/readme-2.DKgivwJl.png",e="/assets/readme-3.CRRWEqvl.jpg";export{s as _,t as a,a as b,e as c}; diff --git a/assets/chunks/theme.Bngo81ar.js b/assets/chunks/theme.Bngo81ar.js new file mode 100644 index 000000000..8e32d637f --- /dev/null +++ b/assets/chunks/theme.Bngo81ar.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPAlgoliaSearchBox.5FrsXTx7.js","assets/chunks/framework.aNBt3w9_.js"])))=>i.map(i=>d[i]); +import{d as m,o as a,c,r as l,n as M,a as O,t as N,b as _,w as h,e as f,T as ve,_ as b,u as Ue,i as je,f as Je,g as pe,h as y,j as v,k as r,p as B,l as H,m as q,q as le,s as I,v as G,x as Z,y as W,z as x,A as he,B as Ke,C as We,D as z,F as C,E,G as Pe,H as ee,I as k,J as F,K as Le,L as te,M as K,N as ne,O as qe,P as Ve,Q as ze,R as Re,S as Se,U as oe,V as Ye,W as Xe,X as Qe,Y as we,Z as Te,$ as Ze,a0 as xe,a1 as et,a2 as tt,a3 as nt,a4 as ot}from"./framework.aNBt3w9_.js";const st=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(a(),c("span",{class:M(["VPBadge",e.type])},[l(e.$slots,"default",{},()=>[O(N(e.text),1)])],2))}}),at={key:0,class:"VPBackdrop"},rt=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(a(),_(ve,{name:"fade"},{default:h(()=>[e.show?(a(),c("div",at)):f("",!0)]),_:1}))}}),it=b(rt,[["__scopeId","data-v-54a304ca"]]),S=Ue;function lt(n,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(n,e):(n(),(s=!0)&&setTimeout(()=>s=!1,e))}}function ce(n){return/^\//.test(n)?n:`/${n}`}function fe(n){const{pathname:e,search:t,hash:s,protocol:o}=new URL(n,"http://a.com");if(je(n)||n.startsWith("#")||!o.startsWith("http")||!Je(e))return n;const{site:i}=S(),u=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${s}`);return pe(u)}function Y({correspondingLink:n=!1}={}){const{site:e,localeIndex:t,page:s,theme:o,hash:i}=S(),u=y(()=>{var d,g;return{label:(d=e.value.locales[t.value])==null?void 0:d.label,link:((g=e.value.locales[t.value])==null?void 0:g.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([d,g])=>u.value.label===g.label?[]:{text:g.label,link:ct(g.link||(d==="root"?"/":`/${d}/`),o.value.i18nRouting!==!1&&n,s.value.relativePath.slice(u.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:u}}function ct(n,e,t,s){return e?n.replace(/\/$/,"")+ce(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):n}const ut=n=>(B("data-v-6ff51ddd"),n=n(),H(),n),dt={class:"NotFound"},vt={class:"code"},pt={class:"title"},ht=ut(()=>v("div",{class:"divider"},null,-1)),ft={class:"quote"},_t={class:"action"},mt=["href","aria-label"],kt=m({__name:"NotFound",setup(n){const{theme:e}=S(),{currentLang:t}=Y();return(s,o)=>{var i,u,p,d,g;return a(),c("div",dt,[v("p",vt,N(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),v("h1",pt,N(((u=r(e).notFound)==null?void 0:u.title)??"PAGE NOT FOUND"),1),ht,v("blockquote",ft,N(((p=r(e).notFound)==null?void 0:p.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),v("div",_t,[v("a",{class:"link",href:r(pe)(r(t).link),"aria-label":((d=r(e).notFound)==null?void 0:d.linkLabel)??"go to home"},N(((g=r(e).notFound)==null?void 0:g.linkText)??"Take me home"),9,mt)])])}}}),bt=b(kt,[["__scopeId","data-v-6ff51ddd"]]);function Ie(n,e){if(Array.isArray(n))return X(n);if(n==null)return[];e=ce(e);const t=Object.keys(n).sort((o,i)=>i.split("/").length-o.split("/").length).find(o=>e.startsWith(ce(o))),s=t?n[t]:[];return Array.isArray(s)?X(s):X(s.items,s.base)}function gt(n){const e=[];let t=0;for(const s in n){const o=n[s];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function $t(n){const e=[];function t(s){for(const o of s)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(n),e}function ue(n,e){return Array.isArray(e)?e.some(t=>ue(n,t)):q(n,e.link)?!0:e.items?ue(n,e.items):!1}function X(n,e){return[...n].map(t=>{const s={...t},o=s.base||e;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=X(s.items,o)),s})}function U(){const{frontmatter:n,page:e,theme:t}=S(),s=le("(min-width: 960px)"),o=I(!1),i=y(()=>{const A=t.value.sidebar,T=e.value.relativePath;return A?Ie(A,T):[]}),u=I(i.value);G(i,(A,T)=>{JSON.stringify(A)!==JSON.stringify(T)&&(u.value=i.value)});const p=y(()=>n.value.sidebar!==!1&&u.value.length>0&&n.value.layout!=="home"),d=y(()=>g?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),g=y(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),w=y(()=>p.value&&s.value),P=y(()=>p.value?gt(u.value):[]);function $(){o.value=!0}function L(){o.value=!1}function V(){o.value?L():$()}return{isOpen:o,sidebar:u,sidebarGroups:P,hasSidebar:p,hasAside:g,leftAside:d,isSidebarEnabled:w,open:$,close:L,toggle:V}}function yt(n,e){let t;Z(()=>{t=n.value?document.activeElement:void 0}),W(()=>{window.addEventListener("keyup",s)}),x(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function Pt(n){const{page:e,hash:t}=S(),s=I(!1),o=y(()=>n.value.collapsed!=null),i=y(()=>!!n.value.link),u=I(!1),p=()=>{u.value=q(e.value.relativePath,n.value.link)};G([e,n,t],p),W(p);const d=y(()=>u.value?!0:n.value.items?ue(e.value.relativePath,n.value.items):!1),g=y(()=>!!(n.value.items&&n.value.items.length));Z(()=>{s.value=!!(o.value&&n.value.collapsed)}),he(()=>{(u.value||d.value)&&(s.value=!1)});function w(){o.value&&(s.value=!s.value)}return{collapsed:s,collapsible:o,isLink:i,isActiveLink:u,hasActiveLink:d,hasChildren:g,toggle:w}}function Lt(){const{hasSidebar:n}=U(),e=le("(min-width: 960px)"),t=le("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const de=[];function Ne(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function _e(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{element:t,title:Vt(t),link:"#"+t.id,level:s}});return St(e,n)}function Vt(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function St(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(u=>u.level>=s&&u.level<=o),de.length=0;for(const{element:u,link:p}of n)de.push({element:u,link:p});const i=[];e:for(let u=0;u=0;d--){const g=n[d];if(g.level{requestAnimationFrame(i),window.addEventListener("scroll",s)}),Ke(()=>{u(location.hash)}),x(()=>{window.removeEventListener("scroll",s)});function i(){if(!t.value)return;const p=window.scrollY,d=window.innerHeight,g=document.body.offsetHeight,w=Math.abs(p+d-g)<1,P=de.map(({element:L,link:V})=>({link:V,top:Tt(L)})).filter(({top:L})=>!Number.isNaN(L)).sort((L,V)=>L.top-V.top);if(!P.length){u(null);return}if(p<1){u(null);return}if(w){u(P[P.length-1].link);return}let $=null;for(const{link:L,top:V}of P){if(V>p+We()+4)break;$=L}u($)}function u(p){o&&o.classList.remove("active"),p==null?o=null:o=n.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const d=o;d?(d.classList.add("active"),e.value.style.top=d.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Tt(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}const It=["href","title"],Nt=m({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(n){function e({target:t}){const s=t.href.split("#")[1],o=document.getElementById(decodeURIComponent(s));o==null||o.focus({preventScroll:!0})}return(t,s)=>{const o=z("VPDocOutlineItem",!0);return a(),c("ul",{class:M(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),c(C,null,E(t.headers,({children:i,link:u,title:p})=>(a(),c("li",null,[v("a",{class:"outline-link",href:u,onClick:e,title:p},N(p),9,It),i!=null&&i.length?(a(),_(o,{key:0,headers:i},null,8,["headers"])):f("",!0)]))),256))],2)}}}),Me=b(Nt,[["__scopeId","data-v-53c99d69"]]),Mt={class:"content"},At={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Ct=m({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=S(),s=Pe([]);ee(()=>{s.value=_e(e.value.outline??t.value.outline)});const o=I(),i=I();return wt(o,i),(u,p)=>(a(),c("nav",{"aria-labelledby":"doc-outline-aria-label",class:M(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o},[v("div",Mt,[v("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),v("div",At,N(r(Ne)(r(t))),1),k(Me,{headers:s.value,root:!0},null,8,["headers"])])],2))}}),Bt=b(Ct,[["__scopeId","data-v-f610f197"]]),Ht={class:"VPDocAsideCarbonAds"},Et=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,s)=>(a(),c("div",Ht,[k(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ft=n=>(B("data-v-cb998dce"),n=n(),H(),n),Dt={class:"VPDocAside"},Ot=Ft(()=>v("div",{class:"spacer"},null,-1)),Gt=m({__name:"VPDocAside",setup(n){const{theme:e}=S();return(t,s)=>(a(),c("div",Dt,[l(t.$slots,"aside-top",{},void 0,!0),l(t.$slots,"aside-outline-before",{},void 0,!0),k(Bt),l(t.$slots,"aside-outline-after",{},void 0,!0),Ot,l(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),_(Et,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):f("",!0),l(t.$slots,"aside-ads-after",{},void 0,!0),l(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Ut=b(Gt,[["__scopeId","data-v-cb998dce"]]);function jt(){const{theme:n,page:e}=S();return y(()=>{const{text:t="Edit this page",pattern:s=""}=n.value.editLink||{};let o;return typeof s=="function"?o=s(e.value):o=s.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Jt(){const{page:n,theme:e,frontmatter:t}=S();return y(()=>{var g,w,P,$,L,V,A,T;const s=Ie(e.value.sidebar,n.value.relativePath),o=$t(s),i=Kt(o,j=>j.link.replace(/[?#].*$/,"")),u=i.findIndex(j=>q(n.value.relativePath,j.link)),p=((g=e.value.docFooter)==null?void 0:g.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((w=e.value.docFooter)==null?void 0:w.next)===!1&&!t.value.next||t.value.next===!1;return{prev:p?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((P=i[u-1])==null?void 0:P.docFooterText)??(($=i[u-1])==null?void 0:$.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((L=i[u-1])==null?void 0:L.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((V=i[u+1])==null?void 0:V.docFooterText)??((A=i[u+1])==null?void 0:A.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((T=i[u+1])==null?void 0:T.link)}}})}function Kt(n,e){const t=new Set;return n.filter(s=>{const o=e(s);return t.has(o)?!1:t.add(o)})}const D=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=y(()=>e.tag??(e.href?"a":"span")),s=y(()=>e.href&&Le.test(e.href)||e.target==="_blank");return(o,i)=>(a(),_(F(t.value),{class:M(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?r(fe)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:h(()=>[l(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Wt={class:"VPLastUpdated"},qt=["datetime"],zt=m({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,lang:s}=S(),o=y(()=>new Date(t.value.lastUpdated)),i=y(()=>o.value.toISOString()),u=I("");return W(()=>{Z(()=>{var p,d,g;u.value=new Intl.DateTimeFormat((d=(p=e.value.lastUpdated)==null?void 0:p.formatOptions)!=null&&d.forceLocale?s.value:void 0,((g=e.value.lastUpdated)==null?void 0:g.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(o.value)})}),(p,d)=>{var g;return a(),c("p",Wt,[O(N(((g=r(e).lastUpdated)==null?void 0:g.text)||r(e).lastUpdatedText||"Last updated")+": ",1),v("time",{datetime:i.value},N(u.value),9,qt)])}}}),Rt=b(zt,[["__scopeId","data-v-1bb0c8a8"]]),Ae=n=>(B("data-v-1bcd8184"),n=n(),H(),n),Yt={key:0,class:"VPDocFooter"},Xt={key:0,class:"edit-info"},Qt={key:0,class:"edit-link"},Zt=Ae(()=>v("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),xt={key:1,class:"last-updated"},en={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},tn=Ae(()=>v("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),nn={class:"pager"},on=["innerHTML"],sn=["innerHTML"],an={class:"pager"},rn=["innerHTML"],ln=["innerHTML"],cn=m({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:s}=S(),o=jt(),i=Jt(),u=y(()=>e.value.editLink&&s.value.editLink!==!1),p=y(()=>t.value.lastUpdated),d=y(()=>u.value||p.value||i.value.prev||i.value.next);return(g,w)=>{var P,$,L,V;return d.value?(a(),c("footer",Yt,[l(g.$slots,"doc-footer-before",{},void 0,!0),u.value||p.value?(a(),c("div",Xt,[u.value?(a(),c("div",Qt,[k(D,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:h(()=>[Zt,O(" "+N(r(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),c("div",xt,[k(Rt)])):f("",!0)])):f("",!0),(P=r(i).prev)!=null&&P.link||($=r(i).next)!=null&&$.link?(a(),c("nav",en,[tn,v("div",nn,[(L=r(i).prev)!=null&&L.link?(a(),_(D,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:h(()=>{var A;return[v("span",{class:"desc",innerHTML:((A=r(e).docFooter)==null?void 0:A.prev)||"Previous page"},null,8,on),v("span",{class:"title",innerHTML:r(i).prev.text},null,8,sn)]}),_:1},8,["href"])):f("",!0)]),v("div",an,[(V=r(i).next)!=null&&V.link?(a(),_(D,{key:0,class:"pager-link next",href:r(i).next.link},{default:h(()=>{var A;return[v("span",{class:"desc",innerHTML:((A=r(e).docFooter)==null?void 0:A.next)||"Next page"},null,8,rn),v("span",{class:"title",innerHTML:r(i).next.text},null,8,ln)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),un=b(cn,[["__scopeId","data-v-1bcd8184"]]),dn=n=>(B("data-v-e6f2a212"),n=n(),H(),n),vn={class:"container"},pn=dn(()=>v("div",{class:"aside-curtain"},null,-1)),hn={class:"aside-container"},fn={class:"aside-content"},_n={class:"content"},mn={class:"content-container"},kn={class:"main"},bn=m({__name:"VPDoc",setup(n){const{theme:e}=S(),t=te(),{hasSidebar:s,hasAside:o,leftAside:i}=U(),u=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,d)=>{const g=z("Content");return a(),c("div",{class:M(["VPDoc",{"has-sidebar":r(s),"has-aside":r(o)}])},[l(p.$slots,"doc-top",{},void 0,!0),v("div",vn,[r(o)?(a(),c("div",{key:0,class:M(["aside",{"left-aside":r(i)}])},[pn,v("div",hn,[v("div",fn,[k(Ut,null,{"aside-top":h(()=>[l(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[l(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[l(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[l(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[l(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[l(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),v("div",_n,[v("div",mn,[l(p.$slots,"doc-before",{},void 0,!0),v("main",kn,[k(g,{class:M(["vp-doc",[u.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),k(un,null,{"doc-footer-before":h(()=>[l(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),l(p.$slots,"doc-after",{},void 0,!0)])])]),l(p.$slots,"doc-bottom",{},void 0,!0)],2)}}}),gn=b(bn,[["__scopeId","data-v-e6f2a212"]]),$n=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(n){const e=n,t=y(()=>e.href&&Le.test(e.href)),s=y(()=>e.tag||e.href?"a":"button");return(o,i)=>(a(),_(F(s.value),{class:M(["VPButton",[o.size,o.theme]]),href:o.href?r(fe)(o.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:h(()=>[O(N(o.text),1)]),_:1},8,["class","href","target","rel"]))}}),yn=b($n,[["__scopeId","data-v-c9cf0e3c"]]),Pn=["src","alt"],Ln=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const s=z("VPImage",!0);return e.image?(a(),c(C,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),c("img",K({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(pe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Pn)):(a(),c(C,{key:1},[k(s,K({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),k(s,K({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),Q=b(Ln,[["__scopeId","data-v-ab19afbb"]]),Vn=n=>(B("data-v-b10c5094"),n=n(),H(),n),Sn={class:"container"},wn={class:"main"},Tn={key:0,class:"name"},In=["innerHTML"],Nn=["innerHTML"],Mn=["innerHTML"],An={key:0,class:"actions"},Cn={key:0,class:"image"},Bn={class:"image-container"},Hn=Vn(()=>v("div",{class:"image-bg"},null,-1)),En=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=ne("hero-image-slot-exists");return(t,s)=>(a(),c("div",{class:M(["VPHero",{"has-image":t.image||r(e)}])},[v("div",Sn,[v("div",wn,[l(t.$slots,"home-hero-info-before",{},void 0,!0),l(t.$slots,"home-hero-info",{},()=>[t.name?(a(),c("h1",Tn,[v("span",{innerHTML:t.name,class:"clip"},null,8,In)])):f("",!0),t.text?(a(),c("p",{key:1,innerHTML:t.text,class:"text"},null,8,Nn)):f("",!0),t.tagline?(a(),c("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Mn)):f("",!0)],!0),l(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),c("div",An,[(a(!0),c(C,null,E(t.actions,o=>(a(),c("div",{key:o.link,class:"action"},[k(yn,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):f("",!0),l(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),c("div",Cn,[v("div",Bn,[Hn,l(t.$slots,"home-hero-image",{},()=>[t.image?(a(),_(Q,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),Fn=b(En,[["__scopeId","data-v-b10c5094"]]),Dn=m({__name:"VPHomeHero",setup(n){const{frontmatter:e}=S();return(t,s)=>r(e).hero?(a(),_(Fn,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":h(()=>[l(t.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[l(t.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[l(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[l(t.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[l(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),On=n=>(B("data-v-bd37d1a2"),n=n(),H(),n),Gn={class:"box"},Un={key:0,class:"icon"},jn=["innerHTML"],Jn=["innerHTML"],Kn=["innerHTML"],Wn={key:4,class:"link-text"},qn={class:"link-text-value"},zn=On(()=>v("span",{class:"vpi-arrow-right link-text-icon"},null,-1)),Rn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(a(),_(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[v("article",Gn,[typeof e.icon=="object"&&e.icon.wrap?(a(),c("div",Un,[k(Q,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),_(Q,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),c("div",{key:2,class:"icon",innerHTML:e.icon},null,8,jn)):f("",!0),v("h2",{class:"title",innerHTML:e.title},null,8,Jn),e.details?(a(),c("p",{key:3,class:"details",innerHTML:e.details},null,8,Kn)):f("",!0),e.linkText?(a(),c("div",Wn,[v("p",qn,[O(N(e.linkText)+" ",1),zn])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Yn=b(Rn,[["__scopeId","data-v-bd37d1a2"]]),Xn={key:0,class:"VPFeatures"},Qn={class:"container"},Zn={class:"items"},xn=m({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=y(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(a(),c("div",Xn,[v("div",Qn,[v("div",Zn,[(a(!0),c(C,null,E(s.features,i=>(a(),c("div",{key:i.title,class:M(["item",[t.value]])},[k(Yn,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),eo=b(xn,[["__scopeId","data-v-b1eea84a"]]),to=m({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=S();return(t,s)=>r(e).features?(a(),_(eo,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):f("",!0)}}),no=m({__name:"VPHomeContent",setup(n){const{width:e}=qe({initialWidth:0,includeScrollbar:!1});return(t,s)=>(a(),c("div",{class:"vp-doc container",style:Ve(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[l(t.$slots,"default",{},void 0,!0)],4))}}),oo=b(no,[["__scopeId","data-v-c141a4bd"]]),so={class:"VPHome"},ao=m({__name:"VPHome",setup(n){const{frontmatter:e}=S();return(t,s)=>{const o=z("Content");return a(),c("div",so,[l(t.$slots,"home-hero-before",{},void 0,!0),k(Dn,null,{"home-hero-info-before":h(()=>[l(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[l(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[l(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[l(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[l(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),l(t.$slots,"home-hero-after",{},void 0,!0),l(t.$slots,"home-features-before",{},void 0,!0),k(to),l(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),_(oo,{key:0},{default:h(()=>[k(o)]),_:1})):(a(),_(o,{key:1}))])}}}),ro=b(ao,[["__scopeId","data-v-07b1ad08"]]),io={},lo={class:"VPPage"};function co(n,e){const t=z("Content");return a(),c("div",lo,[l(n.$slots,"page-top"),k(t),l(n.$slots,"page-bottom")])}const uo=b(io,[["render",co]]),vo=m({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=S(),{hasSidebar:s}=U();return(o,i)=>(a(),c("div",{class:M(["VPContent",{"has-sidebar":r(s),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?l(o.$slots,"not-found",{key:0},()=>[k(bt)],!0):r(t).layout==="page"?(a(),_(uo,{key:1},{"page-top":h(()=>[l(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[l(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),_(ro,{key:2},{"home-hero-before":h(()=>[l(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[l(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[l(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[l(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[l(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[l(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[l(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[l(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[l(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),_(F(r(t).layout),{key:3})):(a(),_(gn,{key:4},{"doc-top":h(()=>[l(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[l(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[l(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[l(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[l(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[l(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[l(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[l(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[l(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[l(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[l(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),po=b(vo,[["__scopeId","data-v-9a6c75ad"]]),ho={class:"container"},fo=["innerHTML"],_o=["innerHTML"],mo=m({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=S(),{hasSidebar:s}=U();return(o,i)=>r(e).footer&&r(t).footer!==!1?(a(),c("footer",{key:0,class:M(["VPFooter",{"has-sidebar":r(s)}])},[v("div",ho,[r(e).footer.message?(a(),c("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,fo)):f("",!0),r(e).footer.copyright?(a(),c("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,_o)):f("",!0)])],2)):f("",!0)}}),ko=b(mo,[["__scopeId","data-v-566314d4"]]);function bo(){const{theme:n,frontmatter:e}=S(),t=Pe([]),s=y(()=>t.value.length>0);return ee(()=>{t.value=_e(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:s}}const go=n=>(B("data-v-883964e0"),n=n(),H(),n),$o={class:"menu-text"},yo=go(()=>v("span",{class:"vpi-chevron-right icon"},null,-1)),Po={class:"header"},Lo={class:"outline"},Vo=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=S(),s=I(!1),o=I(0),i=I(),u=I();function p(P){var $;($=i.value)!=null&&$.contains(P.target)||(s.value=!1)}G(s,P=>{if(P){document.addEventListener("click",p);return}document.removeEventListener("click",p)}),ze("Escape",()=>{s.value=!1}),ee(()=>{s.value=!1});function d(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function g(P){P.target.classList.contains("outline-link")&&(u.value&&(u.value.style.transition="none"),Re(()=>{s.value=!1}))}function w(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(P,$)=>(a(),c("div",{class:"VPLocalNavOutlineDropdown",style:Ve({"--vp-vh":o.value+"px"}),ref_key:"main",ref:i},[P.headers.length>0?(a(),c("button",{key:0,onClick:d,class:M({open:s.value})},[v("span",$o,N(r(Ne)(r(t))),1),yo],2)):(a(),c("button",{key:1,onClick:w},N(r(t).returnToTopLabel||"Return to top"),1)),k(ve,{name:"flyout"},{default:h(()=>[s.value?(a(),c("div",{key:0,ref_key:"items",ref:u,class:"items",onClick:g},[v("div",Po,[v("a",{class:"top-link",href:"#",onClick:w},N(r(t).returnToTopLabel||"Return to top"),1)]),v("div",Lo,[k(Me,{headers:P.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),So=b(Vo,[["__scopeId","data-v-883964e0"]]),wo=n=>(B("data-v-2488c25a"),n=n(),H(),n),To={class:"container"},Io=["aria-expanded"],No=wo(()=>v("span",{class:"vpi-align-left menu-icon"},null,-1)),Mo={class:"menu-text"},Ao=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=S(),{hasSidebar:s}=U(),{headers:o}=bo(),{y:i}=Se(),u=I(0);W(()=>{u.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ee(()=>{o.value=_e(t.value.outline??e.value.outline)});const p=y(()=>o.value.length===0),d=y(()=>p.value&&!s.value),g=y(()=>({VPLocalNav:!0,"has-sidebar":s.value,empty:p.value,fixed:d.value}));return(w,P)=>r(t).layout!=="home"&&(!d.value||r(i)>=u.value)?(a(),c("div",{key:0,class:M(g.value)},[v("div",To,[r(s)?(a(),c("button",{key:0,class:"menu","aria-expanded":w.open,"aria-controls":"VPSidebarNav",onClick:P[0]||(P[0]=$=>w.$emit("open-menu"))},[No,v("span",Mo,N(r(e).sidebarMenuLabel||"Menu"),1)],8,Io)):f("",!0),k(So,{headers:r(o),navHeight:u.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Co=b(Ao,[["__scopeId","data-v-2488c25a"]]);function Bo(){const n=I(!1);function e(){n.value=!0,window.addEventListener("resize",o)}function t(){n.value=!1,window.removeEventListener("resize",o)}function s(){n.value?t():e()}function o(){window.outerWidth>=768&&t()}const i=te();return G(()=>i.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:s}}const Ho={},Eo={class:"VPSwitch",type:"button",role:"switch"},Fo={class:"check"},Do={key:0,class:"icon"};function Oo(n,e){return a(),c("button",Eo,[v("span",Fo,[n.$slots.default?(a(),c("span",Do,[l(n.$slots,"default",{},void 0,!0)])):f("",!0)])])}const Go=b(Ho,[["render",Oo],["__scopeId","data-v-b4ccac88"]]),Ce=n=>(B("data-v-be9742d9"),n=n(),H(),n),Uo=Ce(()=>v("span",{class:"vpi-sun sun"},null,-1)),jo=Ce(()=>v("span",{class:"vpi-moon moon"},null,-1)),Jo=m({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=S(),s=ne("toggle-appearance",()=>{e.value=!e.value}),o=I("");return he(()=>{o.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,u)=>(a(),_(Go,{title:o.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(s)},{default:h(()=>[Uo,jo]),_:1},8,["title","aria-checked","onClick"]))}}),me=b(Jo,[["__scopeId","data-v-be9742d9"]]),Ko={key:0,class:"VPNavBarAppearance"},Wo=m({__name:"VPNavBarAppearance",setup(n){const{site:e}=S();return(t,s)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),c("div",Ko,[k(me)])):f("",!0)}}),qo=b(Wo,[["__scopeId","data-v-3f90c1a5"]]),ke=I();let Be=!1,ie=0;function zo(n){const e=I(!1);if(oe){!Be&&Ro(),ie++;const t=G(ke,s=>{var o,i,u;s===n.el.value||(o=n.el.value)!=null&&o.contains(s)?(e.value=!0,(i=n.onFocus)==null||i.call(n)):(e.value=!1,(u=n.onBlur)==null||u.call(n))});x(()=>{t(),ie--,ie||Yo()})}return Ye(e)}function Ro(){document.addEventListener("focusin",He),Be=!0,ke.value=document.activeElement}function Yo(){document.removeEventListener("focusin",He)}function He(){ke.value=document.activeElement}const Xo={class:"VPMenuLink"},Qo=m({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=S();return(t,s)=>(a(),c("div",Xo,[k(D,{class:M({active:r(q)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:h(()=>[O(N(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),se=b(Qo,[["__scopeId","data-v-f51f088d"]]),Zo={class:"VPMenuGroup"},xo={key:0,class:"title"},es=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),c("div",Zo,[e.text?(a(),c("p",xo,N(e.text),1)):f("",!0),(a(!0),c(C,null,E(e.items,s=>(a(),c(C,null,["link"in s?(a(),_(se,{key:0,item:s},null,8,["item"])):f("",!0)],64))),256))]))}}),ts=b(es,[["__scopeId","data-v-a6b0397c"]]),ns={class:"VPMenu"},os={key:0,class:"items"},ss=m({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(a(),c("div",ns,[e.items?(a(),c("div",os,[(a(!0),c(C,null,E(e.items,s=>(a(),c(C,{key:JSON.stringify(s)},["link"in s?(a(),_(se,{key:0,item:s},null,8,["item"])):"component"in s?(a(),_(F(s.component),K({key:1,ref_for:!0},s.props),null,16)):(a(),_(ts,{key:2,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):f("",!0),l(e.$slots,"default",{},void 0,!0)]))}}),as=b(ss,[["__scopeId","data-v-20ed86d6"]]),rs=n=>(B("data-v-af5898d3"),n=n(),H(),n),is=["aria-expanded","aria-label"],ls={key:0,class:"text"},cs=["innerHTML"],us=rs(()=>v("span",{class:"vpi-chevron-down text-icon"},null,-1)),ds={key:1,class:"vpi-more-horizontal icon"},vs={class:"menu"},ps=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=I(!1),t=I();zo({el:t,onBlur:s});function s(){e.value=!1}return(o,i)=>(a(),c("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=u=>e.value=!0),onMouseleave:i[2]||(i[2]=u=>e.value=!1)},[v("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:i[0]||(i[0]=u=>e.value=!e.value)},[o.button||o.icon?(a(),c("span",ls,[o.icon?(a(),c("span",{key:0,class:M([o.icon,"option-icon"])},null,2)):f("",!0),o.button?(a(),c("span",{key:1,innerHTML:o.button},null,8,cs)):f("",!0),us])):(a(),c("span",ds))],8,is),v("div",vs,[k(as,{items:o.items},{default:h(()=>[l(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),be=b(ps,[["__scopeId","data-v-af5898d3"]]),hs=["href","aria-label","innerHTML"],fs=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,o)=>(a(),c("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,hs))}}),_s=b(fs,[["__scopeId","data-v-358b6670"]]),ms={class:"VPSocialLinks"},ks=m({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(a(),c("div",ms,[(a(!0),c(C,null,E(e.links,({link:s,icon:o,ariaLabel:i})=>(a(),_(_s,{key:s,icon:o,link:s,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),ge=b(ks,[["__scopeId","data-v-e71e869c"]]),bs={key:0,class:"group translations"},gs={class:"trans-title"},$s={key:1,class:"group"},ys={class:"item appearance"},Ps={class:"label"},Ls={class:"appearance-action"},Vs={key:2,class:"group"},Ss={class:"item social-links"},ws=m({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=S(),{localeLinks:s,currentLang:o}=Y({correspondingLink:!0}),i=y(()=>s.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(u,p)=>i.value?(a(),_(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[r(s).length&&r(o).label?(a(),c("div",bs,[v("p",gs,N(r(o).label),1),(a(!0),c(C,null,E(r(s),d=>(a(),_(se,{key:d.link,item:d},null,8,["item"]))),128))])):f("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),c("div",$s,[v("div",ys,[v("p",Ps,N(r(t).darkModeSwitchLabel||"Appearance"),1),v("div",Ls,[k(me)])])])):f("",!0),r(t).socialLinks?(a(),c("div",Vs,[v("div",Ss,[k(ge,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),Ts=b(ws,[["__scopeId","data-v-f953d92f"]]),Is=n=>(B("data-v-6bee1efd"),n=n(),H(),n),Ns=["aria-expanded"],Ms=Is(()=>v("span",{class:"container"},[v("span",{class:"top"}),v("span",{class:"middle"}),v("span",{class:"bottom"})],-1)),As=[Ms],Cs=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(a(),c("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},As,10,Ns))}}),Bs=b(Cs,[["__scopeId","data-v-6bee1efd"]]),Hs=["innerHTML"],Es=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=S();return(t,s)=>(a(),_(D,{class:M({VPNavBarMenuLink:!0,active:r(q)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,noIcon:t.item.noIcon,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:h(()=>[v("span",{innerHTML:t.item.text},null,8,Hs)]),_:1},8,["class","href","noIcon","target","rel"]))}}),Fs=b(Es,[["__scopeId","data-v-08fbf4b6"]]),Ds=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=S(),s=i=>"component"in i?!1:"link"in i?q(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(s),o=y(()=>s(e.item));return(i,u)=>(a(),_(be,{class:M({VPNavBarMenuGroup:!0,active:r(q)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||o.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),Os=n=>(B("data-v-afb2845e"),n=n(),H(),n),Gs={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Us=Os(()=>v("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),js=m({__name:"VPNavBarMenu",setup(n){const{theme:e}=S();return(t,s)=>r(e).nav?(a(),c("nav",Gs,[Us,(a(!0),c(C,null,E(r(e).nav,o=>(a(),c(C,{key:JSON.stringify(o)},["link"in o?(a(),_(Fs,{key:0,item:o},null,8,["item"])):"component"in o?(a(),_(F(o.component),K({key:1,ref_for:!0},o.props),null,16)):(a(),_(Ds,{key:2,item:o},null,8,["item"]))],64))),128))])):f("",!0)}}),Js=b(js,[["__scopeId","data-v-afb2845e"]]);function Ks(n){const{localeIndex:e,theme:t}=S();function s(o){var V,A,T;const i=o.split("."),u=(V=t.value.search)==null?void 0:V.options,p=u&&typeof u=="object",d=p&&((T=(A=u.locales)==null?void 0:A[e.value])==null?void 0:T.translations)||null,g=p&&u.translations||null;let w=d,P=g,$=n;const L=i.pop();for(const j of i){let J=null;const R=$==null?void 0:$[j];R&&(J=$=R);const ae=P==null?void 0:P[j];ae&&(J=P=ae);const re=w==null?void 0:w[j];re&&(J=w=re),R||($=J),ae||(P=J),re||(w=J)}return(w==null?void 0:w[L])??(P==null?void 0:P[L])??($==null?void 0:$[L])??""}return s}const Ws=["aria-label"],qs={class:"DocSearch-Button-Container"},zs=v("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1),Rs={class:"DocSearch-Button-Placeholder"},Ys=v("span",{class:"DocSearch-Button-Keys"},[v("kbd",{class:"DocSearch-Button-Key"}),v("kbd",{class:"DocSearch-Button-Key"},"K")],-1),$e=m({__name:"VPNavBarSearchButton",setup(n){const t=Ks({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(s,o)=>(a(),c("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[v("span",qs,[zs,v("span",Rs,N(r(t)("button.buttonText")),1)]),Ys],8,Ws))}}),Xs={class:"VPNavBarSearch"},Qs={id:"local-search"},Zs={key:1,id:"docsearch"},xs=m({__name:"VPNavBarSearch",setup(n){const e=()=>null,t=Xe(()=>Qe(()=>import("./VPAlgoliaSearchBox.5FrsXTx7.js"),__vite__mapDeps([0,1]))),{theme:s}=S(),o=I(!1),i=I(!1),u=()=>{const $="VPAlgoliaPreconnect";(window.requestIdleCallback||setTimeout)(()=>{var A;const V=document.createElement("link");V.id=$,V.rel="preconnect",V.href=`https://${(((A=s.value.search)==null?void 0:A.options)??s.value.algolia).appId}-dsn.algolia.net`,V.crossOrigin="",document.head.appendChild(V)})};W(()=>{u();const $=V=>{(V.key.toLowerCase()==="k"&&(V.metaKey||V.ctrlKey)||!g(V)&&V.key==="/")&&(V.preventDefault(),p(),L())},L=()=>{window.removeEventListener("keydown",$)};window.addEventListener("keydown",$),x(L)});function p(){o.value||(o.value=!0,setTimeout(d,16))}function d(){const $=new Event("keydown");$.key="k",$.metaKey=!0,window.dispatchEvent($),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function g($){const L=$.target,V=L.tagName;return L.isContentEditable||V==="INPUT"||V==="SELECT"||V==="TEXTAREA"}const w=I(!1),P="algolia";return($,L)=>{var V;return a(),c("div",Xs,[r(P)==="local"?(a(),c(C,{key:0},[w.value?(a(),_(r(e),{key:0,onClose:L[0]||(L[0]=A=>w.value=!1)})):f("",!0),v("div",Qs,[k($e,{onClick:L[1]||(L[1]=A=>w.value=!0)})])],64)):r(P)==="algolia"?(a(),c(C,{key:1},[o.value?(a(),_(r(t),{key:0,algolia:((V=r(s).search)==null?void 0:V.options)??r(s).algolia,onVnodeBeforeMount:L[2]||(L[2]=A=>i.value=!0)},null,8,["algolia"])):f("",!0),i.value?f("",!0):(a(),c("div",Zs,[k($e,{onClick:p})]))],64)):f("",!0)])}}}),ea=m({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=S();return(t,s)=>r(e).socialLinks?(a(),_(ge,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),ta=b(ea,[["__scopeId","data-v-ef6192dc"]]),na=["href","rel","target"],oa={key:1},sa={key:2},aa=m({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=S(),{hasSidebar:s}=U(),{currentLang:o}=Y(),i=y(()=>{var d;return typeof t.value.logoLink=="string"?t.value.logoLink:(d=t.value.logoLink)==null?void 0:d.link}),u=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.rel}),p=y(()=>{var d;return typeof t.value.logoLink=="string"||(d=t.value.logoLink)==null?void 0:d.target});return(d,g)=>(a(),c("div",{class:M(["VPNavBarTitle",{"has-sidebar":r(s)}])},[v("a",{class:"title",href:i.value??r(fe)(r(o).link),rel:u.value,target:p.value},[l(d.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),_(Q,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):f("",!0),r(t).siteTitle?(a(),c("span",oa,N(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),c("span",sa,N(r(e).title),1)):f("",!0),l(d.$slots,"nav-bar-title-after",{},void 0,!0)],8,na)],2))}}),ra=b(aa,[["__scopeId","data-v-0ad69264"]]),ia={class:"items"},la={class:"title"},ca=m({__name:"VPNavBarTranslations",setup(n){const{theme:e}=S(),{localeLinks:t,currentLang:s}=Y({correspondingLink:!0});return(o,i)=>r(t).length&&r(s).label?(a(),_(be,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:h(()=>[v("div",ia,[v("p",la,N(r(s).label),1),(a(!0),c(C,null,E(r(t),u=>(a(),_(se,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),ua=b(ca,[["__scopeId","data-v-acee064b"]]),da=n=>(B("data-v-9fd4d1dd"),n=n(),H(),n),va={class:"wrapper"},pa={class:"container"},ha={class:"title"},fa={class:"content"},_a={class:"content-body"},ma=da(()=>v("div",{class:"divider"},[v("div",{class:"divider-line"})],-1)),ka=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const e=n,{y:t}=Se(),{hasSidebar:s}=U(),{frontmatter:o}=S(),i=I({});return he(()=>{i.value={"has-sidebar":s.value,home:o.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(u,p)=>(a(),c("div",{class:M(["VPNavBar",i.value])},[v("div",va,[v("div",pa,[v("div",ha,[k(ra,null,{"nav-bar-title-before":h(()=>[l(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[l(u.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),v("div",fa,[v("div",_a,[l(u.$slots,"nav-bar-content-before",{},void 0,!0),k(xs,{class:"search"}),k(Js,{class:"menu"}),k(ua,{class:"translations"}),k(qo,{class:"appearance"}),k(ta,{class:"social-links"}),k(Ts,{class:"extra"}),l(u.$slots,"nav-bar-content-after",{},void 0,!0),k(Bs,{class:"hamburger",active:u.isScreenOpen,onClick:p[0]||(p[0]=d=>u.$emit("toggle-screen"))},null,8,["active"])])])])]),ma],2))}}),ba=b(ka,[["__scopeId","data-v-9fd4d1dd"]]),ga={key:0,class:"VPNavScreenAppearance"},$a={class:"text"},ya=m({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=S();return(s,o)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),c("div",ga,[v("p",$a,N(r(t).darkModeSwitchLabel||"Appearance"),1),k(me)])):f("",!0)}}),Pa=b(ya,[["__scopeId","data-v-a3e2920d"]]),La=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=ne("close-screen");return(t,s)=>(a(),_(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e),innerHTML:t.item.text},null,8,["href","target","rel","onClick","innerHTML"]))}}),Va=b(La,[["__scopeId","data-v-1a934d60"]]),Sa=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=ne("close-screen");return(t,s)=>(a(),_(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:h(()=>[O(N(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Ee=b(Sa,[["__scopeId","data-v-aea78dd1"]]),wa={class:"VPNavScreenMenuGroupSection"},Ta={key:0,class:"title"},Ia=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),c("div",wa,[e.text?(a(),c("p",Ta,N(e.text),1)):f("",!0),(a(!0),c(C,null,E(e.items,s=>(a(),_(Ee,{key:s.text,item:s},null,8,["item"]))),128))]))}}),Na=b(Ia,[["__scopeId","data-v-f60dbfa7"]]),Ma=n=>(B("data-v-341db479"),n=n(),H(),n),Aa=["aria-controls","aria-expanded"],Ca=["innerHTML"],Ba=Ma(()=>v("span",{class:"vpi-plus button-icon"},null,-1)),Ha=["id"],Ea={key:0,class:"item"},Fa={key:1,class:"item"},Da={key:2,class:"group"},Oa=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=I(!1),s=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(i,u)=>(a(),c("div",{class:M(["VPNavScreenMenuGroup",{open:t.value}])},[v("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:o},[v("span",{class:"button-text",innerHTML:i.text},null,8,Ca),Ba],8,Aa),v("div",{id:s.value,class:"items"},[(a(!0),c(C,null,E(i.items,p=>(a(),c(C,{key:JSON.stringify(p)},["link"in p?(a(),c("div",Ea,[k(Ee,{item:p},null,8,["item"])])):"component"in p?(a(),c("div",Fa,[(a(),_(F(p.component),K({ref_for:!0},p.props,{"screen-menu":""}),null,16))])):(a(),c("div",Da,[k(Na,{items:p.items},null,8,["items"])]))],64))),128))],8,Ha)],2))}}),Ga=b(Oa,[["__scopeId","data-v-341db479"]]),Ua={key:0,class:"VPNavScreenMenu"},ja=m({__name:"VPNavScreenMenu",setup(n){const{theme:e}=S();return(t,s)=>r(e).nav?(a(),c("nav",Ua,[(a(!0),c(C,null,E(r(e).nav,o=>(a(),c(C,{key:JSON.stringify(o)},["link"in o?(a(),_(Va,{key:0,item:o},null,8,["item"])):"component"in o?(a(),_(F(o.component),K({key:1,ref_for:!0},o.props,{"screen-menu":""}),null,16)):(a(),_(Ga,{key:2,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ja=m({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=S();return(t,s)=>r(e).socialLinks?(a(),_(ge,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):f("",!0)}}),Fe=n=>(B("data-v-516e4bc3"),n=n(),H(),n),Ka=Fe(()=>v("span",{class:"vpi-languages icon lang"},null,-1)),Wa=Fe(()=>v("span",{class:"vpi-chevron-down icon chevron"},null,-1)),qa={class:"list"},za=m({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=Y({correspondingLink:!0}),s=I(!1);function o(){s.value=!s.value}return(i,u)=>r(e).length&&r(t).label?(a(),c("div",{key:0,class:M(["VPNavScreenTranslations",{open:s.value}])},[v("button",{class:"title",onClick:o},[Ka,O(" "+N(r(t).label)+" ",1),Wa]),v("ul",qa,[(a(!0),c(C,null,E(r(e),p=>(a(),c("li",{key:p.link,class:"item"},[k(D,{class:"link",href:p.link},{default:h(()=>[O(N(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),Ra=b(za,[["__scopeId","data-v-516e4bc3"]]),Ya={class:"container"},Xa=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=I(null),t=we(oe?document.body:null);return(s,o)=>(a(),_(ve,{name:"fade",onEnter:o[0]||(o[0]=i=>t.value=!0),onAfterLeave:o[1]||(o[1]=i=>t.value=!1)},{default:h(()=>[s.open?(a(),c("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[v("div",Ya,[l(s.$slots,"nav-screen-content-before",{},void 0,!0),k(ja,{class:"menu"}),k(Ra,{class:"translations"}),k(Pa,{class:"appearance"}),k(Ja,{class:"social-links"}),l(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),Qa=b(Xa,[["__scopeId","data-v-2dd6d0c7"]]),Za={key:0,class:"VPNav"},xa=m({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=Bo(),{frontmatter:o}=S(),i=y(()=>o.value.navbar!==!1);return Te("close-screen",t),Z(()=>{oe&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(u,p)=>i.value?(a(),c("header",Za,[k(ba,{"is-screen-open":r(e),onToggleScreen:r(s)},{"nav-bar-title-before":h(()=>[l(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[l(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[l(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[l(u.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),k(Qa,{open:r(e)},{"nav-screen-content-before":h(()=>[l(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[l(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),er=b(xa,[["__scopeId","data-v-7ad780c2"]]),De=n=>(B("data-v-edd2eed8"),n=n(),H(),n),tr=["role","tabindex"],nr=De(()=>v("div",{class:"indicator"},null,-1)),or=De(()=>v("span",{class:"vpi-chevron-right caret-icon"},null,-1)),sr=[or],ar={key:1,class:"items"},rr=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:s,isLink:o,isActiveLink:i,hasActiveLink:u,hasChildren:p,toggle:d}=Pt(y(()=>e.item)),g=y(()=>p.value?"section":"div"),w=y(()=>o.value?"a":"div"),P=y(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),$=y(()=>o.value?void 0:"button"),L=y(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":o.value},{"is-active":i.value},{"has-active":u.value}]);function V(T){"key"in T&&T.key!=="Enter"||!e.item.link&&d()}function A(){e.item.link&&d()}return(T,j)=>{const J=z("VPSidebarItem",!0);return a(),_(F(g.value),{class:M(["VPSidebarItem",L.value])},{default:h(()=>[T.item.text?(a(),c("div",K({key:0,class:"item",role:$.value},Ze(T.item.items?{click:V,keydown:V}:{},!0),{tabindex:T.item.items&&0}),[nr,T.item.link?(a(),_(D,{key:0,tag:w.value,class:"link",href:T.item.link,rel:T.item.rel,target:T.item.target},{default:h(()=>[(a(),_(F(P.value),{class:"text",innerHTML:T.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),_(F(P.value),{key:1,class:"text",innerHTML:T.item.text},null,8,["innerHTML"])),T.item.collapsed!=null&&T.item.items&&T.item.items.length?(a(),c("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:A,onKeydown:xe(A,["enter"]),tabindex:"0"},sr,32)):f("",!0)],16,tr)):f("",!0),T.item.items&&T.item.items.length?(a(),c("div",ar,[T.depth<5?(a(!0),c(C,{key:0},E(T.item.items,R=>(a(),_(J,{key:R.text,item:R,depth:T.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),ir=b(rr,[["__scopeId","data-v-edd2eed8"]]),lr=m({__name:"VPSidebarGroup",props:{items:{}},setup(n){const e=I(!0);let t=null;return W(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),et(()=>{t!=null&&(clearTimeout(t),t=null)}),(s,o)=>(a(!0),c(C,null,E(s.items,i=>(a(),c("div",{key:i.text,class:M(["group",{"no-transition":e.value}])},[k(ir,{item:i,depth:0},null,8,["item"])],2))),128))}}),cr=b(lr,[["__scopeId","data-v-51288d80"]]),Oe=n=>(B("data-v-42c4c606"),n=n(),H(),n),ur=Oe(()=>v("div",{class:"curtain"},null,-1)),dr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},vr=Oe(()=>v("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),pr=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=U(),s=n,o=I(null),i=we(oe?document.body:null);G([s,o],()=>{var p;s.open?(i.value=!0,(p=o.value)==null||p.focus()):i.value=!1},{immediate:!0,flush:"post"});const u=I(0);return G(e,()=>{u.value+=1},{deep:!0}),(p,d)=>r(t)?(a(),c("aside",{key:0,class:M(["VPSidebar",{open:p.open}]),ref_key:"navEl",ref:o,onClick:d[0]||(d[0]=tt(()=>{},["stop"]))},[ur,v("nav",dr,[vr,l(p.$slots,"sidebar-nav-before",{},void 0,!0),(a(),_(cr,{items:r(e),key:u.value},null,8,["items"])),l(p.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),hr=b(pr,[["__scopeId","data-v-42c4c606"]]),fr=m({__name:"VPSkipLink",setup(n){const e=te(),t=I();G(()=>e.path,()=>t.value.focus());function s({target:o}){const i=document.getElementById(decodeURIComponent(o.hash).slice(1));if(i){const u=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",u)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",u),i.focus(),window.scrollTo(0,0)}}return(o,i)=>(a(),c(C,null,[v("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),v("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}}),_r=b(fr,[["__scopeId","data-v-c8291ffa"]]),mr=m({__name:"Layout",setup(n){const{isOpen:e,open:t,close:s}=U(),o=te();G(()=>o.path,s),yt(e,s);const{frontmatter:i}=S(),u=nt(),p=y(()=>!!u["home-hero-image"]);return Te("hero-image-slot-exists",p),(d,g)=>{const w=z("Content");return r(i).layout!==!1?(a(),c("div",{key:0,class:M(["Layout",r(i).pageClass])},[l(d.$slots,"layout-top",{},void 0,!0),k(_r),k(it,{class:"backdrop",show:r(e),onClick:r(s)},null,8,["show","onClick"]),k(er,null,{"nav-bar-title-before":h(()=>[l(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[l(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[l(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[l(d.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[l(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[l(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),k(Co,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),k(hr,{open:r(e)},{"sidebar-nav-before":h(()=>[l(d.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[l(d.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),k(po,null,{"page-top":h(()=>[l(d.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[l(d.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[l(d.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[l(d.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[l(d.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[l(d.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[l(d.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[l(d.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[l(d.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[l(d.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[l(d.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[l(d.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[l(d.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[l(d.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[l(d.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[l(d.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[l(d.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[l(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[l(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[l(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[l(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[l(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[l(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),k(ko),l(d.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),_(w,{key:1}))}}}),kr=b(mr,[["__scopeId","data-v-d8b57b2d"]]),Ge={Layout:kr,enhanceApp:({app:n})=>{n.component("Badge",st)}},br={class:"comment-container vp-raw"},gr=v("link",{rel:"stylesheet",href:"https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css",integrity:"sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X",crossorigin:"anonymous"},null,-1),$r=v("link",{rel:"stylesheet",href:"https://cdn.jsdelivr.net/npm/lightgallery@2.1.8/css/lightgallery.css",integrity:"sha384-U8ohOXEVyF0NGY2LQnH83V4wGxOmFhim4U5xhfE/WDCHdPO2iUKPPYkhpDl9U/Yf",crossorigin:"anonymous"},null,-1),yr=v("div",{id:"twikoo"},null,-1),Pr="https://twikoojsorg.imaegoo.com",ye={__name:"Twikoo",setup(n){const e=I(null),t=ot();function s(){try{twikoo.init({envId:Pr,onCommentLoaded:o})}catch{}}function o(){for(var p=[...document.getElementsByClassName("vp-doc"),...document.getElementsByClassName("tk-content")],d=0;d0){for(var P=0;P{s(),i()}),(p,d)=>(a(),c("div",br,[gr,(a(),_(F("script"),{defer:"",src:"https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js",integrity:"sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4",crossorigin:"anonymous"})),(a(),_(F("script"),{defer:"",src:"https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js",integrity:"sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa",crossorigin:"anonymous"})),$r,(a(),_(F("script"),{src:"https://cdn.jsdelivr.net/npm/lightgallery@2.1.8/lightgallery.min.js",integrity:"sha384-l5lFB9srHFAyvfCoHya9X1JwGGTNPvDtikieqZp7qu/bomCw0e0+yoyiL0f7UXLD",crossorigin:"anonymous"})),yr,(a(),_(F("script"),{src:"https://cdn.jsdelivr.net/npm/twikoo@1.6.38/dist/twikoo.min.js",crossorigin:"anonymous",ref_key:"twikooJs",ref:e},null,512))]))}},Lr={class:"home-comment-container"},Vr={__name:"Layout",setup(n){const{Layout:e}=Ge;return(t,s)=>(a(),_(r(e),null,{"home-features-after":h(()=>[v("div",Lr,[k(ye)])]),"doc-after":h(()=>[k(ye)]),_:1}))}},wr={...Ge,Layout:Vr};export{wr as R,S as u}; diff --git a/assets/cms.md.DDBp-Tvm.js b/assets/cms.md.DDBp-Tvm.js new file mode 100644 index 000000000..abca9e68b --- /dev/null +++ b/assets/cms.md.DDBp-Tvm.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,j as e,a as o}from"./chunks/framework.aNBt3w9_.js";const x=JSON.parse('{"title":"反垃圾","description":"","frontmatter":{},"headers":[],"relativePath":"cms.md","filePath":"cms.md","lastUpdated":null}'),c={name:"cms.md"},r=e("h1",{id:"反垃圾",tabindex:"-1"},[o("反垃圾 "),e("a",{class:"header-anchor",href:"#反垃圾","aria-label":'Permalink to "反垃圾"'},"​")],-1),n=e("p",null,[e("a",{href:"./faq.html#如何配置反垃圾"},"如何配置反垃圾?")],-1),d=[r,n];function l(i,_,m,h,p,f){return s(),t("div",null,d)}const $=a(c,[["render",l]]);export{x as __pageData,$ as default}; diff --git a/assets/cms.md.DDBp-Tvm.lean.js b/assets/cms.md.DDBp-Tvm.lean.js new file mode 100644 index 000000000..abca9e68b --- /dev/null +++ b/assets/cms.md.DDBp-Tvm.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,j as e,a as o}from"./chunks/framework.aNBt3w9_.js";const x=JSON.parse('{"title":"反垃圾","description":"","frontmatter":{},"headers":[],"relativePath":"cms.md","filePath":"cms.md","lastUpdated":null}'),c={name:"cms.md"},r=e("h1",{id:"反垃圾",tabindex:"-1"},[o("反垃圾 "),e("a",{class:"header-anchor",href:"#反垃圾","aria-label":'Permalink to "反垃圾"'},"​")],-1),n=e("p",null,[e("a",{href:"./faq.html#如何配置反垃圾"},"如何配置反垃圾?")],-1),d=[r,n];function l(i,_,m,h,p,f){return s(),t("div",null,d)}const $=a(c,[["render",l]]);export{x as __pageData,$ as default}; diff --git a/assets/configuration.md.Cutop-pC.js b/assets/configuration.md.Cutop-pC.js new file mode 100644 index 000000000..1ec0cb075 --- /dev/null +++ b/assets/configuration.md.Cutop-pC.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,a5 as r}from"./chunks/framework.aNBt3w9_.js";const u=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"configuration.md","filePath":"configuration.md","lastUpdated":null}'),t={name:"configuration.md"},l=r('

配置

注意

因图形化配置界面已上线,此文档已废弃且不再维护,其中的内容可能已经过时

  • 配置是可选的,即使没有配置也可以使用。
  • 请确保 config 表的权限不是“所有用户可读”,以保证 SMTP 密码等信息不会泄露。
    不过放心,默认权限是安全的,您不需要更改。
  • 请将配置项放在一条数据记录中。

通用

SITE_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站

博客、站点名称。

SITE_URL

类型: String
默认值: null
必要性: false
示例: https://www.imaegoo.com

博客、站点地址。

BLOGGER_EMAIL

类型: String
默认值: null
必要性: false
示例: 12345@qq.com

博主的邮箱地址,用于邮件通知、博主标识。

反垃圾

AKISMET_KEY

类型: String
默认值: null
必要性: false
示例: 8651783ed123

反垃圾评论 API key。

微信通知

SC_SENDKEY

类型: String
默认值: null
必要性: false
示例: SCT1364TKdsiGjGvyAZNYDVnuHW12345

Server酱微信推送的 SCKEY

邮件通知

SENDER_EMAIL

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱地址。对于大多数邮箱服务商,SENDER_EMAIL 必须和 SMTP_USER 保持一致,否则无法发送邮件。

SENDER_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站评论提醒

邮件通知标题。

SMTP_SERVICE

类型: String
默认值: null
必要性: false
示例: qiye.aliyun

邮件通知邮箱服务商。
完整列表请参考:Supported services

SMTP_USER

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱用户名。

SMTP_PASS

类型: String
默认值: null
必要性: false
示例: password

邮件通知邮箱密码,QQ邮箱请填写授权码。

',36),c=[l];function d(i,n,s,h,b,p){return o(),a("div",null,c)}const _=e(t,[["render",d]]);export{u as __pageData,_ as default}; diff --git a/assets/configuration.md.Cutop-pC.lean.js b/assets/configuration.md.Cutop-pC.lean.js new file mode 100644 index 000000000..a11ced52e --- /dev/null +++ b/assets/configuration.md.Cutop-pC.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,a5 as r}from"./chunks/framework.aNBt3w9_.js";const u=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"configuration.md","filePath":"configuration.md","lastUpdated":null}'),t={name:"configuration.md"},l=r("",36),c=[l];function d(i,n,s,h,b,p){return o(),a("div",null,c)}const _=e(t,[["render",d]]);export{u as __pageData,_ as default}; diff --git a/assets/en_api.md.ZSRIbW5p.js b/assets/en_api.md.ZSRIbW5p.js new file mode 100644 index 000000000..5e6fe800c --- /dev/null +++ b/assets/en_api.md.ZSRIbW5p.js @@ -0,0 +1,55 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.aNBt3w9_.js";const g=JSON.parse('{"title":"API reference","description":"","frontmatter":{},"headers":[],"relativePath":"en/api.md","filePath":"en/api.md","lastUpdated":null}'),e={name:"en/api.md"},t=n(`

API reference

Through Twikoo API, theme developers can implement some special features, such as displaying the number of article comments in the article list, displaying the latest comments on the home page, etc.

It is not necessary to execute twikoo.init() before calling the Twikoo API.

Get comments count

Get the number of article comments in batch.

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: 'Environment ID', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  urls: [ // List of article paths without protocols, domains and parameters. It is a mandatory parameter
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // Whether the number of comments includes replies, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // example: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

Get recent comments

Get the latest comments.

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  pageSize: 10, // Get how many bars, the default parameter is 10, the maximum parameter is 100
+  includeReply: false // Whether to include the latest reply, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // Returns Array with the latest comments
+  // * id: comment ID
+  // * url: address of the comment
+  // * nick: nickname
+  // * mailMd5: The MD5 value of the mailbox, which can be used to display the avatar
+  // * link: URL
+  // * comment: the content of the comment in HTML format
+  // * commentText: comment content in plain text format
+  // * created: comment time, in millisecond timestamp format
+  // * avatar: the address of the avatar (new in 0.2.9)
+  // * relativeTime: relative comment time, e.g. "1 hour ago" (new in 0.2.9)
+  // Return example: [ // order from new to old
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

On Twikoo loaded

Callback function after Twikoo is successfully mounted.
It will not be triggered in case of environment ID error, network exception, mount failure, etc.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo is ready to go!');
+});

On comment loaded

Callback function after comments are loaded successfully.
It will also be triggered when the comment is automatically refreshed after posting and when the next page of comments is loaded.
It will not be triggered when the comment fails to load.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('Comment loading complete');
+  }
+});
`,27),l=[t];function h(p,k,r,o,d,E){return a(),i("div",null,l)}const m=s(e,[["render",h]]);export{g as __pageData,m as default}; diff --git a/assets/en_api.md.ZSRIbW5p.lean.js b/assets/en_api.md.ZSRIbW5p.lean.js new file mode 100644 index 000000000..582e04338 --- /dev/null +++ b/assets/en_api.md.ZSRIbW5p.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,a5 as n}from"./chunks/framework.aNBt3w9_.js";const g=JSON.parse('{"title":"API reference","description":"","frontmatter":{},"headers":[],"relativePath":"en/api.md","filePath":"en/api.md","lastUpdated":null}'),e={name:"en/api.md"},t=n("",27),l=[t];function h(p,k,r,o,d,E){return a(),i("div",null,l)}const m=s(e,[["render",h]]);export{g as __pageData,m as default}; diff --git a/assets/en_backend.md.Dc5PAZtF.js b/assets/en_backend.md.Dc5PAZtF.js new file mode 100644 index 000000000..e7bd2a5a5 --- /dev/null +++ b/assets/en_backend.md.Dc5PAZtF.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.aNBt3w9_.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend.md","filePath":"en/backend.md","lastUpdated":null}'),n={name:"en/backend.md"};function c(r,o,s,d,p,_){return a(),t("div")}const m=e(n,[["render",c]]);export{l as __pageData,m as default}; diff --git a/assets/en_backend.md.Dc5PAZtF.lean.js b/assets/en_backend.md.Dc5PAZtF.lean.js new file mode 100644 index 000000000..e7bd2a5a5 --- /dev/null +++ b/assets/en_backend.md.Dc5PAZtF.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.aNBt3w9_.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend.md","filePath":"en/backend.md","lastUpdated":null}'),n={name:"en/backend.md"};function c(r,o,s,d,p,_){return a(),t("div")}const m=e(n,[["render",c]]);export{l as __pageData,m as default}; diff --git a/assets/en_faq.md.CuEu6Jq3.js b/assets/en_faq.md.CuEu6Jq3.js new file mode 100644 index 000000000..ca754cc92 --- /dev/null +++ b/assets/en_faq.md.CuEu6Jq3.js @@ -0,0 +1,17 @@ +import{_ as e}from"./chunks/katex.B5umXGHV.js";import{_ as i,c as t,o as s,a5 as a}from"./chunks/framework.aNBt3w9_.js";const m=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq.md","filePath":"en/faq.md","lastUpdated":null}'),n={name:"en/faq.md"},o=a(`

FAQ

How do I change my avatar?

https://gravatar.com Register and set your avatar by email and leave the same email when commenting.

Visitors can also comment by entering their digital QQ email address and using their QQ avatar.

How do I change or reset the administrator password?

云开发控制台Edit the configuration, delete the config.ADMIN_PASS configuration item, and then go to the Twikoo administration panel to reset the password.

How to get the private key file of the admin panel?

  1. 环境-登录授权Click "Private Key Download" on the right of "Custom Login" to download the private key file
  2. Open the private key file with a text editor and copy all the contents
  3. Click the "pinion" (settings) icon in the comment window, paste the contents of the private key file, and set the administrator password

How to turn on article visit statistics?

You can add where you need to show the number of article visits:

html
<span id="twikoo_visitors">0</span>

to display the number of visits. We do not support site-wide visit statistics at the moment.

How can I test if the Akismet anti-spam configuration is in effect?

Please fill in viagra-test-123 as a nickname, or akismet-guaranteed-spam@example.com as an email address to post a comment, which will definitely be considered as a spam comment.

Note that due to the slow response time of the Akismet service (about 6 seconds), which affects the user experience, Twikoo adopts a "release first, detect later" policy, and spam comments will be visible for a short time after they are posted.

How are free resources calculated?

环境总览See resource usage. twikoo consumes database and cloud functions, both with a free usage of -

  • Database: 50,000 reads/day, 50,000 writes/day
  • Cloud functions: 40,000 GBs/month

The memory consumption of Twikoo cloud functions is constant at 0.1GB, which means that Twikoo cloud functions have a running time of up to 400,000 seconds per month, and the bottleneck of free resources is mainly in the daily read limit of the database. It is recommended that webmasters pay attention to the usage of free resources.

How do I enable Katex support?

Twikoo supports Katex formulas, but to limit the package size of Twikoo, Twikoo does not have the full Katex built-in, you need to load katex.js additionally in the page.

example

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

After loading, you can send $$c = \\pm\\sqrt{a^2 + b^2}$$ to test the effect.

katex

You can also pass in a custom katex configuration during twikoo.init, see Katex Auto-render Extension for details.

js
twikoo.init({
+  envId: 'Environment id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\\\(', right: '\\\\)', display: false },
+      { left: '\\\\[', right: '\\\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

How to configure anti-spam?

Using Tencent Cloud Content Security Service

Twikoo supports access to Tencent Cloud Text Content Detection, which uses deep learning technology to identify harmful content involving pornography, politics, terrorism, etc. It also supports user-configurable thesaurus to combat customized offending text.

Tencent Cloud text content detection is a paid service, offering a 1-month free trial, after which the price is 25 RMB per 10,000 entries. If you don't have high requirements for anti-spam comments, you can also use the free Akismet.

How to apply for Tencent Cloud Text Content Inspection?

  1. Visit Tencent Cloud Console - Text Content Security to open the text content security service
  2. Visit Tencent Cloud Console - User List, click New User, and click Quick Create.
  3. Enter the user name, select "Programmatic Access" as the access method, cancel "AdministratorAccess" as the user privilege, and only check the box "QcloudCMSFullAccess". QcloudCMSFullAccess".
  4. Click "Create User". 5.
  5. Copy the "SecretId" and "SecretKey" from the "Successful New User" page to the Twikoo administration panel Configure them in the "Anti-Spam" module
  6. Test the anti-spam effect

After success, webmasters can configure custom text content filtering in Tencent Cloud Console - Custom Library Management.

Using Akismet Anti-Spam Service

Akismet (Automattic Kismet) is a widely used spam filtering system by Matt Mullenweg, the founder of WordPress, Akismet is also the default plugin installed in WordPress and is very widely used. The goal of the design is to help blog sites to filter spam messages.

  1. Register akismet.com
  2. Select Akismet Personal subscription, copy the Akismet API Key and configure it in the Twikoo admin panel "Anti-Spam" module

Error encountered in login administration panel AUTH_INVALID_CUSTOM_LOGIN_TICKET

Generally, after configuring the login private key, the login private key is downloaded again, which causes the previously configured login private key to be invalid.
Solution: Go to Cloud Development Console, database, delete the config, and then reconfigure the private key.

Can't receive emails?

If it is a cloud function deployed by Vercel, please configure foreign mail service providers to avoid being judged as spam behavior by mail service providers. If it is other reasons, please go to Twikoo management panel, find mail test function, enter your personal mailbox and troubleshoot the reasons according to the test results.

In order to avoid performance problems caused by frequent mailbox checking, the mail configuration has a cache of about 10 minutes, if you are sure the configuration is fine but the test fails, you can wait for 10 minutes and then test again.

Vercel can't upload images?

The Tencent Cloud environment comes with cloud storage, so you can upload images directly in the Tencent Cloud environment, and the images are saved in the cloud storage. However, Vercel environment does not, the upload image function relies on third party image bed, please configure the image bed in the admin panel, Twikoo supports the following image bed:

BedAddressFeatures
qcloudNoneTencent Cloud environment comes with it, can be viewed in Cloud Development - Cloud Storage
7buhttps://7bu.topGo to No Bed, powered by 杜老师, no free packages
smmshttps://sm.msSMMS image bed, there is a free package, please register your account, IMAGE_CDN_TOKEN can be obtained in Dashboard
lsky-proPrivate DeploymentLankenGraphics 2.0 version, IMAGE_CDN please configure the URL address of the home page of the graph bed (such as https://7bu.top), IMAGE_CDN_TOKEN get way please refer to the tutorial 杜老师 said the graph bed: new version Go not to the bed Token acquisition and emptying, the format of the obtained token should be 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5)

Can it be deployed privately?

Yes.

`,47),r=[o];function l(h,p,d,k,c,u){return s(),t("div",null,r)}const y=i(n,[["render",l]]);export{m as __pageData,y as default}; diff --git a/assets/en_faq.md.CuEu6Jq3.lean.js b/assets/en_faq.md.CuEu6Jq3.lean.js new file mode 100644 index 000000000..a985f01b4 --- /dev/null +++ b/assets/en_faq.md.CuEu6Jq3.lean.js @@ -0,0 +1 @@ +import{_ as e}from"./chunks/katex.B5umXGHV.js";import{_ as i,c as t,o as s,a5 as a}from"./chunks/framework.aNBt3w9_.js";const m=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq.md","filePath":"en/faq.md","lastUpdated":null}'),n={name:"en/faq.md"},o=a("",47),r=[o];function l(h,p,d,k,c,u){return s(),t("div",null,r)}const y=i(n,[["render",l]]);export{m as __pageData,y as default}; diff --git a/assets/en_frontend.md.CWcIC4bn.js b/assets/en_frontend.md.CWcIC4bn.js new file mode 100644 index 000000000..2235055ee --- /dev/null +++ b/assets/en_frontend.md.CWcIC4bn.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as n}from"./chunks/framework.aNBt3w9_.js";const i=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend.md","filePath":"en/frontend.md","lastUpdated":null}'),a={name:"en/frontend.md"};function r(o,s,d,c,f,p){return n(),t("div")}const l=e(a,[["render",r]]);export{i as __pageData,l as default}; diff --git a/assets/en_frontend.md.CWcIC4bn.lean.js b/assets/en_frontend.md.CWcIC4bn.lean.js new file mode 100644 index 000000000..2235055ee --- /dev/null +++ b/assets/en_frontend.md.CWcIC4bn.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as n}from"./chunks/framework.aNBt3w9_.js";const i=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend.md","filePath":"en/frontend.md","lastUpdated":null}'),a={name:"en/frontend.md"};function r(o,s,d,c,f,p){return n(),t("div")}const l=e(a,[["render",r]]);export{i as __pageData,l as default}; diff --git a/assets/en_index.md.DAkyKDbd.js b/assets/en_index.md.DAkyKDbd.js new file mode 100644 index 000000000..b1a2cb712 --- /dev/null +++ b/assets/en_index.md.DAkyKDbd.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.aNBt3w9_.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"A simple, safe, free comment system","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"A simple, safe, free comment system","hero":{"name":"Twikoo","text":"Comment system","tagline":"Simple, safe, free","actions":[{"theme":"brand","text":"Quick start","link":"/en/quick-start"},{"theme":"alt","text":"Introduction","link":"/en/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":null}'),o={name:"en/index.md"};function n(a,s,l,m,c,r){return i(),t("div")}const f=e(o,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/en_index.md.DAkyKDbd.lean.js b/assets/en_index.md.DAkyKDbd.lean.js new file mode 100644 index 000000000..b1a2cb712 --- /dev/null +++ b/assets/en_index.md.DAkyKDbd.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.aNBt3w9_.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"A simple, safe, free comment system","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"A simple, safe, free comment system","hero":{"name":"Twikoo","text":"Comment system","tagline":"Simple, safe, free","actions":[{"theme":"brand","text":"Quick start","link":"/en/quick-start"},{"theme":"alt","text":"Introduction","link":"/en/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":null}'),o={name:"en/index.md"};function n(a,s,l,m,c,r){return i(),t("div")}const f=e(o,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/en_intro.md.B5kTfFqc.js b/assets/en_intro.md.B5kTfFqc.js new file mode 100644 index 000000000..684e8ae2b --- /dev/null +++ b/assets/en_intro.md.B5kTfFqc.js @@ -0,0 +1,3 @@ +import{_ as e,a,b as t,c as i}from"./chunks/readme-3.hEA_5CR-.js";import{_ as o,c as l,o as s,a5 as r}from"./chunks/framework.aNBt3w9_.js";const q=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/intro.md","filePath":"en/intro.md","lastUpdated":null}'),n={name:"en/intro.md"},h=r('Twikoo
       

A simple, safe, free comment system.
简体中文 | English

This document is for American English. This document has many bugs.

Features

Simple

  • Free Build.(Using CloudBase / Vercel / self-hosted as the commenting backend)
  • Simple Deployment.(Support CloudBase / Vercel one-click deployment)

Easy to use

  • Support reply, like.
  • No additional adaptations, support with light theme and dark theme use.
  • Support API , batch get article comment count, latest comments.
  • Visitors entering QQ number in the nickname field will automatically complete the QQ nickname and QQ email.
  • Visitors fill in the digital QQ e-mail, will use the QQ avatar as the comment avatar.
  • Support the comment to paste pictures.(Can be disabled)
  • Support inserting pictures.(Can be disabled)
  • Support 7bu image bed, Tencent CloudBase image bed.
  • Support inserting emoji.(Can be disabled)
  • Support Ctrl + Enter reply.
  • Comments are saved in draft in real time and will not be lost when refreshed.
  • Support Katex formulas.
  • Support for code highlighting by language.

Security

  • Privacy and information security. (sensitive fields (email, IP, environment configuration, etc.) are not leaked through Tencent cloud function control)
  • Support for Akismet spam comment detection.(View Details akismet.com
  • Support Tencent Cloud content security spam comment detection.(View Details Tencent Cloud Content Security
  • Support manual review mode.
  • Anti XSS Attack.
  • Support for limiting the maximum number of comments per IP per 10 minutes.

notification

  • E-mail(Visitors and Blogger)
  • Wechat(only Blogger, Server酱
  • QQ(only Blogger, Qmsg酱

Personalization

  • Background image.
  • the "blogger" logo text.
  • Notification Email Template.
  • Comment prompt message.(placeholder)
  • emoji(OwO 的数据格式
  • 【Nickname】 【Email】 【Website】 Required / Optional
  • Code highlighting theme.

Management

  • Embedded panel with password login to easily view comments, hide comments, delete comments and modify configuration.
  • Support to hide the management portal and show it by entering a secret code.
  • Support for importing comments from Valine, Artalk, Disqus.

Disadvantages

  • IE is not supported.

Preview

Comments

Comments

Management

Management

Notification

Notification

Quick Start

Deploy

View Details

If you want to get updates, make suggestions and participate in the test, welcome to join the discussion group:1080829142 (QQ)
1080829142

Special Thanks

Icon design:Maemo Lee

Release notes & plans

Update logs & Development Plan

Development

If you want to develop locally for a second time, you can refer to the following commands:

sh
yarn dev # (http://localhost:9820/demo.html)
+yarn lint 
+yarn build # (dist/twikoo.all.min.js)

If your changes can help more people, feel free to submit a Pull Request!

I18N

Support Simplified Chinese, Traditional Chinese, English. translate Pull Request.

License

FOSSA Status

`,47),p=[h];function m(c,d,u,g,k,f){return s(),l("div",null,p)}const _=o(n,[["render",m]]);export{q as __pageData,_ as default}; diff --git a/assets/en_intro.md.B5kTfFqc.lean.js b/assets/en_intro.md.B5kTfFqc.lean.js new file mode 100644 index 000000000..60f9cf7fb --- /dev/null +++ b/assets/en_intro.md.B5kTfFqc.lean.js @@ -0,0 +1 @@ +import{_ as e,a,b as t,c as i}from"./chunks/readme-3.hEA_5CR-.js";import{_ as o,c as l,o as s,a5 as r}from"./chunks/framework.aNBt3w9_.js";const q=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/intro.md","filePath":"en/intro.md","lastUpdated":null}'),n={name:"en/intro.md"},h=r("",47),p=[h];function m(c,d,u,g,k,f){return s(),l("div",null,p)}const _=o(n,[["render",m]]);export{q as __pageData,_ as default}; diff --git a/assets/en_link.md.Co6pIHmc.js b/assets/en_link.md.Co6pIHmc.js new file mode 100644 index 000000000..1464046ce --- /dev/null +++ b/assets/en_link.md.Co6pIHmc.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as n,j as e,a as s}from"./chunks/framework.aNBt3w9_.js";const f=JSON.parse('{"title":"Links","description":"","frontmatter":{},"headers":[],"relativePath":"en/link.md","filePath":"en/link.md","lastUpdated":null}'),i={name:"en/link.md"},o=e("h1",{id:"links",tabindex:"-1"},[s("Links "),e("a",{class:"header-anchor",href:"#links","aria-label":'Permalink to "Links"'},"​")],-1),r=[o];function l(c,d,_,k,p,h){return n(),t("div",null,r)}const u=a(i,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/en_link.md.Co6pIHmc.lean.js b/assets/en_link.md.Co6pIHmc.lean.js new file mode 100644 index 000000000..1464046ce --- /dev/null +++ b/assets/en_link.md.Co6pIHmc.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as n,j as e,a as s}from"./chunks/framework.aNBt3w9_.js";const f=JSON.parse('{"title":"Links","description":"","frontmatter":{},"headers":[],"relativePath":"en/link.md","filePath":"en/link.md","lastUpdated":null}'),i={name:"en/link.md"},o=e("h1",{id:"links",tabindex:"-1"},[s("Links "),e("a",{class:"header-anchor",href:"#links","aria-label":'Permalink to "Links"'},"​")],-1),r=[o];function l(c,d,_,k,p,h){return n(),t("div",null,r)}const u=a(i,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/en_quick-start.md.CBRNRlRv.js b/assets/en_quick-start.md.CBRNRlRv.js new file mode 100644 index 000000000..cd92f5d57 --- /dev/null +++ b/assets/en_quick-start.md.CBRNRlRv.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a5 as s}from"./chunks/framework.aNBt3w9_.js";const k=JSON.parse('{"title":"Quick start","description":"","frontmatter":{},"headers":[],"relativePath":"en/quick-start.md","filePath":"en/quick-start.md","lastUpdated":null}'),c={name:"en/quick-start.md"},i=s('

Quick start

Tip

The English document is being built. Please refer to the Chinese document.

',2),r=[i];function o(n,_,l,u,d,p){return a(),e("div",null,r)}const m=t(c,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/en_quick-start.md.CBRNRlRv.lean.js b/assets/en_quick-start.md.CBRNRlRv.lean.js new file mode 100644 index 000000000..f19e68edd --- /dev/null +++ b/assets/en_quick-start.md.CBRNRlRv.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,a5 as s}from"./chunks/framework.aNBt3w9_.js";const k=JSON.parse('{"title":"Quick start","description":"","frontmatter":{},"headers":[],"relativePath":"en/quick-start.md","filePath":"en/quick-start.md","lastUpdated":null}'),c={name:"en/quick-start.md"},i=s("",2),r=[i];function o(n,_,l,u,d,p){return a(),e("div",null,r)}const m=t(c,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/en_update.md.DFYULA2k.js b/assets/en_update.md.DFYULA2k.js new file mode 100644 index 000000000..64d8dd8f4 --- /dev/null +++ b/assets/en_update.md.DFYULA2k.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.aNBt3w9_.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/update.md","filePath":"en/update.md","lastUpdated":null}'),n={name:"en/update.md"};function r(o,s,d,p,c,_){return a(),t("div")}const m=e(n,[["render",r]]);export{l as __pageData,m as default}; diff --git a/assets/en_update.md.DFYULA2k.lean.js b/assets/en_update.md.DFYULA2k.lean.js new file mode 100644 index 000000000..64d8dd8f4 --- /dev/null +++ b/assets/en_update.md.DFYULA2k.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.aNBt3w9_.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/update.md","filePath":"en/update.md","lastUpdated":null}'),n={name:"en/update.md"};function r(o,s,d,p,c,_){return a(),t("div")}const m=e(n,[["render",r]]);export{l as __pageData,m as default}; diff --git a/assets/faq.md.B4Pnc9sL.js b/assets/faq.md.B4Pnc9sL.js new file mode 100644 index 000000000..ab4984615 --- /dev/null +++ b/assets/faq.md.B4Pnc9sL.js @@ -0,0 +1,17 @@ +import{_ as s}from"./chunks/katex.B5umXGHV.js";import{_ as i,c as a,o as t,a5 as e}from"./chunks/framework.aNBt3w9_.js";const F=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":null}'),n={name:"faq.md"},h=e(`

常见问题

如何修改头像?

请前往 https://weavatar.com 通过邮箱注册并设定头像,评论时,请留下相同的邮箱。

访客还可以通过输入数字 QQ 邮箱地址,使用 QQ 头像发表评论。

如何修改、重置管理员密码?

腾讯云请前往云开发控制台,Vercel 请前往 MongoDB,私有部署请直接编辑 data/db.json.1,编辑配置,删除 config.ADMIN_PASS 配置项,然后前往 Twikoo 管理面板重新设置密码。

如何获得管理面板的私钥文件?

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

如何开启文章访问量统计?

您可以在需要展示文章访问量的地方添加:

html
<span id="twikoo_visitors">0</span>

来展示访问量。暂不支持全站访问量统计。

如何启用 Katex 支持?

Twikoo 支持 Katex 公式,但为了限制 Twikoo 的包大小,Twikoo 没有内置完整的 Katex,您需要在页面中额外加载 katex.js

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

载入后,您可以发送 $$c = \\pm\\sqrt{a^2 + b^2}$$ 测试效果。

katex

您还可以在 twikoo.init 时传入自定义 katex 配置,详细配置请查看 Katex Auto-render Extension

js
twikoo.init({
+  envId: '您的环境id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\\\(', right: '\\\\)', display: false },
+      { left: '\\\\[', right: '\\\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

如何配置反垃圾?

使用腾讯云内容安全服务

Twikoo 支持接入腾讯云文本内容检测,使用深度学习技术,识别涉黄、涉政、涉恐等有害内容,同时支持用户配置词库,打击自定义的违规文本。

腾讯云文本内容检测是付费服务,提供 1 个月的免费试用,之后价格为 25 元/万条。如果您对反垃圾评论要求不高,也可以使用免费的 Akismet。

如何申请腾讯云文本内容检测

  1. 访问腾讯云控制台-文本内容安全,开通文本内容安全服务
  2. 访问腾讯云控制台-用户列表,点击新建用户,点击快速创建
  3. 输入用户名,访问方式选择“编程访问”,用户权限取消“AdministratorAccess”,只勾选“QcloudCMSFullAccess”
  4. 点击“创建用户”
  5. 复制“成功新建用户”页面的“SecretId”和“SecretKey”,到 Twikoo 管理面板“反垃圾”模块中配置
  6. 测试反垃圾效果

成功后,站长可以在腾讯云控制台-自定义库管理配置自定义文本内容过滤。

使用 Akismet 反垃圾服务

Akismet (Automattic Kismet) 是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的 WordPress 创始人 Matt Mullenweg,Akismet 也是 WordPress 默认安装的插件,其使用非常广泛,设计目标便是帮助博客网站来过滤垃圾留言。

  1. 注册 akismet.com
  2. 选择 Akismet Personal 订阅,复制得到的 Akismet API Key,到 Twikoo 管理面板“反垃圾”模块中配置

如何测试 Akismet 反垃圾配置是否生效?

请填写 viagra-test-123 作为昵称,或填写 akismet-guaranteed-spam@example.com 作为邮箱,发表评论,这条评论将一定会被视为垃圾评论。

需要注意的是,由于 Akismet 服务响应速度较慢(大约 6 秒),影响用户体验,Twikoo 采取 “先放行,后检测” 的策略,垃圾评论会在发表后短暂可见。

登录管理面板遇到错误 AUTH_INVALID_CUSTOM_LOGIN_TICKET

一般是配置好登录私钥之后,又重新下载了登录私钥,导致之前配置的登录私钥失效了。
解决方法:到云开发控制台,数据库,删掉 config,然后重新配置私钥。

收不到提醒邮件?

如果是 Vercel 部署的云函数,请配置国外邮件服务商,避免被邮件服务商判定为垃圾邮件行为。如果是其他原因,请前往 Twikoo 管理面板,找到邮件测试功能,输入个人邮箱,根据测试结果排查原因。

为了避免频繁检查邮箱带来的性能问题,邮件配置有 10 分钟左右的缓存,如果确定配置没有问题,但测试失败,可以等待 10 分钟后再测试。

由于博主发表评论时,不会通知博主,如果您想实际测试通知功能,请注销管理面板后用非博主邮箱发表或回复评论。

Vercel、私有部署无法上传图片?

腾讯云环境自带云存储,所以腾讯云环境下可以直接上传图片,图片保存在云存储中。然而 Vercel 环境没有,上传图片功能依赖第三方图床,请在管理面板中配置图床,Twikoo 支持以下图床:

图床地址特点
qcloud腾讯云环境自带,可在云开发 - 云存储中查看
7buhttps://7bu.top去不图床,由杜老师提供支持,无免费套餐
smmshttps://sm.msSMMS 图床,有免费套餐,请自行注册账号,IMAGE_CDN_TOKEN 可在 Dashboard 中获取
lsky-pro私有部署兰空图床 2.0 版本,IMAGE_CDN 请配置图床首页 URL 地址(如 https://7bu.top),IMAGE_CDN_TOKEN 获取方式请参考教程 杜老师说图床:新版本去不图床 Token 的获取与清空,获取到的 token 格式应为 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5

私有部署能连接自己的数据库吗?

Twikoo 私有部署版默认使用内置数据库:LokiJS 数据库,支持的数据库容量大约为 1 GB,不需要连接外部数据库,数据存储在启动 twikoo 时所在目录下的 data 目录,您可以直接复制该目录以完成数据备份。

如果您有 MongoDB 实例,可以连接 MongoDB 作为外部数据库,只需配置环境变量 MONGODB_URI 为数据库连接地址即可,如:mongodb://<username>:<password>@<host>/

部署后遇到评论失败: 0,管理面板进不去?

在包含评论框的页面,打开浏览器开发者工具(Windows 下快捷键为 F12),点击 Console 标签,查找包含 twikoo 关键字的报错。

如果看到 ERR_BLOCKED_BY_CLIENT,请禁用浏览器去广告插件或将当前网站加入白名单,然后刷新重试。

如果看到 ERR_CONNECTION_CLOSED,请检查自己所处的地区网络环境是否正常,能够连通云函数,部分地区无法访问 Vercel 等服务,请更换部署方式再试。

如果看到 Access to XMLHttpRequest at 'https://tcb-api.tencentcloudapi.com/web?env=...' from origin '...' has been blocked by CORS policy...:请检查前端 js 文件版本是否最新,并确保 envId 以 https:// 开头。

如果看到 Access to XMLHttpRequest at ... No 'Access-Control-Allow-Origin' header is present on the requested resource.:请先访问一下 envId 查看云函数是否运行正常,如果没有运行正常的提示,请重新部署云函数,确保不要漏下任何步骤;如果提示运行正常,请本地启动网站(localhost)并访问管理面板-配置管理-通用,清空 CORS_ALLOW_ORIGIN 字段并保存,然后刷新重试。

如果看到其他错误,请 提交 issue 并附上错误信息。

`,51),l=[h];function k(r,p,o,d,E,c){return t(),a("div",null,l)}const u=i(n,[["render",k]]);export{F as __pageData,u as default}; diff --git a/assets/faq.md.B4Pnc9sL.lean.js b/assets/faq.md.B4Pnc9sL.lean.js new file mode 100644 index 000000000..c151c2e49 --- /dev/null +++ b/assets/faq.md.B4Pnc9sL.lean.js @@ -0,0 +1 @@ +import{_ as s}from"./chunks/katex.B5umXGHV.js";import{_ as i,c as a,o as t,a5 as e}from"./chunks/framework.aNBt3w9_.js";const F=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":null}'),n={name:"faq.md"},h=e("",51),l=[h];function k(r,p,o,d,E,c){return t(),a("div",null,l)}const u=i(n,[["render",k]]);export{F as __pageData,u as default}; diff --git a/assets/frontend.md.BEcQ_kWD.js b/assets/frontend.md.BEcQ_kWD.js new file mode 100644 index 000000000..724959d79 --- /dev/null +++ b/assets/frontend.md.BEcQ_kWD.js @@ -0,0 +1,18 @@ +import{_ as e,c as a,o as t,a5 as i}from"./chunks/framework.aNBt3w9_.js";const m=JSON.parse('{"title":"前端部署","description":"","frontmatter":{},"headers":[],"relativePath":"frontend.md","filePath":"frontend.md","lastUpdated":null}'),s={name:"frontend.md"},h=i(`

前端部署

在 Hexo 中使用

Hexo Butterfly 主题使用

请参考 Butterfly 安裝文檔(四) 主題配置-2 进行配置

Hexo Keep 主题使用

请参考 hexo-theme-keep/_config.yml 进行配置

Hexo Volantis 主题使用

请参考 hexo-theme-volantis/_config.yml 进行配置

Hexo Ayer 主题使用

请参考 hexo-theme-ayer/_config.yml 进行配置

Hexo NexT 主题使用

暂不支持 NexT 8 以下的版本,请先升级到 NexT 8。然后在 Hexo 项目根目录执行

sh
# For NexT version >= 8.0.0 && < 8.4.0
+npm install hexo-next-twikoo@1.0.0
+# For NexT version >= 8.4.0
+npm install hexo-next-twikoo@1.0.3

然后在配置中添加

yml
twikoo:
+  enable: true
+  visitor: true
+  envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  # region: ap-guangzhou # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填

Hexo Matery 主题使用

请参考 hexo-theme-matery/_config.yml 进行配置

Hexo Icarus 主题使用

请参考 基于腾讯云,给你的 Icarus 博客配上 Twikoo 评论系统 by 异次元de机智君💯

Hexo MengD(萌典) 主题使用

请参考 hexo-theme-MengD/_config.yml 进行配置

hexo-theme-fluid 主题使用

请参考 配置指南-评论 进行配置

hexo-theme-cards 主题使用

请参考 hexo-theme-cards/_config.yml 进行配置

maupassant-hexo 主题使用

请参考 maupassant-hexo/_config.yml 进行配置

hexo-theme-redefine 主题使用

请参考 Redefine 官方文档 #comment 进行配置

Hexo-Theme-Solitude 主题使用

请参考 Solitude 文档 进行配置

在 Hugo 中使用

hugo-theme-stack 主题使用

请参考 Comments | Stackhugo-theme-stack/config.yaml#L83 进行配置

FixIt 主题使用

请参考 入门篇 - FixIt #主题配置hugo-fixit/FixIt/config.toml#L613-L624 进行配置

在 VitePress 中使用

请参考 VitePress 集成 twikoo 参考解决方案 进行配置。

通过 CDN 引入

提示

如果您使用的博客主题不支持 Twikoo,并且您不知道如何引入 Twikoo,您可以在 Github 提交适配请求

html
<div id="tcomment"></div>
+<script src="https://cdn.jsdelivr.net/npm/twikoo@1.6.38/dist/twikoo.all.min.js" integrity="sha384-4KfOjEinLSkv1i1J8TzlkC/RTnuiLoR1OLerVgjEKoH5djYtbf7mzEFsz9p3nfuA" crossorigin="anonymous"></script>
+<script>
+twikoo.init({
+  envId: '您的环境id', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  el: '#tcomment', // 容器元素
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
+  // path: location.pathname, // 用于区分不同文章的自定义 js 路径,如果您的文章路径不是 location.pathname,需传此参数
+  // lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/twikoojs/twikoo/blob/main/src/client/utils/i18n/index.js
+})
+</script>

建议使用 CDN 引入 Twikoo 的用户在链接地址上锁定版本,以免将来 Twikoo 升级时受到非兼容性更新的影响。

更换 CDN 镜像

如果遇到默认 CDN 加载速度缓慢,可更换其他 CDN 镜像。以下为可供选择的公共 CDN,其中一些 CDN 可能需要数天时间同步最新版本:

  • https://s4.zstatic.net/ajax/libs/twikoo/1.6.38/twikoo.all.min.js
  • https://lib.baomitu.com/twikoo/1.6.38/twikoo.all.min.js
  • https://cdn.jsdelivr.net/npm/twikoo@1.6.38/dist/twikoo.all.min.js

建议使用 CDN 引入 Twikoo 的用户参考上一段的示例在代码中加入 SRI 属性以确保完整性。

开启管理面板(腾讯云环境)

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

配置好登录私钥之后无需留存私钥文件,请勿再次下载登录私钥,否则会导致之前配置的登录私钥失效。

开启管理面板(非腾讯云环境)

点击评论窗口的“小齿轮”图标,设置管理员密码

`,51),r=[h];function n(o,l,p,k,c,d){return t(),a("div",null,r)}const u=e(s,[["render",n]]);export{m as __pageData,u as default}; diff --git a/assets/frontend.md.BEcQ_kWD.lean.js b/assets/frontend.md.BEcQ_kWD.lean.js new file mode 100644 index 000000000..659eb893b --- /dev/null +++ b/assets/frontend.md.BEcQ_kWD.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t,a5 as i}from"./chunks/framework.aNBt3w9_.js";const m=JSON.parse('{"title":"前端部署","description":"","frontmatter":{},"headers":[],"relativePath":"frontend.md","filePath":"frontend.md","lastUpdated":null}'),s={name:"frontend.md"},h=i("",51),r=[h];function n(o,l,p,k,c,d){return t(),a("div",null,r)}const u=e(s,[["render",n]]);export{m as __pageData,u as default}; diff --git a/assets/hugging-1.qykHscdz.png b/assets/hugging-1.qykHscdz.png new file mode 100644 index 000000000..f008477a3 Binary files /dev/null and b/assets/hugging-1.qykHscdz.png differ diff --git a/assets/hugging-2.BZLt3AFG.png b/assets/hugging-2.BZLt3AFG.png new file mode 100644 index 000000000..fe927ea2f Binary files /dev/null and b/assets/hugging-2.BZLt3AFG.png differ diff --git a/assets/hugging-3.BE7bV_x9.png b/assets/hugging-3.BE7bV_x9.png new file mode 100644 index 000000000..1372a36ac Binary files /dev/null and b/assets/hugging-3.BE7bV_x9.png differ diff --git a/assets/hugging-4.IZDT8YRp.png b/assets/hugging-4.IZDT8YRp.png new file mode 100644 index 000000000..7dea50b7c Binary files /dev/null and b/assets/hugging-4.IZDT8YRp.png differ diff --git a/assets/hugging-5.Cw4bsoD7.png b/assets/hugging-5.Cw4bsoD7.png new file mode 100644 index 000000000..f078f1dbf Binary files /dev/null and b/assets/hugging-5.Cw4bsoD7.png differ diff --git a/assets/hugging-6.CxsVPwFh.png b/assets/hugging-6.CxsVPwFh.png new file mode 100644 index 000000000..2f6fac05b Binary files /dev/null and b/assets/hugging-6.CxsVPwFh.png differ diff --git a/assets/hugging-7.ey7RVDUh.png b/assets/hugging-7.ey7RVDUh.png new file mode 100644 index 000000000..038200128 Binary files /dev/null and b/assets/hugging-7.ey7RVDUh.png differ diff --git a/assets/hugging-8.bn1zLPri.png b/assets/hugging-8.bn1zLPri.png new file mode 100644 index 000000000..4007d2bec Binary files /dev/null and b/assets/hugging-8.bn1zLPri.png differ diff --git a/assets/hugging-9.BfxLMyMQ.png b/assets/hugging-9.BfxLMyMQ.png new file mode 100644 index 000000000..50d410009 Binary files /dev/null and b/assets/hugging-9.BfxLMyMQ.png differ diff --git a/assets/index.md.Ck2pUnPA.js b/assets/index.md.Ck2pUnPA.js new file mode 100644 index 000000000..613b473be --- /dev/null +++ b/assets/index.md.Ck2pUnPA.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.aNBt3w9_.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","hero":{"name":"Twikoo","text":"网站评论系统","tagline":"简洁、安全、免费","actions":[{"theme":"brand","text":"快速上手","link":"/quick-start"},{"theme":"alt","text":"简介","link":"/intro"},{"theme":"alt","text":"QQ 群","link":"https://jq.qq.com/?_wv=1027&k=2l9ZGIoL"},{"theme":"alt","text":"GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),o={name:"index.md"};function a(l,n,s,c,r,d){return i(),e("div")}const k=t(o,[["render",a]]);export{p as __pageData,k as default}; diff --git a/assets/index.md.Ck2pUnPA.lean.js b/assets/index.md.Ck2pUnPA.lean.js new file mode 100644 index 000000000..613b473be --- /dev/null +++ b/assets/index.md.Ck2pUnPA.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.aNBt3w9_.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","hero":{"name":"Twikoo","text":"网站评论系统","tagline":"简洁、安全、免费","actions":[{"theme":"brand","text":"快速上手","link":"/quick-start"},{"theme":"alt","text":"简介","link":"/intro"},{"theme":"alt","text":"QQ 群","link":"https://jq.qq.com/?_wv=1027&k=2l9ZGIoL"},{"theme":"alt","text":"GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),o={name:"index.md"};function a(l,n,s,c,r,d){return i(),e("div")}const k=t(o,[["render",a]]);export{p as __pageData,k as default}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 000000000..b6b603d59 Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 000000000..def40a4f6 Binary files /dev/null and b/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ diff --git a/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 new file mode 100644 index 000000000..e070c3d30 Binary files /dev/null and b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 000000000..a3c16ca40 Binary files /dev/null and b/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 000000000..2210a899e Binary files /dev/null and b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ diff --git a/assets/inter-italic-latin.C2AdPX0b.woff2 b/assets/inter-italic-latin.C2AdPX0b.woff2 new file mode 100644 index 000000000..790d62dc7 Binary files /dev/null and b/assets/inter-italic-latin.C2AdPX0b.woff2 differ diff --git a/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/assets/inter-italic-vietnamese.BSbpV94h.woff2 new file mode 100644 index 000000000..1eec0775a Binary files /dev/null and b/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 new file mode 100644 index 000000000..2cfe61536 Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ diff --git a/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 new file mode 100644 index 000000000..e3886dd14 Binary files /dev/null and b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 000000000..36d67487d Binary files /dev/null and b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 000000000..2bed1e85e Binary files /dev/null and b/assets/inter-roman-greek.BBVDIX6e.woff2 differ diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 000000000..9a8d1e2b5 Binary files /dev/null and b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 000000000..07d3c53ae Binary files /dev/null and b/assets/inter-roman-latin.Di8DUHzh.woff2 differ diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 000000000..57bdc22ae Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/assets/intro.md.DXsPIJUB.js b/assets/intro.md.DXsPIJUB.js new file mode 100644 index 000000000..3ce801eab --- /dev/null +++ b/assets/intro.md.DXsPIJUB.js @@ -0,0 +1,3 @@ +import{_ as a,a as t,b as e,c as i}from"./chunks/readme-3.hEA_5CR-.js";import{_ as r,c as l,o as s,a5 as o}from"./chunks/framework.aNBt3w9_.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"intro.md","filePath":"intro.md","lastUpdated":null}'),h={name:"intro.md"},n=o('Twikoo
       

一个简洁、安全、免费的静态网站评论系统。
A simple, safe, free comment system.

简体中文 | English

特色

简单

  • 免费搭建(使用云开发 / Vercel / 私有服务器作为评论后台)
  • 简单部署(支持云开发 / Vercel 一键部署)

易用

  • 支持回复、点赞
  • 无需额外适配,支持搭配浅色主题与深色主题使用
  • 支持 API 调用,批量获取文章评论数、最新评论
  • 访客在昵称栏输入 QQ 号,会自动补全 QQ 昵称和 QQ 邮箱
  • 访客填写数字 QQ 邮箱,会使用 QQ 头像作为评论头像
  • 支持评论框粘贴图片(可禁用)
  • 支持插入图片(可禁用)
  • 支持去不图床、云开发图床
  • 支持插入表情(可禁用)
  • 支持 Ctrl + Enter 快捷回复
  • 评论框内容实时保存草稿,刷新不会丢失
  • 支持 Katex 公式
  • 支持按语言的代码高亮

安全

  • 隐私信息安全(通过云函数控制敏感字段(邮箱、IP、环境配置等)不会泄露)
  • 支持 Akismet 垃圾评论检测(需自行注册 akismet.com
  • 支持腾讯云内容安全垃圾评论检测(需自行注册 腾讯云内容安全
  • 支持人工审核模式
  • 防 XSS 注入
  • 支持限制每个 IP 每 10 分钟最多发表多少条评论

即时

  • 支持邮件提醒(访客和博主)
  • 支持微信提醒(仅针对博主,基于 Server酱,需自行注册)
  • 支持 QQ 提醒(仅针对博主,基于 Qmsg酱,需自行注册)
  • 支持 QQ 提醒(针对博主QQ或者群,基于 go-cqhttp,需自己有服务器)

个性

  • 支持自定义评论框背景图片
  • 支持自定义“博主”标识文字
  • 支持自定义通知邮件模板
  • 支持自定义评论框提示信息(placeholder)
  • 支持自定义表情列表(兼容 OwO 的数据格式
  • 支持自定义【昵称】【邮箱】【网址】必填 / 选填
  • 支持自定义代码高亮主题

便捷管理

  • 内嵌式管理面板,通过密码登录,可方便地查看评论、隐藏评论、删除评论、修改配置
  • 支持隐藏管理入口,通过输入暗号显示
  • 支持从 Valine、Artalk、Disqus 导入评论

缺点

  • 不支持 IE

预览

评论

评论

评论管理

评论管理

推送通知

推送通知

交流群

如果你想获取更新动态、建言献策、参与测试,欢迎加入讨论群:
1080829142

浏览器支持

提示

技术原因,不兼容 IE

IE / Edge
IE / Edge
Firefox
Firefox
Chrome
Chrome
Safari
Safari
iOS Safari
iOS Safari
Edgelast versionlast versionlast versionlast version

Generated by browsers-support-badges

更新日志 & 开发计划

更新日志 & 开发计划

特别感谢

图标设计:Maemo Lee

开发

如果您想在本地二次开发,可以参考以下命令:

sh
yarn dev # 开发 (http://localhost:9820/demo.html)
+yarn lint # 代码检查
+yarn build # 编译 (dist/twikoo.all.min.js)

如果您的改动能够帮助到更多人,欢迎提交 Pull Request!

国际化

支持简体中文、繁体中文、English。欢迎提交翻译 PR

许可

FOSSA Status

`,49),p=[n];function c(d,m,g,b,k,u){return s(),l("div",null,p)}const q=r(h,[["render",c]]);export{_ as __pageData,q as default}; diff --git a/assets/intro.md.DXsPIJUB.lean.js b/assets/intro.md.DXsPIJUB.lean.js new file mode 100644 index 000000000..87d9ac32a --- /dev/null +++ b/assets/intro.md.DXsPIJUB.lean.js @@ -0,0 +1 @@ +import{_ as a,a as t,b as e,c as i}from"./chunks/readme-3.hEA_5CR-.js";import{_ as r,c as l,o as s,a5 as o}from"./chunks/framework.aNBt3w9_.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"intro.md","filePath":"intro.md","lastUpdated":null}'),h={name:"intro.md"},n=o("",49),p=[n];function c(d,m,g,b,k,u){return s(),l("div",null,p)}const q=r(h,[["render",c]]);export{_ as __pageData,q as default}; diff --git a/assets/katex.D3zUHQ6F.png b/assets/katex.D3zUHQ6F.png new file mode 100644 index 000000000..40bbfe75f Binary files /dev/null and b/assets/katex.D3zUHQ6F.png differ diff --git a/assets/link.md.DZkTjCld.js b/assets/link.md.DZkTjCld.js new file mode 100644 index 000000000..95dd27ef9 --- /dev/null +++ b/assets/link.md.DZkTjCld.js @@ -0,0 +1 @@ +import{_ as e,c as t,o,a5 as r}from"./chunks/framework.aNBt3w9_.js";const f=JSON.parse('{"title":"相关文档","description":"","frontmatter":{},"headers":[],"relativePath":"link.md","filePath":"link.md","lastUpdated":null}'),a={name:"link.md"},l=r('

相关文档

',2),i=[l];function n(s,h,c,b,_,w){return o(),t("div",null,i)}const p=e(a,[["render",n]]);export{f as __pageData,p as default}; diff --git a/assets/link.md.DZkTjCld.lean.js b/assets/link.md.DZkTjCld.lean.js new file mode 100644 index 000000000..b706398ab --- /dev/null +++ b/assets/link.md.DZkTjCld.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o,a5 as r}from"./chunks/framework.aNBt3w9_.js";const f=JSON.parse('{"title":"相关文档","description":"","frontmatter":{},"headers":[],"relativePath":"link.md","filePath":"link.md","lastUpdated":null}'),a={name:"link.md"},l=r("",2),i=[l];function n(s,h,c,b,_,w){return o(),t("div",null,i)}const p=e(a,[["render",n]]);export{f as __pageData,p as default}; diff --git a/assets/logo.KgWMX3A2.png b/assets/logo.KgWMX3A2.png new file mode 100644 index 000000000..2efeb5eca Binary files /dev/null and b/assets/logo.KgWMX3A2.png differ diff --git a/assets/mongodb-1.kzmwAvw2.png b/assets/mongodb-1.kzmwAvw2.png new file mode 100644 index 000000000..03120cd12 Binary files /dev/null and b/assets/mongodb-1.kzmwAvw2.png differ diff --git a/assets/mongodb-2.wGC2d7_O.png b/assets/mongodb-2.wGC2d7_O.png new file mode 100644 index 000000000..f746a45d6 Binary files /dev/null and b/assets/mongodb-2.wGC2d7_O.png differ diff --git a/assets/mongodb-3.BlCbBw8p.png b/assets/mongodb-3.BlCbBw8p.png new file mode 100644 index 000000000..3e3c38b12 Binary files /dev/null and b/assets/mongodb-3.BlCbBw8p.png differ diff --git a/assets/mongodb-atlas.md.CLmTi-jV.js b/assets/mongodb-atlas.md.CLmTi-jV.js new file mode 100644 index 000000000..9f4b724ae --- /dev/null +++ b/assets/mongodb-atlas.md.CLmTi-jV.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as e,a5 as a}from"./chunks/framework.aNBt3w9_.js";const s="/assets/mongodb-1.kzmwAvw2.png",l="/assets/mongodb-2.wGC2d7_O.png",n="/assets/mongodb-3.BlCbBw8p.png",D=JSON.parse('{"title":"MongoDB Atlas","description":"","frontmatter":{},"headers":[],"relativePath":"mongodb-atlas.md","filePath":"mongodb-atlas.md","lastUpdated":null}'),r={name:"mongodb-atlas.md"},d=a('

MongoDB Atlas

MongoDB Atlas 是 MongoDB Inc 提供的 MongoDB 数据库托管服务。免费账户可以永久使用 500 MiB 的数据库,足够存储 Twikoo 评论使用。

  1. 申请 MongoDB AtLas 账号
  2. 创建免费 MongoDB 数据库,区域推荐选择离 Twikoo 后端(Vercel / Netlify / AWS Lambda / VPS)地理位置较近的数据中心以获得更低的数据库连接延迟。如果不清楚自己的后端在哪个区域,也可选择 AWS / Oregon (us-west-2),该数据中心基建成熟,故障率低,且使用 Oregon 州的清洁能源,较为环保
  3. 在 Database Access 页面点击 Add New Database User 创建数据库用户,Authentication Method 选 Password,在 Password Authentication 下设置数据库用户名和密码,建议点击 Auto Generate 自动生成一个不含特殊符号的强壮密码并妥善保存。点击 Database User Privileges 下方的 Add Built In Role,Select Role 选择 Atlas Admin,最后点击 Add User

  1. 在 Network Access 页面点击 Add IP Address 添加网络白名单。因为 Vercel / Netlify / Lambda 的出口地址不固定,因此 Access List Entry 输入 0.0.0.0/0(允许所有 IP 地址的连接)即可。如果 Twikoo 部署在自己的服务器上,这里可以填入固定 IP 地址。点击 Confirm 保存

  1. 在 Database 页面点击 Connect,连接方式选择 Drivers,并记录数据库连接字符串,请将连接字符串中的 <username>:<password> 修改为刚刚创建的数据库 用户名:密码

  1. (可选)默认的连接字符串没有指定数据库名称,Twikoo 会连接到默认的名为 test 的数据库。如果需要在同一个 MongoDB 里运行其他业务或供多个 Twikoo 实例使用,建立加入数据库名称并配置对应的 ACL。

连接字符串包含了连接到 MongoDB 数据库的所有信息,一旦泄露会导致评论被任何人添加、修改、删除,并有可能获取你的 SMTP、图床 token 等信息。请妥善记录这一字符串,之后需要填入到 Twikoo 的部署平台里。

',10),i=[d];function c(_,g,m,p,A,b){return e(),t("div",null,i)}const h=o(r,[["render",c]]);export{D as __pageData,h as default}; diff --git a/assets/mongodb-atlas.md.CLmTi-jV.lean.js b/assets/mongodb-atlas.md.CLmTi-jV.lean.js new file mode 100644 index 000000000..2b5722085 --- /dev/null +++ b/assets/mongodb-atlas.md.CLmTi-jV.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,o as e,a5 as a}from"./chunks/framework.aNBt3w9_.js";const s="/assets/mongodb-1.kzmwAvw2.png",l="/assets/mongodb-2.wGC2d7_O.png",n="/assets/mongodb-3.BlCbBw8p.png",D=JSON.parse('{"title":"MongoDB Atlas","description":"","frontmatter":{},"headers":[],"relativePath":"mongodb-atlas.md","filePath":"mongodb-atlas.md","lastUpdated":null}'),r={name:"mongodb-atlas.md"},d=a("",10),i=[d];function c(_,g,m,p,A,b){return e(),t("div",null,i)}const h=o(r,[["render",c]]);export{D as __pageData,h as default}; diff --git a/assets/netlify-1.CBH5jdAK.png b/assets/netlify-1.CBH5jdAK.png new file mode 100644 index 000000000..6b5adf242 Binary files /dev/null and b/assets/netlify-1.CBH5jdAK.png differ diff --git a/assets/netlify-2.CoU6-6Qj.png b/assets/netlify-2.CoU6-6Qj.png new file mode 100644 index 000000000..e30ce5824 Binary files /dev/null and b/assets/netlify-2.CoU6-6Qj.png differ diff --git a/assets/netlify-3.BRAuDkNv.png b/assets/netlify-3.BRAuDkNv.png new file mode 100644 index 000000000..d086765d0 Binary files /dev/null and b/assets/netlify-3.BRAuDkNv.png differ diff --git a/assets/netlify-4.BPwUhUpI.png b/assets/netlify-4.BPwUhUpI.png new file mode 100644 index 000000000..118292159 Binary files /dev/null and b/assets/netlify-4.BPwUhUpI.png differ diff --git a/assets/netlify-5.BSv5GDZV.png b/assets/netlify-5.BSv5GDZV.png new file mode 100644 index 000000000..dcdd0e733 Binary files /dev/null and b/assets/netlify-5.BSv5GDZV.png differ diff --git a/assets/quick-start.md.Bd8cDso5.js b/assets/quick-start.md.Bd8cDso5.js new file mode 100644 index 000000000..4026217fb --- /dev/null +++ b/assets/quick-start.md.Bd8cDso5.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as e,a5 as o}from"./chunks/framework.aNBt3w9_.js";const u=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"quick-start.md","filePath":"quick-start.md","lastUpdated":null}'),i={name:"quick-start.md"},r=o('

快速上手

Twikoo 分为云函数和前端两部分,若要在您的网站上集成 Twikoo,您需要同时部署云函数和前端,部署时请注意保持二者版本一致。

  • 云函数部署 有多种方式,请选择适合自己的部署平台。
  • 前端部署 有 2 种方式,如果您的网站主题支持 Twikoo,您只需在配置文件中指定 Twikoo 即可;如果您的网站主题不支持 Twikoo,您需要修改源码手动引入 Twikoo 的 js 文件并初始化。
  • 若您已部署旧版本 Twikoo,请参考 版本更新 升级云函数和前端版本。
',3),s=[r];function l(_,c,n,d,h,k){return e(),a("div",null,s)}const f=t(i,[["render",l]]);export{u as __pageData,f as default}; diff --git a/assets/quick-start.md.Bd8cDso5.lean.js b/assets/quick-start.md.Bd8cDso5.lean.js new file mode 100644 index 000000000..abe8e23d8 --- /dev/null +++ b/assets/quick-start.md.Bd8cDso5.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as e,a5 as o}from"./chunks/framework.aNBt3w9_.js";const u=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"quick-start.md","filePath":"quick-start.md","lastUpdated":null}'),i={name:"quick-start.md"},r=o("",3),s=[r];function l(_,c,n,d,h,k){return e(),a("div",null,s)}const f=t(i,[["render",l]]);export{u as __pageData,f as default}; diff --git a/assets/readme-1.CjiL5qF9.png b/assets/readme-1.CjiL5qF9.png new file mode 100644 index 000000000..1f6f3c280 Binary files /dev/null and b/assets/readme-1.CjiL5qF9.png differ diff --git a/assets/readme-2.DKgivwJl.png b/assets/readme-2.DKgivwJl.png new file mode 100644 index 000000000..4752e3480 Binary files /dev/null and b/assets/readme-2.DKgivwJl.png differ diff --git a/assets/readme-3.CRRWEqvl.jpg b/assets/readme-3.CRRWEqvl.jpg new file mode 100644 index 000000000..5d33c487e Binary files /dev/null and b/assets/readme-3.CRRWEqvl.jpg differ diff --git a/assets/style.zTRJE4ub.css b/assets/style.zTRJE4ub.css new file mode 100644 index 000000000..3036a418e --- /dev/null +++ b/assets/style.zTRJE4ub.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-6ff51ddd]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-6ff51ddd]{padding:96px 32px 168px}}.code[data-v-6ff51ddd]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-6ff51ddd]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-6ff51ddd]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-6ff51ddd]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-6ff51ddd]{padding-top:20px}.link[data-v-6ff51ddd]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-6ff51ddd]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-53c99d69]{position:relative;z-index:1}.nested[data-v-53c99d69]{padding-right:16px;padding-left:16px}.outline-link[data-v-53c99d69]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-53c99d69]:hover,.outline-link.active[data-v-53c99d69]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-53c99d69]{padding-left:13px}.VPDocAsideOutline[data-v-f610f197]{display:none}.VPDocAsideOutline.has-outline[data-v-f610f197]{display:block}.content[data-v-f610f197]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-f610f197]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-f610f197]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-1bb0c8a8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-1bb0c8a8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-1bcd8184]{margin-top:64px}.edit-info[data-v-1bcd8184]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-1bcd8184]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-1bcd8184]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-1bcd8184]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-1bcd8184]{margin-right:8px}.prev-next[data-v-1bcd8184]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-1bcd8184]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-1bcd8184]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-1bcd8184]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-1bcd8184]{margin-left:auto;text-align:right}.desc[data-v-1bcd8184]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-1bcd8184]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-e6f2a212]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-e6f2a212]{display:flex;justify-content:center}.VPDoc .aside[data-v-e6f2a212]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{max-width:1104px}}.container[data-v-e6f2a212]{margin:0 auto;width:100%}.aside[data-v-e6f2a212]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-e6f2a212]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-e6f2a212]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-e6f2a212]::-webkit-scrollbar{display:none}.aside-curtain[data-v-e6f2a212]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-e6f2a212]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-e6f2a212]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-e6f2a212]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-e6f2a212]{order:1;margin:0;min-width:640px}}.content-container[data-v-e6f2a212]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-e6f2a212]{max-width:688px}.VPButton[data-v-c9cf0e3c]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-c9cf0e3c]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-c9cf0e3c]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-c9cf0e3c]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-c9cf0e3c]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-c9cf0e3c]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-c9cf0e3c]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-c9cf0e3c]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-c9cf0e3c]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-c9cf0e3c]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-b10c5094]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-b10c5094]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-b10c5094]{flex-direction:row}}.main[data-v-b10c5094]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-b10c5094]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-b10c5094]{text-align:left}}@media (min-width: 960px){.main[data-v-b10c5094]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-b10c5094]{max-width:592px}}.name[data-v-b10c5094],.text[data-v-b10c5094]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0 auto}.name[data-v-b10c5094]{color:var(--vp-home-hero-name-color)}.clip[data-v-b10c5094]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-b10c5094],.text[data-v-b10c5094]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-b10c5094],.text[data-v-b10c5094]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0}}.tagline[data-v-b10c5094]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-b10c5094]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-b10c5094]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-b10c5094]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-b10c5094]{margin:0}}.actions[data-v-b10c5094]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-b10c5094]{justify-content:center}@media (min-width: 640px){.actions[data-v-b10c5094]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-b10c5094]{justify-content:flex-start}}.action[data-v-b10c5094]{flex-shrink:0;padding:6px}.image[data-v-b10c5094]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-b10c5094]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-b10c5094]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-b10c5094]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-b10c5094]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-b10c5094]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-b10c5094]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-b10c5094]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-b10c5094]{width:320px;height:320px}}[data-v-b10c5094] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-b10c5094] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-b10c5094] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-bd37d1a2]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-bd37d1a2]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-bd37d1a2]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-bd37d1a2]>.VPImage{margin-bottom:20px}.icon[data-v-bd37d1a2]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-bd37d1a2]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-bd37d1a2]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-bd37d1a2]{padding-top:8px}.link-text-value[data-v-bd37d1a2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-bd37d1a2]{margin-left:6px}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.container[data-v-c141a4bd]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-c141a4bd]{padding:0 48px}}@media (min-width: 960px){.container[data-v-c141a4bd]{width:100%;padding:0 64px}}.vp-doc[data-v-c141a4bd] .VPHomeSponsors,.vp-doc[data-v-c141a4bd] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-c141a4bd] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-c141a4bd] .VPHomeSponsors a,.vp-doc[data-v-c141a4bd] .VPTeamPage a{text-decoration:none}.VPHome[data-v-07b1ad08]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-07b1ad08]{margin-bottom:128px}}.VPContent[data-v-9a6c75ad]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-9a6c75ad]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:0}@media (min-width: 960px){.VPContent[data-v-9a6c75ad]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-9a6c75ad]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-566314d4]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-566314d4]{display:none}.VPFooter[data-v-566314d4] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-566314d4] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-566314d4]{padding:32px}}.container[data-v-566314d4]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-566314d4],.copyright[data-v-566314d4]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-883964e0]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-883964e0]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-883964e0]{color:var(--vp-c-text-1)}.icon[data-v-883964e0]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-883964e0]{font-size:14px}.icon[data-v-883964e0]{font-size:16px}}.open>.icon[data-v-883964e0]{transform:rotate(90deg)}.items[data-v-883964e0]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-883964e0]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-883964e0]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-883964e0]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-883964e0]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-883964e0]{transition:all .2s ease-out}.flyout-leave-active[data-v-883964e0]{transition:all .15s ease-in}.flyout-enter-from[data-v-883964e0],.flyout-leave-to[data-v-883964e0]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-2488c25a]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-2488c25a]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-2488c25a]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-2488c25a]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-2488c25a]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-2488c25a]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-2488c25a]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-2488c25a]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-2488c25a]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-2488c25a]{display:none}}.menu-icon[data-v-2488c25a]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-2488c25a]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-2488c25a]{padding:12px 32px 11px}}.VPSwitch[data-v-b4ccac88]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-b4ccac88]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-b4ccac88]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-b4ccac88]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-b4ccac88] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-b4ccac88] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-be9742d9]{opacity:1}.moon[data-v-be9742d9],.dark .sun[data-v-be9742d9]{opacity:0}.dark .moon[data-v-be9742d9]{opacity:1}.dark .VPSwitchAppearance[data-v-be9742d9] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-3f90c1a5]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-3f90c1a5]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f51f088d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f51f088d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f51f088d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f51f088d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-20ed86d6]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-20ed86d6] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-20ed86d6] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-20ed86d6] .group:last-child{padding-bottom:0}.VPMenu[data-v-20ed86d6] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-20ed86d6] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-20ed86d6] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-20ed86d6] .action{padding-left:24px}.VPFlyout[data-v-af5898d3]{position:relative}.VPFlyout[data-v-af5898d3]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-af5898d3]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-af5898d3]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-af5898d3]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-af5898d3]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-af5898d3],.button[aria-expanded=true]+.menu[data-v-af5898d3]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-af5898d3]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-af5898d3]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-af5898d3]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-af5898d3]{margin-right:0;font-size:16px}.text-icon[data-v-af5898d3]{margin-left:4px;font-size:14px}.icon[data-v-af5898d3]{font-size:20px;transition:fill .25s}.menu[data-v-af5898d3]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-358b6670]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-358b6670]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-358b6670]>svg,.VPSocialLink[data-v-358b6670]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-f953d92f]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-f953d92f]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-f953d92f]{display:none}}.trans-title[data-v-f953d92f]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-f953d92f],.item.social-links[data-v-f953d92f]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-f953d92f]{min-width:176px}.appearance-action[data-v-f953d92f]{margin-right:-2px}.social-links-list[data-v-f953d92f]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-08fbf4b6]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-08fbf4b6],.VPNavBarMenuLink[data-v-08fbf4b6]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-afb2845e]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-afb2845e]{display:flex}}/*! @docsearch/css 3.6.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-0ad69264]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-0ad69264]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-0ad69264]{border-bottom-color:var(--vp-c-divider)}}[data-v-0ad69264] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-acee064b]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-acee064b]{display:flex;align-items:center}}.title[data-v-acee064b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-9fd4d1dd]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-9fd4d1dd]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:transparent}.VPNavBar[data-v-9fd4d1dd]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-9fd4d1dd]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-9fd4d1dd]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-9fd4d1dd]{padding:0}}.container[data-v-9fd4d1dd]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-9fd4d1dd],.container>.content[data-v-9fd4d1dd]{pointer-events:none}.container[data-v-9fd4d1dd] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-9fd4d1dd]{max-width:100%}}.title[data-v-9fd4d1dd]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-9fd4d1dd]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-9fd4d1dd]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-9fd4d1dd]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-9fd4d1dd]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-9fd4d1dd]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-9fd4d1dd]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-9fd4d1dd]{column-gap:.5rem}}.menu+.translations[data-v-9fd4d1dd]:before,.menu+.appearance[data-v-9fd4d1dd]:before,.menu+.social-links[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before,.appearance+.social-links[data-v-9fd4d1dd]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before{margin-right:16px}.appearance+.social-links[data-v-9fd4d1dd]:before{margin-left:16px}.social-links[data-v-9fd4d1dd]{margin-right:-8px}.divider[data-v-9fd4d1dd]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-9fd4d1dd]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-a3e2920d]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-a3e2920d]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-1a934d60]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-1a934d60]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aea78dd1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-aea78dd1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-341db479]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-341db479]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-341db479]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-341db479]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-341db479]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-341db479]{transform:rotate(45deg)}.button[data-v-341db479]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-341db479]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-341db479]{transition:transform .25s}.group[data-v-341db479]:first-child{padding-top:0}.group+.group[data-v-341db479],.group+.item[data-v-341db479]{padding-top:4px}.VPNavScreenTranslations[data-v-516e4bc3]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-516e4bc3]{height:auto}.title[data-v-516e4bc3]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-516e4bc3]{font-size:16px}.icon.lang[data-v-516e4bc3]{margin-right:8px}.icon.chevron[data-v-516e4bc3]{margin-left:4px}.list[data-v-516e4bc3]{padding:4px 0 0 24px}.link[data-v-516e4bc3]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-2dd6d0c7]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active[data-v-2dd6d0c7]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active .container[data-v-2dd6d0c7]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to[data-v-2dd6d0c7]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to .container[data-v-2dd6d0c7]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-2dd6d0c7]{display:none}}.container[data-v-2dd6d0c7]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-2dd6d0c7],.menu+.appearance[data-v-2dd6d0c7],.translations+.appearance[data-v-2dd6d0c7]{margin-top:24px}.menu+.social-links[data-v-2dd6d0c7]{margin-top:16px}.appearance+.social-links[data-v-2dd6d0c7]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-edd2eed8]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-edd2eed8]{padding-bottom:10px}.item[data-v-edd2eed8]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-edd2eed8]{cursor:pointer}.indicator[data-v-edd2eed8]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-edd2eed8]{background-color:var(--vp-c-brand-1)}.link[data-v-edd2eed8]{display:flex;align-items:center;flex-grow:1}.text[data-v-edd2eed8]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-edd2eed8]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-edd2eed8],.VPSidebarItem.level-2 .text[data-v-edd2eed8],.VPSidebarItem.level-3 .text[data-v-edd2eed8],.VPSidebarItem.level-4 .text[data-v-edd2eed8],.VPSidebarItem.level-5 .text[data-v-edd2eed8]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-edd2eed8]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.caret[data-v-edd2eed8]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-edd2eed8]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-edd2eed8]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-edd2eed8]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-edd2eed8]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-edd2eed8],.VPSidebarItem.level-2 .items[data-v-edd2eed8],.VPSidebarItem.level-3 .items[data-v-edd2eed8],.VPSidebarItem.level-4 .items[data-v-edd2eed8],.VPSidebarItem.level-5 .items[data-v-edd2eed8]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-edd2eed8]{display:none}.no-transition[data-v-51288d80] .caret-icon{transition:none}.group+.group[data-v-51288d80]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-51288d80]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-42c4c606]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-42c4c606]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-42c4c606]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-42c4c606]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-42c4c606]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-42c4c606]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-42c4c606]{outline:0}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-d8b57b2d]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-3dc26e1d]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-3dc26e1d]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{margin:128px 0}}.VPHomeSponsors[data-v-3dc26e1d]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 64px}}.container[data-v-3dc26e1d]{margin:0 auto;max-width:1152px}.love[data-v-3dc26e1d]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-3dc26e1d]{display:inline-block}.message[data-v-3dc26e1d]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-3dc26e1d]{padding-top:32px}.action[data-v-3dc26e1d]{padding-top:40px;text-align:center}.VPTeamPage[data-v-a5329171]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-a5329171]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-a5329171-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-a5329171-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-a5329171-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:96px}}.VPTeamMembers[data-v-a5329171-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-a5329171-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-a5329171-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-acff304e]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-acff304e]{padding:32px}.VPTeamMembersItem.small .data[data-v-acff304e]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-acff304e]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-acff304e]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-acff304e]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-acff304e]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-acff304e]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-acff304e]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-acff304e]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-acff304e]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-acff304e]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-acff304e]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-acff304e]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-acff304e]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-acff304e]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-acff304e]{text-align:center}.avatar[data-v-acff304e]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-acff304e]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-acff304e]{margin:0;font-weight:600}.affiliation[data-v-acff304e]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-acff304e]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-acff304e]:hover{color:var(--vp-c-brand-1)}.desc[data-v-acff304e]{margin:0 auto}.desc[data-v-acff304e] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-acff304e]{display:flex;justify-content:center;height:56px}.sp-link[data-v-acff304e]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-acff304e]:hover,.sp .sp-link.link[data-v-acff304e]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-acff304e]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.home-comment-container{position:relative;margin-top:64px;padding:0 24px}@media (min-width: 640px){.home-comment-container{padding:0 48px}}@media (min-width: 960px){.home-comment-container{padding:0 64px}}.home-comment-container .comment-container{margin:0 auto;max-width:1152px}.twikoo .el-loading-spinner .circular{margin-left:auto;margin-right:auto}.shields{display:inline-block} diff --git a/assets/update.md.47Vc-wKh.js b/assets/update.md.47Vc-wKh.js new file mode 100644 index 000000000..876702468 --- /dev/null +++ b/assets/update.md.47Vc-wKh.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,a5 as t}from"./chunks/framework.aNBt3w9_.js";const g=JSON.parse('{"title":"版本更新","description":"","frontmatter":{},"headers":[],"relativePath":"update.md","filePath":"update.md","lastUpdated":null}'),i={name:"update.md"},l=t('

版本更新

不同部署方式的更新方式也不同,请对号入座。更新部署成功后,请不要忘记同时更新前端的 Twikoo CDN 地址中的 x.x.x 数字版本号,使之与云函数版本号相同,然后部署网站。

针对腾讯云一键部署的更新方式

登录环境-我的应用,输入

  • 来源地址:https://github.com/twikoojs/twikoo/tree/main
  • 部署分支:main

应用目录无需填写,点击“确定”,部署完成。

针对腾讯云手动部署的更新方式

登录环境-云函数,点击 twikoo,点击函数代码,打开 package.json 文件,将 "twikoo-func": "x.x.x" 其中的版本号修改为最新版本号,点击“保存并安装依赖”即可。

提示

如果您的云函数是 1.0.0 之前的版本,因为 1.0.0 版本修改了部署步骤,请先参考手动部署,从第 5 步开始,重新创建云函数,再按照此步骤更新。

如果升级后出现无法读取评论列表,云函数报错,请在函数编辑页面,删除 node_modules 目录(删除需要半分钟左右,请耐心等待删除完成),再点击保存并安装依赖。如果仍然不能解决,请删除并重新创建 Twikoo 云函数。

针对腾讯云命令行部署的更新方式

进入 Twikoo 源码目录,执行以下命令更新现有的云函数

sh
yarn deploy -e 您的环境id

针对 Vercel 部署的更新方式

  1. 进入 Vercel 仪表板 - twikoo - Settings - Git
  2. 点击 Connected Git Repository 下方的仓库地址
  3. 打开 package.json,点击编辑
  4. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  5. 部署会自动触发,可以回到 Vercel 仪表板,查看部署状态

针对 Railway 和 Zeabur 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-zeabur 的仓库
  2. 打开 package.json,点击编辑
  3. "tkserver": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对 Netlify 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-netlify 的仓库
  2. 打开 package.json,点击编辑
  3. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对 Hugging Face 部署的更新方式

  1. 登录 Hugging Face,找到部署的 Space,点击上方 Settings,往下滚动找到并点击 Factory rebuild

针对私有部署的更新方式

  1. 停止旧版本 kill $(ps -ef | grep tkserver | grep -v 'grep' | awk '{print $2}')
  2. 拉取新版本 npm i -g tkserver@latest
  3. 启动新版本 nohup tkserver >> tkserver.log 2>&1 &

针对私有部署 (Docker) 的更新方式

  1. 拉取新版本 docker pull imaegoo/twikoo
  2. 停止旧版本容器 docker stop twikoo
  3. 删除旧版本容器 docker rm twikoo
  4. 启动新版本容器

自动更新

考虑到可用性和安全性问题,Twikoo 没有实现自动更新,也没有计划实现自动更新。如果您希望实现自动更新,可以参考 MHuiG 基于 Github 工作流的 twikoo-update 的实现方式。

',26),r=[l];function c(s,d,n,h,u,p){return o(),a("div",null,r)}const b=e(i,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/update.md.47Vc-wKh.lean.js b/assets/update.md.47Vc-wKh.lean.js new file mode 100644 index 000000000..69639e12b --- /dev/null +++ b/assets/update.md.47Vc-wKh.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o,a5 as t}from"./chunks/framework.aNBt3w9_.js";const g=JSON.parse('{"title":"版本更新","description":"","frontmatter":{},"headers":[],"relativePath":"update.md","filePath":"update.md","lastUpdated":null}'),i={name:"update.md"},l=t("",26),r=[l];function c(s,d,n,h,u,p){return o(),a("div",null,r)}const b=e(i,[["render",c]]);export{g as __pageData,b as default}; diff --git a/assets/vercel-1.Czytea8u.png b/assets/vercel-1.Czytea8u.png new file mode 100644 index 000000000..7d952918f Binary files /dev/null and b/assets/vercel-1.Czytea8u.png differ diff --git a/backend.html b/backend.html new file mode 100644 index 000000000..41f2ec15d --- /dev/null +++ b/backend.html @@ -0,0 +1,42 @@ + + + + + + 云函数部署 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

云函数部署

部署方式
推荐度描述
腾讯云一键部署★☆☆☆☆虽然方便,但是仅支持按量计费环境——也就是说,一键部署的环境,当免费资源用尽后,将会产生费用。且按量计费环境无法切换为包年包月环境。免费额度数据库读操作数只有 500 次 / 天,无法支撑 Twikoo 的运行需求
腾讯云手动部署★★☆☆☆手动部署到腾讯云云开发环境,在中国大陆访问速度较快。需要付费购买环境才能部署。
腾讯云命令行部署★☆☆☆☆仅针对有 Node.js 经验的开发者。
Vercel 部署★★★☆☆适用于想要免费部署的用户,在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度。
Railway 部署★★☆☆☆有免费额度但不足以支持一个月连续运行,部署简单,适合全球访问。
Zeabur 部署★☆☆☆☆需要绑定支付宝或信用卡,部署简单,适合中国大陆访问,免费计划环境随时可能会被删除。
Netlify 部署★★★★☆有充足的免费额度,中国大陆访问速度不错。
Hugging Face 部署★★★★☆免费,中国大陆访问速度不错。允许通过 Cloudflare Tunnels 自定义域名。
AWS Lambda 部署★★★☆☆全球最大的云平台,适合已经使用 AWS 全家桶的用户。
Cloudflare workers 部署★★☆☆☆部署需使用命令行,冷启动时间较短,功能有部分限制。
私有部署★★☆☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。
私有部署 (Docker)★★★☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。

腾讯云一键部署

  1. 点击以下按钮将 Twikoo 一键部署到云开发
    部署到云开发
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”

腾讯云手动部署

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐,点击“立即购买”,按提示创建好环境。

提示

  • 推荐创建上海环境。如选择广州环境,需要在 twikoo.init() 时额外指定环境 region: "ap-guangzhou"
  • 环境名称自由填写
  • 推荐选择计费方式包年包月,套餐版本基础版 1,超出免费额度不会收费
  • 如果提示选择“应用模板”,请选择“空模板”
  1. 进入云开发控制台
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  4. 进入环境-云函数,点击“新建云函数”
  5. 函数名称请填写:twikoo,创建方式请选择:空白函数,运行环境请选择:Nodejs 16.13,函数内存请选择:128MB,点击“下一步”
  6. 清空输入框中的示例代码,复制以下代码、粘贴到“函数代码”输入框中,点击“确定”
js
exports.main = require('twikoo-func').main
  1. 创建完成后,点击“twikoo"进入云函数详情页,进入“函数代码”标签,点击“文件 - 新建文件”,输入 package.json,回车
  2. 复制以下代码、粘贴到代码框中,点击“保存并安装依赖”
json
{ "dependencies": { "twikoo-func": "1.6.38" } }

腾讯云命令行部署

注意

  • 请确保您已经安装了 Node.js
  • 请将命令、代码中“您的环境id”替换为您自己的环境id
  • 第 7 步会弹出浏览器要求授权,需在有图形界面的系统下进行
  • 请勿在 Termux 下操作。虽然可以部署成功,但是使用时会报错 [FUNCTIONS_EXECUTE_FAIL] Error: EACCES: permission denied, open '/var/user/index.js'

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐(一般 0 元套餐即可),点击“立即购买”,按提示创建好环境。
  2. 进入云开发控制台
  3. 进入环境-登录授权,启用“匿名登录”
  4. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  5. 克隆本仓库
sh
git clone https://github.com/twikoojs/twikoo.git # 或 git clone https://e.coding.net/imaegoo/twikoo/twikoo.git
+cd twikoo

如果您没有安装 Git,也可以从 Release 页面下载最新的 Source code
如果您所在的地区访问 Github 速度慢,也可以尝试另一个仓库地址:https://imaegoo.coding.net/public/twikoo/twikoo/git

  1. 安装依赖项
sh
npm install -g yarn # 已安装 yarn 可以跳过此步
+yarn install
  1. 授权云开发环境(此命令会弹出浏览器要求授权,需在有图形界面的系统下进行)
sh
yarn run login
  1. 自动部署
sh
yarn deploy -e 您的环境id

Vercel 部署

注意

Vercel 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

默认域名 *.vercel.app 在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度

查看视频教程

  1. 申请 MongoDB Atlas 账号,获取 MongoDB 连接字符串
  2. 申请 Vercel 账号
  3. 点击以下按钮将 Twikoo 一键部署到 Vercel

Deploy

  1. 进入 Settings - Environment Variables,添加环境变量 MONGODB_URI,值为前面记录的数据库连接字符串
  2. 进入 Settings - Deployment Protection,设置 Vercel Authentication 为 Disabled,并 Save

  1. 进入 Deployments , 然后在任意一项后面点击更多(三个点) , 然后点击 Redeploy , 最后点击下面的 Redeploy
  2. 进入 Overview,点击 Domains 下方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示
  3. Vercel Domains(包含 https:// 前缀,例如 https://xxx.vercel.app)即为您的环境 id

Railway 部署

注意

Railway 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Railway 申请并登录账号,点击 New Project - Provision MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Railway 点击 New - GitHub Repo - Configure GitHub App - 授权 GitHub - 选择刚才 fork 的仓库,等待部署完成
  4. 点开环境卡片 - Variables - New Variable,左边输入 PORT 右边输入 8080 然后点 Add
  5. 同样地,添加 MongoDB 相关环境变量 - New Variable - Add Reference - MONGO* - Add,重复步骤以添加 MONGOHOSTMONGOPASSWORDMONGOPORTMONGOUSERMONGO_URL 环境变量。
  6. 点开环境卡片 - Settings - Environment - Domains,绑定一个域名(例如 mytwikoo.up.railway.app
  7. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.up.railway.app

Zeabur 部署

注意

Zeabur 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Zeabur 申请并登录账号,点击部署新服务 - 部署其他服务 - 部署 MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Zeabur 点击部署新服务 - 部署你的源代码 - 授权 GitHub - 选择刚才 fork 的仓库,名称随意

无需配置数据库连接字符串! Zeabur 已自动配置

  1. 部署好后点开环境卡片 - 设置 - 域名,绑定一个域名(例如 mytwikoo.zeabur.app
  2. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.zeabur.app

Netlify 部署

注意

Netlify 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

Netlify 免费等级(Functions Level 0)支持每月 125,000 请求次数和 100 小时函数计算时长

  1. 申请 MongoDB Atlas 账号,获取 MongoDB 连接字符串
  2. 申请并登录 Netlify 账号,创建一个 Team
  3. 打开 twikoojs/twikoo-netlify 点击 fork 将仓库 fork 到自己的账号下
  4. 回到 Netlify,点击 Add new site - Import an existing project

  1. 点击 Deploy with GitHub,如果未授权 GitHub 账号,先授权,然后选择前面 fork 的 twikoo-netlify 项目

  1. 点击 Add environment variables - New variable,Key 输入 MONGODB_URI,Value 输入前面记录的数据库连接字符串,点击 Deploy twikoo-netlify

  1. 部署完成后,点击 Domain settings - 右侧 Options - Edit site name,可以设置属于自己的三级域名(https://xxx.netlify.app

  1. 进入 Site overview,点击上方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示

  1. 云函数地址(包含 https:// 前缀和 /.netlify/functions/twikoo 后缀,例如 https://xxx.netlify.app/.netlify/functions/twikoo)即为您的环境 id

Hugging Face 部署

  1. 申请 MongoDB Atlas 账号,获取 MongoDB 连接字符串
  2. 申请 Hugging Face 账号
  3. 登录,点击 Spaces - Create new Space

  1. 输入 Space name,Select the Space SDK 选择 Docker,Choose a Docker template 选择 Blank,Space hardware 选择 FREE,选择 Public,点击 Create Space

  1. 进入刚刚创建的 Space,点击页面上方的 Settings,滚动到 Variables and secrets 部分,点击 New secret,Name 输入 MONGODB_URI,Value 输入前面记录的数据库连接字符串,点击 Save

  1. 点击页面上方的 Files - Add file - Create a new file

  1. 在 Name your file 中输入 Dockerfile,在 Edit 区域输入以下内容
Dockerfile
FROM imaegoo/twikoo
+ENV TWIKOO_PORT 7860
+EXPOSE 7860

  1. 点击 Commit new file to main
  2. 点击右上角 Settings 右方的菜单(三个点)图标 - Embed this Space,Direct URL 下的内容(例如 https://xxx-xxx.hf.space)即为您的环境 id

如果你需要自定义域名

自定义域名教程由 Hoshino-Yumetsuki 提供

ps:除了 CF_ZERO_TRUST_TOKEN 这个环境变量以外,其他环境变量的配置方式与上一步相同

  1. 申请 Cloudflare Zero Trust,关于申请方式请自行查找

  1. 添加一条隧道,连接方式选择 Cloudflared,名称任意

  1. 添加一个 Public Hostname,回源选择 HTTP,端口选择 8080
  2. Clone Twikoo 仓库,找到 src\server\hf-space
  3. 去 Hugging Face 创建一个 Space,然后 Clone 下来,将 hf-space 文件夹内的所有内容复制进去
  4. 在 Hugging Face Space 的设置中添加一个环境变量,变量名 CF_ZERO_TRUST_TOKEN,值是 Tunnels 给的令牌(删掉 cloudflared.exe service install,只保留令牌部分)

  1. Push 到 Hugging Face Space 仓库

AWS Lambda 部署

  1. 注册 AWS 账号并配置 Terraform CLI。
  2. 如需使用托管的 MongoDB 数据库,可申请 MongoDB Atlas 账号。
  3. 参考 src/server/aws-lambda/terraform 目录中 Terraform 代码创建 AWS 资源。
  4. 部署完成后,Terraform 会将 lambda_function_url 打印在屏幕上,您也可以使用 terraform output 获取这一 URL,如:
$ terraform output
+lambda_function_url = "https://axtoiiithbcexamplegq7ozalu0cnkii.lambda-url.us-west-2.on.aws/"

该 URL 即为您的环境 ID,请记下这一 URL 用于前端配置。

Cloudflare workers 部署

请参考 github.com/twikoojs/twikoo-cloudflare

私有部署

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署对服务器系统没有要求,Windows、Ubuntu、CentOS、macOS 等常用系统均支持。

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

  1. 服务端下载安装 Node.js
  2. 安装 Twikoo server: npm i -g tkserver
  3. 根据需要配置环境变量,所有的环境变量都是可选的
名称描述默认值
MONGODB_URIMongoDB 数据库连接字符串,不传则使用 lokijsnull
MONGO_URLMongoDB 数据库连接字符串,不传则使用 lokijsnull
TWIKOO_DATAlokijs 数据库存储路径./data
TWIKOO_PORT端口号8080
TWIKOO_THROTTLEIP 请求限流,当同一 IP 短时间内请求次数超过阈值将对该 IP 返回错误250
TWIKOO_LOCALHOST_ONLYtrue时只监听本地请求,使得 nginx 等服务器反代之后不暴露原始端口null
TWIKOO_LOG_LEVEL日志级别,支持 verbose / info / warn / errorinfo
TWIKOO_IP_HEADERS在一些特殊情况下使用,如使用了CloudFlare CDN 它会将请求 IP 写到请求头的 cf-connecting-ip 字段上,为了能够正确的获取请求 IP 你可以写成 ['headers.cf-connecting-ip'][]
  1. 启动 Twikoo server: tkserver
  2. 访问 http://服务端IP:8080 测试服务是否启动成功
  3. 配置前置代理实现 HTTPS 访问(可以用 Nginx、负载均衡或 Cloudflare 等)
  4. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://twikoo.yourdomain.com

提示

  1. Linux 服务器可以用 nohup tkserver >> tkserver.log 2>&1 & 命令后台启动
  2. 数据默认在 data 目录,请注意定期备份数据
  3. 默认端口为8080,自定义端口使用可使用 TWIKOO_PORT=1234 tkserver 启动。
  4. 配置systemctl服务配合TWIKOO_PORT=1234 tkserver设置开机启动

私有部署 (Docker)

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

Docker

sh
docker run --name twikoo -e TWIKOO_THROTTLE=1000 -p 8080:8080 -v ${PWD}/data:/app/data -d imaegoo/twikoo

Docker Compose

yml
version: '3'
+services:
+  twikoo:
+    image: imaegoo/twikoo
+    container_name: twikoo
+    restart: unless-stopped
+    ports:
+      - 8080:8080
+    environment:
+      TWIKOO_THROTTLE: 1000
+    volumes:
+      - ./data:/app/data

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/cms.html b/cms.html new file mode 100644 index 000000000..f9afa6ec2 --- /dev/null +++ b/cms.html @@ -0,0 +1,26 @@ + + + + + + 反垃圾 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/configuration.html b/configuration.html new file mode 100644 index 000000000..2125565b6 --- /dev/null +++ b/configuration.html @@ -0,0 +1,26 @@ + + + + + + 配置 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

配置

注意

因图形化配置界面已上线,此文档已废弃且不再维护,其中的内容可能已经过时

  • 配置是可选的,即使没有配置也可以使用。
  • 请确保 config 表的权限不是“所有用户可读”,以保证 SMTP 密码等信息不会泄露。
    不过放心,默认权限是安全的,您不需要更改。
  • 请将配置项放在一条数据记录中。

通用

SITE_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站

博客、站点名称。

SITE_URL

类型: String
默认值: null
必要性: false
示例: https://www.imaegoo.com

博客、站点地址。

BLOGGER_EMAIL

类型: String
默认值: null
必要性: false
示例: 12345@qq.com

博主的邮箱地址,用于邮件通知、博主标识。

反垃圾

AKISMET_KEY

类型: String
默认值: null
必要性: false
示例: 8651783ed123

反垃圾评论 API key。

微信通知

SC_SENDKEY

类型: String
默认值: null
必要性: false
示例: SCT1364TKdsiGjGvyAZNYDVnuHW12345

Server酱微信推送的 SCKEY

邮件通知

SENDER_EMAIL

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱地址。对于大多数邮箱服务商,SENDER_EMAIL 必须和 SMTP_USER 保持一致,否则无法发送邮件。

SENDER_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站评论提醒

邮件通知标题。

SMTP_SERVICE

类型: String
默认值: null
必要性: false
示例: qiye.aliyun

邮件通知邮箱服务商。
完整列表请参考:Supported services

SMTP_USER

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱用户名。

SMTP_PASS

类型: String
默认值: null
必要性: false
示例: password

邮件通知邮箱密码,QQ邮箱请填写授权码。

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/api.html b/en/api.html new file mode 100644 index 000000000..a664ab2d2 --- /dev/null +++ b/en/api.html @@ -0,0 +1,80 @@ + + + + + + API reference | Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content

API reference

Through Twikoo API, theme developers can implement some special features, such as displaying the number of article comments in the article list, displaying the latest comments on the home page, etc.

It is not necessary to execute twikoo.init() before calling the Twikoo API.

Get comments count

Get the number of article comments in batch.

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: 'Environment ID', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  urls: [ // List of article paths without protocols, domains and parameters. It is a mandatory parameter
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // Whether the number of comments includes replies, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // example: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

Get recent comments

Get the latest comments.

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  pageSize: 10, // Get how many bars, the default parameter is 10, the maximum parameter is 100
+  includeReply: false // Whether to include the latest reply, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // Returns Array with the latest comments
+  // * id: comment ID
+  // * url: address of the comment
+  // * nick: nickname
+  // * mailMd5: The MD5 value of the mailbox, which can be used to display the avatar
+  // * link: URL
+  // * comment: the content of the comment in HTML format
+  // * commentText: comment content in plain text format
+  // * created: comment time, in millisecond timestamp format
+  // * avatar: the address of the avatar (new in 0.2.9)
+  // * relativeTime: relative comment time, e.g. "1 hour ago" (new in 0.2.9)
+  // Return example: [ // order from new to old
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

On Twikoo loaded

Callback function after Twikoo is successfully mounted.
It will not be triggered in case of environment ID error, network exception, mount failure, etc.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo is ready to go!');
+});

On comment loaded

Callback function after comments are loaded successfully.
It will also be triggered when the comment is automatically refreshed after posting and when the next page of comments is loaded.
It will not be triggered when the comment fails to load.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('Comment loading complete');
+  }
+});

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/backend.html b/en/backend.html new file mode 100644 index 000000000..deeb57d74 --- /dev/null +++ b/en/backend.html @@ -0,0 +1,26 @@ + + + + + + Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/faq.html b/en/faq.html new file mode 100644 index 000000000..8fbdb571d --- /dev/null +++ b/en/faq.html @@ -0,0 +1,43 @@ + + + + + + FAQ | Twikoo Docs + + + + + + + + + + + + + + + + +
Skip to content

FAQ

How do I change my avatar?

https://gravatar.com Register and set your avatar by email and leave the same email when commenting.

Visitors can also comment by entering their digital QQ email address and using their QQ avatar.

How do I change or reset the administrator password?

云开发控制台Edit the configuration, delete the config.ADMIN_PASS configuration item, and then go to the Twikoo administration panel to reset the password.

How to get the private key file of the admin panel?

  1. 环境-登录授权Click "Private Key Download" on the right of "Custom Login" to download the private key file
  2. Open the private key file with a text editor and copy all the contents
  3. Click the "pinion" (settings) icon in the comment window, paste the contents of the private key file, and set the administrator password

How to turn on article visit statistics?

You can add where you need to show the number of article visits:

html
<span id="twikoo_visitors">0</span>

to display the number of visits. We do not support site-wide visit statistics at the moment.

How can I test if the Akismet anti-spam configuration is in effect?

Please fill in viagra-test-123 as a nickname, or akismet-guaranteed-spam@example.com as an email address to post a comment, which will definitely be considered as a spam comment.

Note that due to the slow response time of the Akismet service (about 6 seconds), which affects the user experience, Twikoo adopts a "release first, detect later" policy, and spam comments will be visible for a short time after they are posted.

How are free resources calculated?

环境总览See resource usage. twikoo consumes database and cloud functions, both with a free usage of -

  • Database: 50,000 reads/day, 50,000 writes/day
  • Cloud functions: 40,000 GBs/month

The memory consumption of Twikoo cloud functions is constant at 0.1GB, which means that Twikoo cloud functions have a running time of up to 400,000 seconds per month, and the bottleneck of free resources is mainly in the daily read limit of the database. It is recommended that webmasters pay attention to the usage of free resources.

How do I enable Katex support?

Twikoo supports Katex formulas, but to limit the package size of Twikoo, Twikoo does not have the full Katex built-in, you need to load katex.js additionally in the page.

example

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

After loading, you can send $$c = \pm\sqrt{a^2 + b^2}$$ to test the effect.

katex

You can also pass in a custom katex configuration during twikoo.init, see Katex Auto-render Extension for details.

js
twikoo.init({
+  envId: 'Environment id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\(', right: '\\)', display: false },
+      { left: '\\[', right: '\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

How to configure anti-spam?

Using Tencent Cloud Content Security Service

Twikoo supports access to Tencent Cloud Text Content Detection, which uses deep learning technology to identify harmful content involving pornography, politics, terrorism, etc. It also supports user-configurable thesaurus to combat customized offending text.

Tencent Cloud text content detection is a paid service, offering a 1-month free trial, after which the price is 25 RMB per 10,000 entries. If you don't have high requirements for anti-spam comments, you can also use the free Akismet.

How to apply for Tencent Cloud Text Content Inspection?

  1. Visit Tencent Cloud Console - Text Content Security to open the text content security service
  2. Visit Tencent Cloud Console - User List, click New User, and click Quick Create.
  3. Enter the user name, select "Programmatic Access" as the access method, cancel "AdministratorAccess" as the user privilege, and only check the box "QcloudCMSFullAccess". QcloudCMSFullAccess".
  4. Click "Create User". 5.
  5. Copy the "SecretId" and "SecretKey" from the "Successful New User" page to the Twikoo administration panel Configure them in the "Anti-Spam" module
  6. Test the anti-spam effect

After success, webmasters can configure custom text content filtering in Tencent Cloud Console - Custom Library Management.

Using Akismet Anti-Spam Service

Akismet (Automattic Kismet) is a widely used spam filtering system by Matt Mullenweg, the founder of WordPress, Akismet is also the default plugin installed in WordPress and is very widely used. The goal of the design is to help blog sites to filter spam messages.

  1. Register akismet.com
  2. Select Akismet Personal subscription, copy the Akismet API Key and configure it in the Twikoo admin panel "Anti-Spam" module

Error encountered in login administration panel AUTH_INVALID_CUSTOM_LOGIN_TICKET

Generally, after configuring the login private key, the login private key is downloaded again, which causes the previously configured login private key to be invalid.
Solution: Go to Cloud Development Console, database, delete the config, and then reconfigure the private key.

Can't receive emails?

If it is a cloud function deployed by Vercel, please configure foreign mail service providers to avoid being judged as spam behavior by mail service providers. If it is other reasons, please go to Twikoo management panel, find mail test function, enter your personal mailbox and troubleshoot the reasons according to the test results.

In order to avoid performance problems caused by frequent mailbox checking, the mail configuration has a cache of about 10 minutes, if you are sure the configuration is fine but the test fails, you can wait for 10 minutes and then test again.

Vercel can't upload images?

The Tencent Cloud environment comes with cloud storage, so you can upload images directly in the Tencent Cloud environment, and the images are saved in the cloud storage. However, Vercel environment does not, the upload image function relies on third party image bed, please configure the image bed in the admin panel, Twikoo supports the following image bed:

BedAddressFeatures
qcloudNoneTencent Cloud environment comes with it, can be viewed in Cloud Development - Cloud Storage
7buhttps://7bu.topGo to No Bed, powered by 杜老师, no free packages
smmshttps://sm.msSMMS image bed, there is a free package, please register your account, IMAGE_CDN_TOKEN can be obtained in Dashboard
lsky-proPrivate DeploymentLankenGraphics 2.0 version, IMAGE_CDN please configure the URL address of the home page of the graph bed (such as https://7bu.top), IMAGE_CDN_TOKEN get way please refer to the tutorial 杜老师 said the graph bed: new version Go not to the bed Token acquisition and emptying, the format of the obtained token should be 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5)

Can it be deployed privately?

Yes.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/frontend.html b/en/frontend.html new file mode 100644 index 000000000..701769d8b --- /dev/null +++ b/en/frontend.html @@ -0,0 +1,26 @@ + + + + + + Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/index.html b/en/index.html new file mode 100644 index 000000000..704c6a402 --- /dev/null +++ b/en/index.html @@ -0,0 +1,26 @@ + + + + + + Twikoo | A simple, safe, free comment system + + + + + + + + + + + + + + + +
Skip to content

Twikoo

Comment system

Simple, safe, free

Twikoo

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/intro.html b/en/intro.html new file mode 100644 index 000000000..75d65bb85 --- /dev/null +++ b/en/intro.html @@ -0,0 +1,29 @@ + + + + + + Twikoo Docs + + + + + + + + + + + + + + + + +
Skip to content
Twikoo
       

A simple, safe, free comment system.
简体中文 | English

This document is for American English. This document has many bugs.

Features

Simple

  • Free Build.(Using CloudBase / Vercel / self-hosted as the commenting backend)
  • Simple Deployment.(Support CloudBase / Vercel one-click deployment)

Easy to use

  • Support reply, like.
  • No additional adaptations, support with light theme and dark theme use.
  • Support API , batch get article comment count, latest comments.
  • Visitors entering QQ number in the nickname field will automatically complete the QQ nickname and QQ email.
  • Visitors fill in the digital QQ e-mail, will use the QQ avatar as the comment avatar.
  • Support the comment to paste pictures.(Can be disabled)
  • Support inserting pictures.(Can be disabled)
  • Support 7bu image bed, Tencent CloudBase image bed.
  • Support inserting emoji.(Can be disabled)
  • Support Ctrl + Enter reply.
  • Comments are saved in draft in real time and will not be lost when refreshed.
  • Support Katex formulas.
  • Support for code highlighting by language.

Security

  • Privacy and information security. (sensitive fields (email, IP, environment configuration, etc.) are not leaked through Tencent cloud function control)
  • Support for Akismet spam comment detection.(View Details akismet.com
  • Support Tencent Cloud content security spam comment detection.(View Details Tencent Cloud Content Security
  • Support manual review mode.
  • Anti XSS Attack.
  • Support for limiting the maximum number of comments per IP per 10 minutes.

notification

  • E-mail(Visitors and Blogger)
  • Wechat(only Blogger, Server酱
  • QQ(only Blogger, Qmsg酱

Personalization

  • Background image.
  • the "blogger" logo text.
  • Notification Email Template.
  • Comment prompt message.(placeholder)
  • emoji(OwO 的数据格式
  • 【Nickname】 【Email】 【Website】 Required / Optional
  • Code highlighting theme.

Management

  • Embedded panel with password login to easily view comments, hide comments, delete comments and modify configuration.
  • Support to hide the management portal and show it by entering a secret code.
  • Support for importing comments from Valine, Artalk, Disqus.

Disadvantages

  • IE is not supported.

Preview

Comments

Comments

Management

Management

Notification

Notification

Quick Start

Deploy

View Details

If you want to get updates, make suggestions and participate in the test, welcome to join the discussion group:1080829142 (QQ)
1080829142

Special Thanks

Icon design:Maemo Lee

Release notes & plans

Update logs & Development Plan

Development

If you want to develop locally for a second time, you can refer to the following commands:

sh
yarn dev # (http://localhost:9820/demo.html)
+yarn lint 
+yarn build # (dist/twikoo.all.min.js)

If your changes can help more people, feel free to submit a Pull Request!

I18N

Support Simplified Chinese, Traditional Chinese, English. translate Pull Request.

License

FOSSA Status

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/link.html b/en/link.html new file mode 100644 index 000000000..e22f5d30f --- /dev/null +++ b/en/link.html @@ -0,0 +1,26 @@ + + + + + + Links | Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/quick-start.html b/en/quick-start.html new file mode 100644 index 000000000..0468c5ac1 --- /dev/null +++ b/en/quick-start.html @@ -0,0 +1,26 @@ + + + + + + Quick start | Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content

Quick start

Tip

The English document is being built. Please refer to the Chinese document.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/update.html b/en/update.html new file mode 100644 index 000000000..f3c848219 --- /dev/null +++ b/en/update.html @@ -0,0 +1,26 @@ + + + + + + Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/faq.html b/faq.html new file mode 100644 index 000000000..150398779 --- /dev/null +++ b/faq.html @@ -0,0 +1,43 @@ + + + + + + 常见问题 | Twikoo 文档 + + + + + + + + + + + + + + + + +
Skip to content

常见问题

如何修改头像?

请前往 https://weavatar.com 通过邮箱注册并设定头像,评论时,请留下相同的邮箱。

访客还可以通过输入数字 QQ 邮箱地址,使用 QQ 头像发表评论。

如何修改、重置管理员密码?

腾讯云请前往云开发控制台,Vercel 请前往 MongoDB,私有部署请直接编辑 data/db.json.1,编辑配置,删除 config.ADMIN_PASS 配置项,然后前往 Twikoo 管理面板重新设置密码。

如何获得管理面板的私钥文件?

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

如何开启文章访问量统计?

您可以在需要展示文章访问量的地方添加:

html
<span id="twikoo_visitors">0</span>

来展示访问量。暂不支持全站访问量统计。

如何启用 Katex 支持?

Twikoo 支持 Katex 公式,但为了限制 Twikoo 的包大小,Twikoo 没有内置完整的 Katex,您需要在页面中额外加载 katex.js

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

载入后,您可以发送 $$c = \pm\sqrt{a^2 + b^2}$$ 测试效果。

katex

您还可以在 twikoo.init 时传入自定义 katex 配置,详细配置请查看 Katex Auto-render Extension

js
twikoo.init({
+  envId: '您的环境id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\(', right: '\\)', display: false },
+      { left: '\\[', right: '\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

如何配置反垃圾?

使用腾讯云内容安全服务

Twikoo 支持接入腾讯云文本内容检测,使用深度学习技术,识别涉黄、涉政、涉恐等有害内容,同时支持用户配置词库,打击自定义的违规文本。

腾讯云文本内容检测是付费服务,提供 1 个月的免费试用,之后价格为 25 元/万条。如果您对反垃圾评论要求不高,也可以使用免费的 Akismet。

如何申请腾讯云文本内容检测

  1. 访问腾讯云控制台-文本内容安全,开通文本内容安全服务
  2. 访问腾讯云控制台-用户列表,点击新建用户,点击快速创建
  3. 输入用户名,访问方式选择“编程访问”,用户权限取消“AdministratorAccess”,只勾选“QcloudCMSFullAccess”
  4. 点击“创建用户”
  5. 复制“成功新建用户”页面的“SecretId”和“SecretKey”,到 Twikoo 管理面板“反垃圾”模块中配置
  6. 测试反垃圾效果

成功后,站长可以在腾讯云控制台-自定义库管理配置自定义文本内容过滤。

使用 Akismet 反垃圾服务

Akismet (Automattic Kismet) 是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的 WordPress 创始人 Matt Mullenweg,Akismet 也是 WordPress 默认安装的插件,其使用非常广泛,设计目标便是帮助博客网站来过滤垃圾留言。

  1. 注册 akismet.com
  2. 选择 Akismet Personal 订阅,复制得到的 Akismet API Key,到 Twikoo 管理面板“反垃圾”模块中配置

如何测试 Akismet 反垃圾配置是否生效?

请填写 viagra-test-123 作为昵称,或填写 akismet-guaranteed-spam@example.com 作为邮箱,发表评论,这条评论将一定会被视为垃圾评论。

需要注意的是,由于 Akismet 服务响应速度较慢(大约 6 秒),影响用户体验,Twikoo 采取 “先放行,后检测” 的策略,垃圾评论会在发表后短暂可见。

登录管理面板遇到错误 AUTH_INVALID_CUSTOM_LOGIN_TICKET

一般是配置好登录私钥之后,又重新下载了登录私钥,导致之前配置的登录私钥失效了。
解决方法:到云开发控制台,数据库,删掉 config,然后重新配置私钥。

收不到提醒邮件?

如果是 Vercel 部署的云函数,请配置国外邮件服务商,避免被邮件服务商判定为垃圾邮件行为。如果是其他原因,请前往 Twikoo 管理面板,找到邮件测试功能,输入个人邮箱,根据测试结果排查原因。

为了避免频繁检查邮箱带来的性能问题,邮件配置有 10 分钟左右的缓存,如果确定配置没有问题,但测试失败,可以等待 10 分钟后再测试。

由于博主发表评论时,不会通知博主,如果您想实际测试通知功能,请注销管理面板后用非博主邮箱发表或回复评论。

Vercel、私有部署无法上传图片?

腾讯云环境自带云存储,所以腾讯云环境下可以直接上传图片,图片保存在云存储中。然而 Vercel 环境没有,上传图片功能依赖第三方图床,请在管理面板中配置图床,Twikoo 支持以下图床:

图床地址特点
qcloud腾讯云环境自带,可在云开发 - 云存储中查看
7buhttps://7bu.top去不图床,由杜老师提供支持,无免费套餐
smmshttps://sm.msSMMS 图床,有免费套餐,请自行注册账号,IMAGE_CDN_TOKEN 可在 Dashboard 中获取
lsky-pro私有部署兰空图床 2.0 版本,IMAGE_CDN 请配置图床首页 URL 地址(如 https://7bu.top),IMAGE_CDN_TOKEN 获取方式请参考教程 杜老师说图床:新版本去不图床 Token 的获取与清空,获取到的 token 格式应为 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5

私有部署能连接自己的数据库吗?

Twikoo 私有部署版默认使用内置数据库:LokiJS 数据库,支持的数据库容量大约为 1 GB,不需要连接外部数据库,数据存储在启动 twikoo 时所在目录下的 data 目录,您可以直接复制该目录以完成数据备份。

如果您有 MongoDB 实例,可以连接 MongoDB 作为外部数据库,只需配置环境变量 MONGODB_URI 为数据库连接地址即可,如:mongodb://<username>:<password>@<host>/

部署后遇到评论失败: 0,管理面板进不去?

在包含评论框的页面,打开浏览器开发者工具(Windows 下快捷键为 F12),点击 Console 标签,查找包含 twikoo 关键字的报错。

如果看到 ERR_BLOCKED_BY_CLIENT,请禁用浏览器去广告插件或将当前网站加入白名单,然后刷新重试。

如果看到 ERR_CONNECTION_CLOSED,请检查自己所处的地区网络环境是否正常,能够连通云函数,部分地区无法访问 Vercel 等服务,请更换部署方式再试。

如果看到 Access to XMLHttpRequest at 'https://tcb-api.tencentcloudapi.com/web?env=...' from origin '...' has been blocked by CORS policy...:请检查前端 js 文件版本是否最新,并确保 envId 以 https:// 开头。

如果看到 Access to XMLHttpRequest at ... No 'Access-Control-Allow-Origin' header is present on the requested resource.:请先访问一下 envId 查看云函数是否运行正常,如果没有运行正常的提示,请重新部署云函数,确保不要漏下任何步骤;如果提示运行正常,请本地启动网站(localhost)并访问管理面板-配置管理-通用,清空 CORS_ALLOW_ORIGIN 字段并保存,然后刷新重试。

如果看到其他错误,请 提交 issue 并附上错误信息。

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend.html b/frontend.html new file mode 100644 index 000000000..255a382af --- /dev/null +++ b/frontend.html @@ -0,0 +1,43 @@ + + + + + + 前端部署 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

前端部署

在 Hexo 中使用

Hexo Butterfly 主题使用

请参考 Butterfly 安裝文檔(四) 主題配置-2 进行配置

Hexo Keep 主题使用

请参考 hexo-theme-keep/_config.yml 进行配置

Hexo Volantis 主题使用

请参考 hexo-theme-volantis/_config.yml 进行配置

Hexo Ayer 主题使用

请参考 hexo-theme-ayer/_config.yml 进行配置

Hexo NexT 主题使用

暂不支持 NexT 8 以下的版本,请先升级到 NexT 8。然后在 Hexo 项目根目录执行

sh
# For NexT version >= 8.0.0 && < 8.4.0
+npm install hexo-next-twikoo@1.0.0
+# For NexT version >= 8.4.0
+npm install hexo-next-twikoo@1.0.3

然后在配置中添加

yml
twikoo:
+  enable: true
+  visitor: true
+  envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  # region: ap-guangzhou # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填

Hexo Matery 主题使用

请参考 hexo-theme-matery/_config.yml 进行配置

Hexo Icarus 主题使用

请参考 基于腾讯云,给你的 Icarus 博客配上 Twikoo 评论系统 by 异次元de机智君💯

Hexo MengD(萌典) 主题使用

请参考 hexo-theme-MengD/_config.yml 进行配置

hexo-theme-fluid 主题使用

请参考 配置指南-评论 进行配置

hexo-theme-cards 主题使用

请参考 hexo-theme-cards/_config.yml 进行配置

maupassant-hexo 主题使用

请参考 maupassant-hexo/_config.yml 进行配置

hexo-theme-redefine 主题使用

请参考 Redefine 官方文档 #comment 进行配置

Hexo-Theme-Solitude 主题使用

请参考 Solitude 文档 进行配置

在 Hugo 中使用

hugo-theme-stack 主题使用

请参考 Comments | Stackhugo-theme-stack/config.yaml#L83 进行配置

FixIt 主题使用

请参考 入门篇 - FixIt #主题配置hugo-fixit/FixIt/config.toml#L613-L624 进行配置

在 VitePress 中使用

请参考 VitePress 集成 twikoo 参考解决方案 进行配置。

通过 CDN 引入

提示

如果您使用的博客主题不支持 Twikoo,并且您不知道如何引入 Twikoo,您可以在 Github 提交适配请求

html
<div id="tcomment"></div>
+<script src="https://cdn.jsdelivr.net/npm/twikoo@1.6.38/dist/twikoo.all.min.js" integrity="sha384-4KfOjEinLSkv1i1J8TzlkC/RTnuiLoR1OLerVgjEKoH5djYtbf7mzEFsz9p3nfuA" crossorigin="anonymous"></script>
+<script>
+twikoo.init({
+  envId: '您的环境id', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  el: '#tcomment', // 容器元素
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
+  // path: location.pathname, // 用于区分不同文章的自定义 js 路径,如果您的文章路径不是 location.pathname,需传此参数
+  // lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/twikoojs/twikoo/blob/main/src/client/utils/i18n/index.js
+})
+</script>

建议使用 CDN 引入 Twikoo 的用户在链接地址上锁定版本,以免将来 Twikoo 升级时受到非兼容性更新的影响。

更换 CDN 镜像

如果遇到默认 CDN 加载速度缓慢,可更换其他 CDN 镜像。以下为可供选择的公共 CDN,其中一些 CDN 可能需要数天时间同步最新版本:

  • https://s4.zstatic.net/ajax/libs/twikoo/1.6.38/twikoo.all.min.js
  • https://lib.baomitu.com/twikoo/1.6.38/twikoo.all.min.js
  • https://cdn.jsdelivr.net/npm/twikoo@1.6.38/dist/twikoo.all.min.js

建议使用 CDN 引入 Twikoo 的用户参考上一段的示例在代码中加入 SRI 属性以确保完整性。

开启管理面板(腾讯云环境)

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

配置好登录私钥之后无需留存私钥文件,请勿再次下载登录私钥,否则会导致之前配置的登录私钥失效。

开启管理面板(非腾讯云环境)

点击评论窗口的“小齿轮”图标,设置管理员密码

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 000000000..8d3ad4cde --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"api.md":"BDdCdCq-","backend.md":"DigxkCdm","cms.md":"DDBp-Tvm","configuration.md":"Cutop-pC","en_api.md":"ZSRIbW5p","en_backend.md":"Dc5PAZtF","en_faq.md":"CuEu6Jq3","en_frontend.md":"CWcIC4bn","en_index.md":"DAkyKDbd","en_intro.md":"B5kTfFqc","en_link.md":"Co6pIHmc","en_quick-start.md":"CBRNRlRv","en_update.md":"DFYULA2k","faq.md":"B4Pnc9sL","frontend.md":"BEcQ_kWD","index.md":"Ck2pUnPA","intro.md":"DXsPIJUB","link.md":"DZkTjCld","mongodb-atlas.md":"CLmTi-jV","qq_api.md":"CjBeVHHO","quick-start.md":"Bd8cDso5","update.md":"47Vc-wKh"} diff --git a/index.html b/index.html new file mode 100644 index 000000000..93e31d35a --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + Twikoo | 一个简洁、安全、免费的静态网站评论系统 + + + + + + + + + + + + + + + +
Skip to content

Twikoo

网站评论系统

简洁、安全、免费

Twikoo

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/intro.html b/intro.html new file mode 100644 index 000000000..8ee04b311 --- /dev/null +++ b/intro.html @@ -0,0 +1,29 @@ + + + + + + Twikoo 文档 + + + + + + + + + + + + + + + + +
Skip to content
Twikoo
       

一个简洁、安全、免费的静态网站评论系统。
A simple, safe, free comment system.

简体中文 | English

特色

简单

  • 免费搭建(使用云开发 / Vercel / 私有服务器作为评论后台)
  • 简单部署(支持云开发 / Vercel 一键部署)

易用

  • 支持回复、点赞
  • 无需额外适配,支持搭配浅色主题与深色主题使用
  • 支持 API 调用,批量获取文章评论数、最新评论
  • 访客在昵称栏输入 QQ 号,会自动补全 QQ 昵称和 QQ 邮箱
  • 访客填写数字 QQ 邮箱,会使用 QQ 头像作为评论头像
  • 支持评论框粘贴图片(可禁用)
  • 支持插入图片(可禁用)
  • 支持去不图床、云开发图床
  • 支持插入表情(可禁用)
  • 支持 Ctrl + Enter 快捷回复
  • 评论框内容实时保存草稿,刷新不会丢失
  • 支持 Katex 公式
  • 支持按语言的代码高亮

安全

  • 隐私信息安全(通过云函数控制敏感字段(邮箱、IP、环境配置等)不会泄露)
  • 支持 Akismet 垃圾评论检测(需自行注册 akismet.com
  • 支持腾讯云内容安全垃圾评论检测(需自行注册 腾讯云内容安全
  • 支持人工审核模式
  • 防 XSS 注入
  • 支持限制每个 IP 每 10 分钟最多发表多少条评论

即时

  • 支持邮件提醒(访客和博主)
  • 支持微信提醒(仅针对博主,基于 Server酱,需自行注册)
  • 支持 QQ 提醒(仅针对博主,基于 Qmsg酱,需自行注册)
  • 支持 QQ 提醒(针对博主QQ或者群,基于 go-cqhttp,需自己有服务器)

个性

  • 支持自定义评论框背景图片
  • 支持自定义“博主”标识文字
  • 支持自定义通知邮件模板
  • 支持自定义评论框提示信息(placeholder)
  • 支持自定义表情列表(兼容 OwO 的数据格式
  • 支持自定义【昵称】【邮箱】【网址】必填 / 选填
  • 支持自定义代码高亮主题

便捷管理

  • 内嵌式管理面板,通过密码登录,可方便地查看评论、隐藏评论、删除评论、修改配置
  • 支持隐藏管理入口,通过输入暗号显示
  • 支持从 Valine、Artalk、Disqus 导入评论

缺点

  • 不支持 IE

预览

评论

评论

评论管理

评论管理

推送通知

推送通知

交流群

如果你想获取更新动态、建言献策、参与测试,欢迎加入讨论群:
1080829142

浏览器支持

提示

技术原因,不兼容 IE

IE / Edge
IE / Edge
Firefox
Firefox
Chrome
Chrome
Safari
Safari
iOS Safari
iOS Safari
Edgelast versionlast versionlast versionlast version

Generated by browsers-support-badges

更新日志 & 开发计划

更新日志 & 开发计划

特别感谢

图标设计:Maemo Lee

开发

如果您想在本地二次开发,可以参考以下命令:

sh
yarn dev # 开发 (http://localhost:9820/demo.html)
+yarn lint # 代码检查
+yarn build # 编译 (dist/twikoo.all.min.js)

如果您的改动能够帮助到更多人,欢迎提交 Pull Request!

国际化

支持简体中文、繁体中文、English。欢迎提交翻译 PR

许可

FOSSA Status

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/link.html b/link.html new file mode 100644 index 000000000..31768910a --- /dev/null +++ b/link.html @@ -0,0 +1,26 @@ + + + + + + 相关文档 | Twikoo 文档 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mongodb-atlas.html b/mongodb-atlas.html new file mode 100644 index 000000000..a9650a402 --- /dev/null +++ b/mongodb-atlas.html @@ -0,0 +1,26 @@ + + + + + + MongoDB Atlas | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

MongoDB Atlas

MongoDB Atlas 是 MongoDB Inc 提供的 MongoDB 数据库托管服务。免费账户可以永久使用 500 MiB 的数据库,足够存储 Twikoo 评论使用。

  1. 申请 MongoDB AtLas 账号
  2. 创建免费 MongoDB 数据库,区域推荐选择离 Twikoo 后端(Vercel / Netlify / AWS Lambda / VPS)地理位置较近的数据中心以获得更低的数据库连接延迟。如果不清楚自己的后端在哪个区域,也可选择 AWS / Oregon (us-west-2),该数据中心基建成熟,故障率低,且使用 Oregon 州的清洁能源,较为环保
  3. 在 Database Access 页面点击 Add New Database User 创建数据库用户,Authentication Method 选 Password,在 Password Authentication 下设置数据库用户名和密码,建议点击 Auto Generate 自动生成一个不含特殊符号的强壮密码并妥善保存。点击 Database User Privileges 下方的 Add Built In Role,Select Role 选择 Atlas Admin,最后点击 Add User

  1. 在 Network Access 页面点击 Add IP Address 添加网络白名单。因为 Vercel / Netlify / Lambda 的出口地址不固定,因此 Access List Entry 输入 0.0.0.0/0(允许所有 IP 地址的连接)即可。如果 Twikoo 部署在自己的服务器上,这里可以填入固定 IP 地址。点击 Confirm 保存

  1. 在 Database 页面点击 Connect,连接方式选择 Drivers,并记录数据库连接字符串,请将连接字符串中的 <username>:<password> 修改为刚刚创建的数据库 用户名:密码

  1. (可选)默认的连接字符串没有指定数据库名称,Twikoo 会连接到默认的名为 test 的数据库。如果需要在同一个 MongoDB 里运行其他业务或供多个 Twikoo 实例使用,建立加入数据库名称并配置对应的 ACL。

连接字符串包含了连接到 MongoDB 数据库的所有信息,一旦泄露会导致评论被任何人添加、修改、删除,并有可能获取你的 SMTP、图床 token 等信息。请妥善记录这一字符串,之后需要填入到 Twikoo 的部署平台里。

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/quick-start.html b/quick-start.html new file mode 100644 index 000000000..2c322c787 --- /dev/null +++ b/quick-start.html @@ -0,0 +1,26 @@ + + + + + + 快速上手 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

快速上手

Twikoo 分为云函数和前端两部分,若要在您的网站上集成 Twikoo,您需要同时部署云函数和前端,部署时请注意保持二者版本一致。

  • 云函数部署 有多种方式,请选择适合自己的部署平台。
  • 前端部署 有 2 种方式,如果您的网站主题支持 Twikoo,您只需在配置文件中指定 Twikoo 即可;如果您的网站主题不支持 Twikoo,您需要修改源码手动引入 Twikoo 的 js 文件并初始化。
  • 若您已部署旧版本 Twikoo,请参考 版本更新 升级云函数和前端版本。

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/twikoo-logo-home.png b/twikoo-logo-home.png new file mode 100644 index 000000000..c92c67da2 Binary files /dev/null and b/twikoo-logo-home.png differ diff --git a/twikoo-logo-mini.png b/twikoo-logo-mini.png new file mode 100644 index 000000000..462134075 Binary files /dev/null and b/twikoo-logo-mini.png differ diff --git a/update.html b/update.html new file mode 100644 index 000000000..e3e80c1a9 --- /dev/null +++ b/update.html @@ -0,0 +1,26 @@ + + + + + + 版本更新 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

版本更新

不同部署方式的更新方式也不同,请对号入座。更新部署成功后,请不要忘记同时更新前端的 Twikoo CDN 地址中的 x.x.x 数字版本号,使之与云函数版本号相同,然后部署网站。

针对腾讯云一键部署的更新方式

登录环境-我的应用,输入

  • 来源地址:https://github.com/twikoojs/twikoo/tree/main
  • 部署分支:main

应用目录无需填写,点击“确定”,部署完成。

针对腾讯云手动部署的更新方式

登录环境-云函数,点击 twikoo,点击函数代码,打开 package.json 文件,将 "twikoo-func": "x.x.x" 其中的版本号修改为最新版本号,点击“保存并安装依赖”即可。

提示

如果您的云函数是 1.0.0 之前的版本,因为 1.0.0 版本修改了部署步骤,请先参考手动部署,从第 5 步开始,重新创建云函数,再按照此步骤更新。

如果升级后出现无法读取评论列表,云函数报错,请在函数编辑页面,删除 node_modules 目录(删除需要半分钟左右,请耐心等待删除完成),再点击保存并安装依赖。如果仍然不能解决,请删除并重新创建 Twikoo 云函数。

针对腾讯云命令行部署的更新方式

进入 Twikoo 源码目录,执行以下命令更新现有的云函数

sh
yarn deploy -e 您的环境id

针对 Vercel 部署的更新方式

  1. 进入 Vercel 仪表板 - twikoo - Settings - Git
  2. 点击 Connected Git Repository 下方的仓库地址
  3. 打开 package.json,点击编辑
  4. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  5. 部署会自动触发,可以回到 Vercel 仪表板,查看部署状态

针对 Railway 和 Zeabur 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-zeabur 的仓库
  2. 打开 package.json,点击编辑
  3. "tkserver": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对 Netlify 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-netlify 的仓库
  2. 打开 package.json,点击编辑
  3. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对 Hugging Face 部署的更新方式

  1. 登录 Hugging Face,找到部署的 Space,点击上方 Settings,往下滚动找到并点击 Factory rebuild

针对私有部署的更新方式

  1. 停止旧版本 kill $(ps -ef | grep tkserver | grep -v 'grep' | awk '{print $2}')
  2. 拉取新版本 npm i -g tkserver@latest
  3. 启动新版本 nohup tkserver >> tkserver.log 2>&1 &

针对私有部署 (Docker) 的更新方式

  1. 拉取新版本 docker pull imaegoo/twikoo
  2. 停止旧版本容器 docker stop twikoo
  3. 删除旧版本容器 docker rm twikoo
  4. 启动新版本容器

自动更新

考虑到可用性和安全性问题,Twikoo 没有实现自动更新,也没有计划实现自动更新。如果您希望实现自动更新,可以参考 MHuiG 基于 Github 工作流的 twikoo-update 的实现方式。

Released under the MIT License.

+ + + + \ No newline at end of file