commit e97717dfe7fa77c85171b395440f1f28f7478485 Author: RhenCloud Date: Sun Nov 9 14:21:55 2025 +0800 初始化文档 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0bcb75d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +**/node_modules + +.github/ + +docs/.vuepress/.cache +docs/.vuepress/.temp +docs/.vuepress/dist + +.DS_Store +*.log \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..f5c722e --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +shamefully-hoist=true +shell-emulator=true \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..745b4d0 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +--- +home: true +config: + - + type: hero + hero: + name: Cloud Index + # text: VuePress Next Theme + tagline: 一个简约易用的,功能丰富的 vuepress 文档&博客 主题 + image: /plume.png + actions: + - + theme: brand + text: 项目介绍 → + link: /guide/introduction + - + theme: alt + text: Github + link: https://github.com/RhenCloud/Cloud Index +--- \ No newline at end of file diff --git a/docs/.vuepress/client.ts b/docs/.vuepress/client.ts new file mode 100644 index 0000000..f9edb73 --- /dev/null +++ b/docs/.vuepress/client.ts @@ -0,0 +1,22 @@ +import { defineClientConfig } from 'vuepress/client' +// import RepoCard from 'vuepress-theme-plume/features/RepoCard.vue' +// import NpmBadge from 'vuepress-theme-plume/features/NpmBadge.vue' +// import NpmBadgeGroup from 'vuepress-theme-plume/features/NpmBadgeGroup.vue' +// import Swiper from 'vuepress-theme-plume/features/Swiper.vue' + +// import CustomComponent from './theme/components/Custom.vue' + +// import './theme/styles/custom.css' + +export default defineClientConfig({ + enhance({ app }) { + // built-in components + // app.component('RepoCard', RepoCard) + // app.component('NpmBadge', NpmBadge) + // app.component('NpmBadgeGroup', NpmBadgeGroup) + // app.component('Swiper', Swiper) // you should install `swiper` + + // your custom components + // app.component('CustomComponent', CustomComponent) + }, +}) diff --git a/docs/.vuepress/collections.ts b/docs/.vuepress/collections.ts new file mode 100644 index 0000000..d693605 --- /dev/null +++ b/docs/.vuepress/collections.ts @@ -0,0 +1,16 @@ +import { defineUserConfig } from "vuepress"; +import { plumeTheme } from "vuepress-theme-plume"; + +export default defineUserConfig({ + theme: plumeTheme({ + collections: [ + { + type: "doc", + dir: "guide", + linkPrefix: "/guide/", + title: "TypeScript 笔记", + sidebar: ["basic", "types"], + }, + ], + }), +}); diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts new file mode 100644 index 0000000..4b5ed14 --- /dev/null +++ b/docs/.vuepress/config.ts @@ -0,0 +1,168 @@ +/** + * 查看以下文档了解主题配置 + * - @see https://theme-plume.vuejs.press/config/intro/ 配置说明 + * - @see https://theme-plume.vuejs.press/config/theme/ 主题配置项 + * + * 请注意,对此文件的修改都会重启 vuepress 服务。 + * 部分配置项的更新没有必要重启 vuepress 服务,建议请在 `.vuepress/config.ts` 文件中配置 + * + * 特别的,请不要在两个配置文件中重复配置相同的项,当前文件的配置项会被覆盖 + */ + +import { viteBundler } from "@vuepress/bundler-vite"; +import { defineUserConfig } from "vuepress"; +import { plumeTheme } from "vuepress-theme-plume"; + +export default defineUserConfig({ + base: "/", + lang: "zh-CN", + title: "Cloud Index Docs", + description: "一个支持多种云存储后端的文件管理、索引和浏览服务", + + head: [ + // 配置站点图标 + ["link", { rel: "icon", type: "image/png", href: "https://theme-plume.vuejs.press/favicon-32x32.png" }], + ], + + bundler: viteBundler(), + shouldPrefetch: false, // 站点较大,页面数量较多时,不建议启用 + + theme: plumeTheme({ + /* 添加您的部署域名, 有助于 SEO, 生成 sitemap */ + hostname: "https://docs.cloud-index.rhen.cloud", + + /* 文档仓库配置,用于 editLink */ + docsRepo: "RhenCloud/Cloud Index", // TODO: 替换为你的仓库,例如 'RhenCloud/cloud-index-docs' + docsDir: "docs", + docsBranch: "docs", + + /* 页内信息 */ + editLink: true, + lastUpdated: {}, + contributors: true, + // changelog: false, + + /** + * 编译缓存,加快编译速度 + * @see https://theme-plume.vuejs.press/config/basic/#cache + */ + cache: "filesystem", + + /** + * 为 markdown 文件自动添加 frontmatter 配置 + * @see https://theme-plume.vuejs.press/config/basic/#autofrontmatter + */ + autoFrontmatter: { + permalink: false, // 禁用自动生成随机 permalink,改为手动配置 + createTime: true, // 是否生成创建时间 + title: true, // 是否生成标题 + }, + + /* 本地搜索, 默认启用 */ + search: { provider: "local" }, + + /** + * Algolia DocSearch + * 启用此搜索需要将 本地搜索 search 设置为 false + * @see https://theme-plume.vuejs.press/config/plugins/search/#algolia-docsearch + */ + // search: { + // provider: 'algolia', + // appId: '', + // apiKey: '', + // indices: [''], + // }, + + /** + * Shiki 代码高亮 + * @see https://theme-plume.vuejs.press/config/plugins/code-highlight/ + */ + // codeHighlighter: { + // twoslash: true, // 启用 twoslash + // whitespace: true, // 启用 空格/Tab 高亮 + // lineNumbers: true, // 启用行号 + // }, + + /* 文章字数统计、阅读时间,设置为 false 则禁用 */ + // readingTime: true, + + /** + * markdown + * @see https://theme-plume.vuejs.press/config/markdown/ + */ + // markdown: { + // abbr: true, // 启用 abbr 语法 *[label]: content + // annotation: true, // 启用 annotation 语法 [+label]: content + // pdf: true, // 启用 PDF 嵌入 @[pdf](/xxx.pdf) + // caniuse: true, // 启用 caniuse 语法 @[caniuse](feature_name) + // plot: true, // 启用隐秘文本语法 !!xxxx!! + // bilibili: true, // 启用嵌入 bilibili视频 语法 @[bilibili](bid) + // youtube: true, // 启用嵌入 youtube视频 语法 @[youtube](video_id) + // artPlayer: true, // 启用嵌入 artPlayer 本地视频 语法 @[artPlayer](url) + // audioReader: true, // 启用嵌入音频朗读功能 语法 @[audioReader](url) + // icon: { provider: 'iconify' }, // 启用内置图标语法 ::icon-name:: + // table: true, // 启用表格增强容器语法 ::: table + // codepen: true, // 启用嵌入 codepen 语法 @[codepen](user/slash) + // replit: true, // 启用嵌入 replit 语法 @[replit](user/repl-name) + // codeSandbox: true, // 启用嵌入 codeSandbox 语法 @[codeSandbox](id) + // jsfiddle: true, // 启用嵌入 jsfiddle 语法 @[jsfiddle](user/id) + // npmTo: true, // 启用 npm-to 容器 ::: npm-to + // demo: true, // 启用 demo 容器 ::: demo + // repl: { // 启用 代码演示容器 + // go: true, // ::: go-repl + // rust: true, // ::: rust-repl + // kotlin: true, // ::: kotlin-repl + // python: true, // ::: python-repl + // }, + // math: { // 启用数学公式 + // type: 'katex', + // }, + // chartjs: true, // 启用 chart.js + // echarts: true, // 启用 ECharts + // mermaid: true, // 启用 mermaid + // flowchart: true, // 启用 flowchart + // image: { + // figure: true, // 启用 figure + // lazyload: true, // 启用图片懒加载 + // mark: true, // 启用图片标记 + // size: true, // 启用图片大小 + // }, + // include: true, // 在 Markdown 文件中导入其他 markdown 文件内容 + // imageSize: 'local', // 启用 自动填充 图片宽高属性,避免页面抖动 + // }, + + /** + * 水印 + * @see https://theme-plume.vuejs.press/guide/features/watermark/ + */ + // watermark: true, + + /** + * 评论 comments + * @see https://theme-plume.vuejs.press/guide/features/comments/ + */ + // comment: { + // provider: '', // "Artalk" | "Giscus" | "Twikoo" | "Waline" + // comment: true, + // repo: '', + // repoId: '', + // category: '', + // categoryId: '', + // mapping: 'pathname', + // reactionsEnabled: true, + // inputPosition: 'top', + // }, + + /** + * 资源链接替换 + * @see https://theme-plume.vuejs.press/guide/features/replace-assets/ + */ + // replaceAssets: 'https://cdn.example.com', + + /** + * 加密功能 + * @see https://theme-plume.vuejs.press/guide/features/encryption/ + */ + // encrypt: {}, + }), +}); diff --git a/docs/.vuepress/navbar.ts b/docs/.vuepress/navbar.ts new file mode 100644 index 0000000..35b9e2d --- /dev/null +++ b/docs/.vuepress/navbar.ts @@ -0,0 +1,30 @@ +/** + * @see https://theme-plume.vuejs.press/config/navigation/ 查看文档了解配置详情 + * + * Navbar 配置文件,它在 `.vuepress/plume.config.ts` 中被导入。 + */ + +import { defineNavbarConfig } from "vuepress-theme-plume"; + +export default defineNavbarConfig([ + { text: "首页", link: "/" }, + { + text: "📖 文档", + items: [ + { text: "项目介绍", link: "/guide/introduction" }, + { text: "快速开始", link: "/guide/quickstart" }, + { text: "安装指南", link: "/guide/installation" }, + { text: "配置指南", link: "/guide/configuration" }, + { text: "部署指南", link: "/guide/deployment" }, + ], + }, + { + text: "☁️ 存储后端", + items: [ + { text: "后端概览", link: "/storage/overview" }, + { text: "Cloudflare R2", link: "/storage/r2" }, + { text: "Amazon S3", link: "/storage/s3" }, + { text: "GitHub", link: "/storage/github" }, + ], + }, +]); diff --git a/docs/.vuepress/plume.config.ts b/docs/.vuepress/plume.config.ts new file mode 100644 index 0000000..5c9a573 --- /dev/null +++ b/docs/.vuepress/plume.config.ts @@ -0,0 +1,125 @@ +/** + * 查看以下文档了解主题配置 + * - @see https://theme-plume.vuejs.press/config/intro/ 配置说明 + * - @see https://theme-plume.vuejs.press/config/theme/ 主题配置项 + * + * 请注意,对此文件的修改不会重启 vuepress 服务,而是通过热更新的方式生效 + * 但同时部分配置项不支持热更新,请查看文档说明 + * 对于不支持热更新的配置项,请在 `.vuepress/config.ts` 文件中配置 + * + * 特别的,请不要在两个配置文件中重复配置相同的项,当前文件的配置项会覆盖 `.vuepress/config.ts` 文件中的配置 + */ + +import { defineThemeConfig } from "vuepress-theme-plume"; +import navbar from "./navbar"; +import collections from "./collections"; + +/** + * @see https://theme-plume.vuejs.press/config/basic/ + */ +export default defineThemeConfig({ + logo: "https://theme-plume.vuejs.press/plume.png", + + appearance: true, // 配置 深色模式 + + social: [ + { icon: "github", link: "https://github.com/RhenCloud/Cloud-Index" }, // TODO: 替换为实际仓库 URL + ], + // navbarSocialInclude: ['github'], // 允许显示在导航栏的 social 社交链接 + aside: true, // 页内侧边栏, 默认显示在右侧 + outline: [2, 3], // 页内大纲, 默认显示 h2, h3 + + /** + * 文章版权信息 + * @see https://theme-plume.vuejs.press/guide/features/copyright/ + */ + // copyright: true, + + // prevPage: true, // 是否启用上一页链接 + // nextPage: true, // 是否启用下一页链接 + // createTime: true, // 是否显示文章创建时间 + + /* 站点页脚 */ + // footer: { + // message: 'Power by VuePress & vuepress-theme-plume', + // copyright: '', + // }, + + /** + * @see https://theme-plume.vuejs.press/config/basic/#profile + */ + profile: { + avatar: "https://theme-plume.vuejs.press/plume.png", + name: "Cloud Index Docs", + description: "一个支持多种云存储后端的文件管理、索引和浏览服务", + // circle: true, + // location: '', + // organization: '', + }, + + navbar, + // collections, + + /** + * 侧边栏配置 + * @see https://theme-plume.vuejs.press/config/navigation/#sidebar + */ + sidebar: { + "/guide/": [ + { + text: "📖 使用指南", + collapsed: false, + items: [ + { text: "项目介绍", link: "/guide/introduction" }, + { text: "快速开始", link: "/guide/quickstart" }, + { + text: "配置", + collapsed: false, + items: [ + { text: "配置指南", link: "/guide/configuration" }, + { text: "环境配置", link: "/guide/environment" }, + ], + }, + { + text: "部署", + collapsed: false, + items: [ + // { text: "Docker 部署", link: "/guide/docker" }, + { text: "Vercel 部署", link: "/guide/vercel" }, + ], + }, + ], + }, + ], + "/storage/": [ + { + text: "☁️ 存储后端", + collapsed: false, + items: [ + { text: "后端概览", link: "/storage/overview" }, + { text: "Cloudflare R2", link: "/storage/r2" }, + { text: "Amazon S3", link: "/storage/s3" }, + { text: "GitHub", link: "/storage/github" }, + ], + }, + ], + }, + + /** + * 公告板 + * @see https://theme-plume.vuejs.press/guide/features/bulletin/ + */ + // bulletin: { + // layout: 'top-right', + // contentType: 'markdown', + // title: '公告板标题', + // content: '公告板内容', + // }, + + /* 过渡动画 @see https://theme-plume.vuejs.press/config/basic/#transition */ + // transition: { + // page: true, // 启用 页面间跳转过渡动画 + // postList: true, // 启用 博客文章列表过渡动画 + // appearance: 'fade', // 启用 深色模式切换过渡动画, 或配置过渡动画类型 + // }, +}); diff --git a/docs/.vuepress/public/plume.svg b/docs/.vuepress/public/plume.svg new file mode 100644 index 0000000..62ee70c --- /dev/null +++ b/docs/.vuepress/public/plume.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/.vuepress/theme/components/Custom.vue b/docs/.vuepress/theme/components/Custom.vue new file mode 100644 index 0000000..04bac0a --- /dev/null +++ b/docs/.vuepress/theme/components/Custom.vue @@ -0,0 +1,11 @@ + + + diff --git a/docs/.vuepress/theme/shim.d.ts b/docs/.vuepress/theme/shim.d.ts new file mode 100644 index 0000000..f07bbd3 --- /dev/null +++ b/docs/.vuepress/theme/shim.d.ts @@ -0,0 +1,6 @@ +declare module '*.vue' { + import type { ComponentOptions } from 'vue' + + const comp: ComponentOptions + export default comp +} diff --git a/docs/.vuepress/theme/styles/custom.css b/docs/.vuepress/theme/styles/custom.css new file mode 100644 index 0000000..16de560 --- /dev/null +++ b/docs/.vuepress/theme/styles/custom.css @@ -0,0 +1,50 @@ +:root { + /** 主题颜色 */ + + /* + --vp-c-brand-1: #5086a1; + --vp-c-brand-2: #6aa1b7; + --vp-c-brand-3: #8cccd5; + --vp-c-brand-soft: rgba(131, 208, 218, 0.314); + */ + + /** 背景颜色 */ + + /* + --vp-c-bg: #fff; + --vp-c-bg-alt: #f6f6f7; + --vp-c-bg-elv: #fff; + --vp-c-bg-soft: #f6f6f7; + */ + + /** 文本颜色 */ + + /* + --vp-c-text-1: rgba(60, 60, 67); + --vp-c-text-2: rgba(60, 60, 67, 0.78); + --vp-c-text-3: rgba(60, 60, 67, 0.56); + */ +} + +/** 深色模式 */ +[data-theme="dark"] { + /* + --vp-c-brand-1: #8cccd5; + --vp-c-brand-2: #6aa1b7; + --vp-c-brand-3: #5086a1; + --vp-c-brand-soft: rgba(131, 208, 218, 0.314); + */ + + /* + --vp-c-bg: #1b1b1f; + --vp-c-bg-alt: #161618; + --vp-c-bg-elv: #202127; + --vp-c-bg-soft: #202127; + */ + + /* + --vp-c-text-1: rgba(255, 255, 245, 0.86); + --vp-c-text-2: rgba(235, 235, 245, 0.6); + --vp-c-text-3: rgba(235, 235, 245, 0.38); + */ +} diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..8762e66 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,34 @@ +--- +pageLayout: home +externalLinkIcon: false +config: + - + type: doc-hero + full: true + effect: lightning + hero: + name: Cloud Index Docs + tagline: Cloud Index 文档 + text: 一个支持多种云存储后端的文件管理、索引和浏览服务 + actions: + - + theme: brand + text: 📖 项目简介 + link: /guide/introduction + - + theme: alt + text: ☁️ 存储后端 + link: /storage/overview + - + type: features + features: + - title: 🚀 多云存储支持 + details: 支持 S3、R2、GitHub 等多种云存储后端 + - title: 🔍 快速搜索 + details: 本地搜索与全文索引,快速查找文件 + - title: 📊 文件管理 + details: 完整的文件上传、下载、删除和组织功能 + - title: 🌙 深色模式 + details: 自适应深色/浅色主题,保护眼睛 +--- + diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md new file mode 100644 index 0000000..a3b4ca6 --- /dev/null +++ b/docs/guide/configuration.md @@ -0,0 +1,334 @@ +--- +title: 配置指南 +createTime: 2025/11/09 00:26:55 +permalink: /guide/configuration +--- +# 配置说明 + +本文档详细说明了 Cloud Index 的各种配置选项。 + +## 配置方式 + +Cloud Index 通过环境变量进行配置,有两种主要方式: + +### 1. 环境变量文件 (.env) + +在项目根目录创建 `.env` 文件: + +```bash +cp .env.example .env +``` + +编辑 `.env` 文件,添加需要的配置。 + +### 2. 系统环境变量 + +直接在系统中设置环境变量(适用于 Docker、Serverless 等环境)。 + +## 存储后端配置 + +### STORAGE_TYPE(必需) + +选择要使用的存储后端: + +```env +# Cloudflare R2 +STORAGE_TYPE=r2 + +# Amazon S3 +STORAGE_TYPE=s3 + +# GitHub 仓库 +STORAGE_TYPE=github + +# GitHub Release +STORAGE_TYPE=github-release +``` + +## Cloudflare R2 配置 + +当 `STORAGE_TYPE=r2` 时,需要配置以下环境变量: + +```env +# ===== R2 基础配置 ===== +STORAGE_TYPE=r2 + +# R2 API 访问凭证 +ACCESS_KEY_ID=your_access_key_id +SECRET_ACCESS_KEY=your_secret_access_key + +# R2 存储桶信息 +R2_ENDPOINT_URL=https://your-account-id.r2.cloudflarestorage.com +R2_BUCKET_NAME=your-bucket-name +R2_REGION=auto + +# ===== 可选配置 ===== + +# 公开访问 URL(用于生成可分享的文件链接) +R2_PUBLIC_URL=https://pub-your-bucket.r2.dev + +# 预签名 URL 过期时间(秒),默认 3600 +R2_PRESIGN_EXPIRES=3600 +``` + +**配置说明:** + +| 配置项 | 说明 | 获取方式 | +|-------|------|---------| +| `ACCESS_KEY_ID` | R2 API Token ID | Cloudflare 控制面板 | +| `SECRET_ACCESS_KEY` | R2 API Token Secret | Cloudflare 控制面板 | +| `R2_ENDPOINT_URL` | R2 端点 URL | Cloudflare 控制面板(Account ID) | +| `R2_BUCKET_NAME` | 存储桶名称 | Cloudflare 控制面板 | +| `R2_PUBLIC_URL` | 公开 URL(可选) | Cloudflare 控制面板 → Custom Domain | + +**获取凭证步骤:** + +1. 登录 [Cloudflare 控制面板](https://dash.cloudflare.com) +2. 进入 R2 → API Tokens +3. 创建新 Token,复制 ID 和 Secret +4. 记录你的 Account ID(在 R2 仓库页面显示) + +## Amazon S3 配置 + +当 `STORAGE_TYPE=s3` 时,需要配置以下环境变量: + +```env +# ===== S3 基础配置 ===== +STORAGE_TYPE=s3 + +# AWS 访问凭证 +ACCESS_KEY_ID=your_aws_access_key +SECRET_ACCESS_KEY=your_aws_secret_key + +# S3 存储桶信息 +S3_BUCKET_NAME=your-bucket-name +S3_REGION=us-east-1 + +# ===== 可选配置 ===== + +# 自定义 S3 端点(用于兼容的 S3 服务) +S3_ENDPOINT_URL=https://s3.amazonaws.com + +# 公开访问 URL +S3_PUBLIC_URL=https://your-bucket-name.s3.amazonaws.com + +# 预签名 URL 过期时间(秒) +S3_PRESIGN_EXPIRES=3600 +``` + +**配置说明:** + +| 配置项 | 说明 | 获取方式 | +|-------|------|---------| +| `ACCESS_KEY_ID` | AWS Access Key ID | AWS IAM 控制台 | +| `SECRET_ACCESS_KEY` | AWS Secret Access Key | AWS IAM 控制台 | +| `S3_BUCKET_NAME` | 存储桶名称 | AWS S3 控制台 | +| `S3_REGION` | 存储桶区域 | AWS S3 控制台 | + +**常用区域代码:** + +``` +us-east-1 - 美国东部(N. Virginia) +us-west-2 - 美国西部(Oregon) +eu-west-1 - 欧洲(Ireland) +ap-northeast-1 - 亚太(Tokyo) +cn-north-1 - 中国(北京) +``` + +## GitHub 存储配置 + +当 `STORAGE_TYPE=github` 时,需要配置以下环境变量: + +```env +# ===== GitHub 基础配置 ===== +STORAGE_TYPE=github + +# GitHub 账户信息 +GITHUB_REPO_OWNER=your-username +GITHUB_REPO_NAME=your-repo-name +GITHUB_ACCESS_TOKEN=your_github_personal_token + +# ===== 可选配置 ===== + +# 使用的分支,默认 main +GITHUB_BRANCH=main + +# GitHub Raw 内容代理 URL(用于加速访问) +GITHUB_RAW_PROXY_URL=https://raw.ghproxy.com + +# 预签名 URL 过期时间(秒) +GITHUB_PRESIGN_EXPIRES=3600 +``` + +**配置说明:** + +| 配置项 | 说明 | 获取方式 | +|-------|------|---------| +| `GITHUB_REPO_OWNER` | GitHub 用户名或组织名 | GitHub Profile | +| `GITHUB_REPO_NAME` | 仓库名称 | GitHub 仓库页面 | +| `GITHUB_ACCESS_TOKEN` | Personal Access Token | GitHub Settings → Developer settings | +| `GITHUB_RAW_PROXY_URL` | Raw 内容代理(可选) | 第三方代理服务 | + +**获取 Token 步骤:** + +1. 登录 GitHub +2. 进入 Settings → Developer settings → Personal access tokens +3. 创建新 Token(New fine-grained personal access token) +4. 勾选 `contents` 权限(读写仓库内容) +5. 复制 Token,保存到 `.env` 文件 + +**推荐代理服务:** + +``` +https://raw.ghproxy.com - 国内加速 +https://ghproxy.com - 国内加速 +https://raw.githubusercontent.com - 官方(无加速) +``` + +## 应用配置 + +### 缓存配置 + +```env +# 缩略图缓存过期时间(秒),默认 3600(1小时) +THUMB_TTL_SECONDS=3600 +``` + +### 应用服务器配置 + +```env +# Flask 调试模式(开发环境推荐启用) +FLASK_ENV=development +FLASK_DEBUG=1 + +# 应用监听地址 +FLASK_RUN_HOST=0.0.0.0 + +# 应用监听端口 +FLASK_RUN_PORT=5000 +``` + +### 日志配置 + +```env +# 日志级别 +LOG_LEVEL=INFO + +# 日志文件路径 +LOG_FILE=/var/log/Cloud Index/app.log +``` + +## 完整配置示例 + +### R2 + 国内代理 + +```env +# 存储配置 +STORAGE_TYPE=r2 +ACCESS_KEY_ID=abc123xyz +SECRET_ACCESS_KEY=def456uvw +R2_ENDPOINT_URL=https://account123.r2.cloudflarestorage.com +R2_BUCKET_NAME=my-bucket +R2_REGION=auto +R2_PUBLIC_URL=https://pub-my-bucket.r2.dev +R2_PRESIGN_EXPIRES=7200 + +# 应用配置 +FLASK_ENV=production +FLASK_RUN_HOST=0.0.0.0 +FLASK_RUN_PORT=8080 +THUMB_TTL_SECONDS=7200 +``` + +### GitHub + 加速代理 + +```env +# 存储配置 +STORAGE_TYPE=github +GITHUB_REPO_OWNER=myusername +GITHUB_REPO_NAME=my-storage +GITHUB_ACCESS_TOKEN=ghp_xxxxxxxxxxxxxxxxxx +GITHUB_BRANCH=main +GITHUB_RAW_PROXY_URL=https://raw.ghproxy.com + +# 应用配置 +FLASK_ENV=production +THUMB_TTL_SECONDS=3600 +``` + +### Amazon S3 + CDN + +```env +# 存储配置 +STORAGE_TYPE=s3 +ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE +SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY +S3_BUCKET_NAME=my-bucket +S3_REGION=us-west-2 +S3_PUBLIC_URL=https://d123.cloudfront.net + +# 应用配置 +FLASK_ENV=production +FLASK_RUN_PORT=5000 +``` + +## 环境变量优先级 + +1. 系统环境变量(最高) +2. `.env` 文件变量 +3. 代码中的默认值(最低) + +## 配置验证 + +启动应用后,检查日志输出确保配置正确: + +```bash +python app.py +``` + +如果看到以下输出,说明配置成功: + +``` + * Serving Flask app 'app' + * Running on http://127.0.0.1:5000 +[INFO] Storage backend initialized: R2 +``` + +如果看到错误信息,检查: + +1. 必需的环境变量是否都已设置 +2. 凭证是否正确 +3. 网络连接是否正常 + +## 故障排除 + +### 环境变量未被读取 + +确保: + +1. `.env` 文件在项目根目录 +2. 变量名称正确(区分大小写) +3. 没有多余的空格或引号 + +### 连接存储后端失败 + +检查: + +1. 网络连接是否正常 +2. 凭证是否有效 +3. 防火墙是否阻止出站连接 +4. 存储桶是否存在 + +### 公开 URL 不可用 + +确保: + +1. 已配置公开 URL(可选) +2. 存储桶允许公开访问 +3. CDN(如有)已配置 + +## 下一步 + +- [环境变量详解](./environment.md) - 每个环境变量的详细说明 +- [部署指南](./deployment.md) - 生产环境部署 +- [存储后端指南](../storage/) - 详细的后端配置指南 diff --git a/docs/guide/docker.md b/docs/guide/docker.md new file mode 100644 index 0000000..8c855d3 --- /dev/null +++ b/docs/guide/docker.md @@ -0,0 +1,545 @@ +--- +title: Docker 部署 +createTime: 2025/11/09 00:26:55 +permalink: /guide/docker +--- +# Docker 部署 + +详细的 Docker 部署指南。 + +## 前置要求 + +- Docker 已安装([获取 Docker](https://docs.docker.com/get-docker/)) +- Docker Compose 已安装(通常随 Docker Desktop 一同安装) +- 基本的 Docker 命令行知识 + +## 快速开始 + +### 1. 构建镜像 + +```bash +git clone https://github.com/RhenCloud/Cloud-Index.git +cd Cloud Index + +# 构建镜像 +docker build -t Cloud Index:latest . +``` + +### 2. 运行容器 + +```bash +docker run -d \ + --name Cloud Index \ + -p 5000:5000 \ + -e STORAGE_TYPE=r2 \ + -e R2_ENDPOINT_URL=https://account.r2.cloudflarestorage.com \ + -e ACCESS_KEY_ID=your_key \ + -e SECRET_ACCESS_KEY=your_secret \ + -e R2_BUCKET_NAME=your_bucket \ + Cloud Index:latest +``` + +### 3. 访问应用 + +打开浏览器访问 `http://localhost:5000` + +## Docker Compose 部署 + +### 基础配置 + +创建 `docker-compose.yml`: + +```yaml +version: '3.8' + +services: + Cloud Index: + build: . + container_name: Cloud Index + ports: + - "5000:5000" + environment: + STORAGE_TYPE: r2 + R2_ENDPOINT_URL: https://account.r2.cloudflarestorage.com + R2_BUCKET_NAME: your-bucket + ACCESS_KEY_ID: your_key + SECRET_ACCESS_KEY: your_secret + FLASK_ENV: production + volumes: + - ./cache:/app/static/thumbs + restart: always +``` + +启动服务: + +```bash +docker-compose up -d +docker-compose logs -f +``` + +### 完整配置(含 Nginx) + +```yaml +version: '3.8' + +services: + app: + build: + context: . + dockerfile: Dockerfile + container_name: Cloud Index-app + environment: + STORAGE_TYPE: r2 + R2_ENDPOINT_URL: ${R2_ENDPOINT_URL} + R2_BUCKET_NAME: ${R2_BUCKET_NAME} + ACCESS_KEY_ID: ${ACCESS_KEY_ID} + SECRET_ACCESS_KEY: ${SECRET_ACCESS_KEY} + FLASK_ENV: production + THUMB_TTL_SECONDS: 86400 + volumes: + - app-cache:/app/static/thumbs + - app-logs:/app/logs + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5000/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + networks: + - r2-network + + nginx: + image: nginx:alpine + container_name: Cloud Index-nginx + ports: + - "80:80" + - "443:443" + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + - ./ssl:/etc/nginx/ssl:ro + - ./cache:/app/static/thumbs:ro + depends_on: + - app + restart: unless-stopped + networks: + - r2-network + +volumes: + app-cache: + app-logs: + +networks: + r2-network: + driver: bridge +``` + +## Dockerfile 详解 + +标准的 Dockerfile 配置: + +```dockerfile +# 使用官方 Python 运行时作为基础镜像 +FROM python:3.11-slim + +# 设置工作目录 +WORKDIR /app + +# 安装系统依赖 +RUN apt-get update && apt-get install -y \ + gcc \ + libjpeg-dev \ + zlib1g-dev \ + && rm -rf /var/lib/apt/lists/* + +# 复制依赖文件 +COPY requirements.txt . + +# 安装 Python 依赖 +RUN pip install --no-cache-dir -r requirements.txt + +# 复制应用代码 +COPY . . + +# 设置环境变量 +ENV FLASK_APP=app.py +ENV FLASK_ENV=production +ENV FLASK_RUN_HOST=0.0.0.0 + +# 暴露端口 +EXPOSE 5000 + +# 健康检查 +HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \ + CMD curl -f http://localhost:5000/ || exit 1 + +# 启动应用 +CMD ["python", "app.py"] +``` + +## 环境变量配置 + +### 方式一:直接在命令行指定 + +```bash +docker run -d \ + --name Cloud Index \ + -p 5000:5000 \ + -e STORAGE_TYPE=r2 \ + -e R2_ENDPOINT_URL=https://account.r2.cloudflarestorage.com \ + -e R2_BUCKET_NAME=my-bucket \ + -e ACCESS_KEY_ID=key123 \ + -e SECRET_ACCESS_KEY=secret456 \ + Cloud Index:latest +``` + +### 方式二:使用环境文件 + +创建 `.env.docker`: + +```env +STORAGE_TYPE=r2 +R2_ENDPOINT_URL=https://account.r2.cloudflarestorage.com +R2_BUCKET_NAME=my-bucket +ACCESS_KEY_ID=key123 +SECRET_ACCESS_KEY=secret456 +FLASK_ENV=production +THUMB_TTL_SECONDS=86400 +``` + +运行时指定: + +```bash +docker run -d \ + --name Cloud Index \ + -p 5000:5000 \ + --env-file .env.docker \ + Cloud Index:latest +``` + +### 方式三:Docker Compose 环境文件 + +创建 `.env`,`docker-compose.yml` 自动读取: + +```bash +cp .env.example .env +# 编辑 .env 文件 + +docker-compose up -d +``` + +## 数据卷管理 + +### 挂载缓存目录 + +```bash +# 本地缓存 +docker run -d \ + --name Cloud Index \ + -p 5000:5000 \ + -v $(pwd)/cache:/app/static/thumbs \ + --env-file .env.docker \ + Cloud Index:latest + +# 命名卷 +docker volume create r2-cache +docker run -d \ + --name Cloud Index \ + -p 5000:5000 \ + -v r2-cache:/app/static/thumbs \ + --env-file .env.docker \ + Cloud Index:latest +``` + +### 挂载日志目录 + +```bash +docker run -d \ + --name Cloud Index \ + -p 5000:5000 \ + -v $(pwd)/logs:/app/logs \ + -v $(pwd)/cache:/app/static/thumbs \ + --env-file .env.docker \ + Cloud Index:latest +``` + +## 网络配置 + +### 单容器模式 + +```bash +docker run -d \ + --name Cloud Index \ + -p 5000:5000 \ + --env-file .env.docker \ + Cloud Index:latest +``` + +### Docker Compose 网络 + +```yaml +networks: + r2-network: + driver: bridge +``` + +容器内相互通信: + +```yaml +services: + app: + networks: + - r2-network + nginx: + depends_on: + - app + networks: + - r2-network +``` + +访问 `http://app:5000` 时,Nginx 容器可以连接到应用容器。 + +## 常用命令 + +### 镜像操作 + +```bash +# 列出镜像 +docker images + +# 删除镜像 +docker rmi Cloud Index:latest + +# 标记镜像 +docker tag Cloud Index:v1.0 + +# 推送到仓库 +docker push myrepo/Cloud Index:v1.0 + +# 构建带标签的镜像 +docker build -t Cloud Index:v1.0 . +``` + +### 容器操作 + +```bash +# 列出运行中的容器 +docker ps + +# 列出所有容器 +docker ps -a + +# 查看容器日志 +docker logs Cloud Index +docker logs -f Cloud Index # 实时日志 +docker logs --tail 100 Cloud Index # 最后 100 行 + +# 进入容器 +docker exec -it Cloud Index bash + +# 停止容器 +docker stop Cloud Index + +# 启动容器 +docker start Cloud Index + +# 重启容器 +docker restart Cloud Index + +# 删除容器 +docker rm Cloud Index # 容器必须已停止 + +# 查看容器统计信息 +docker stats Cloud Index +``` + +### Docker Compose 操作 + +```bash +# 启动所有服务 +docker-compose up -d + +# 停止所有服务 +docker-compose down + +# 查看日志 +docker-compose logs -f + +# 查看特定服务日志 +docker-compose logs -f app + +# 重启服务 +docker-compose restart + +# 构建镜像 +docker-compose build + +# 删除卷 +docker-compose down -v +``` + +## 生产部署最佳实践 + +### 1. 使用数据卷持久化存储 + +```yaml +volumes: + app-cache: + driver: local + app-logs: + driver: local + +services: + app: + volumes: + - app-cache:/app/static/thumbs + - app-logs:/app/logs +``` + +### 2. 设置资源限制 + +```yaml +services: + app: + resources: + limits: + cpus: '1' + memory: 512M + reservations: + cpus: '0.5' + memory: 256M +``` + +### 3. 配置健康检查 + +```yaml +services: + app: + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:5000/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s +``` + +### 4. 日志驱动配置 + +```yaml +services: + app: + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" +``` + +### 5. 重启策略 + +```yaml +services: + app: + restart: unless-stopped # 推荐值 + # unless-stopped: 容器异常退出时重启,停止后不重启 + # always: 总是重启 + # on-failure: 仅在非 0 退出码时重启 + # no: 不自动重启 +``` + +## 监控和维护 + +### 查看容器资源使用 + +```bash +# 实时监控 +docker stats Cloud Index + +# 查看完整统计信息 +docker stats --no-stream Cloud Index +``` + +### 清理无用资源 + +```bash +# 清理停止的容器 +docker container prune + +# 清理无用的镜像 +docker image prune + +# 清理无用的数据卷 +docker volume prune + +# 一次性清理所有无用资源 +docker system prune -a +``` + +### 备份数据卷 + +```bash +# 备份名称为 r2-cache 的卷 +docker run --rm \ + -v r2-cache:/data \ + -v $(pwd):/backup \ + ubuntu \ + tar czf /backup/r2-cache.tar.gz -C /data . + +# 恢复 +docker run --rm \ + -v r2-cache:/data \ + -v $(pwd):/backup \ + ubuntu \ + tar xzf /backup/r2-cache.tar.gz -C /data +``` + +## 故障排除 + +### 容器无法启动 + +```bash +# 查看详细错误日志 +docker logs Cloud Index + +# 进入容器调试 +docker run -it --rm Cloud Index:latest bash +``` + +### 端口已被占用 + +```bash +# 查看占用端口的进程 +lsof -i :5000 + +# 使用其他端口 +docker run -d -p 8080:5000 Cloud Index:latest +``` + +### 卷权限问题 + +```bash +# 检查卷权限 +docker inspect r2-cache + +# 修复权限(进入容器操作) +docker exec Cloud Index chmod -R 755 /app/static/thumbs +``` + +### 内存溢出 + +```bash +# 设置内存限制 +docker run -d \ + --memory=512m \ + --memory-swap=1g \ + Cloud Index:latest + +# 清理缓存 +docker exec Cloud Index rm -rf /app/static/thumbs/* +``` + +## 参考资源 + +- [Docker 官方文档](https://docs.docker.com/) +- [Docker Compose 文件参考](https://docs.docker.com/compose/compose-file/) +- [Best practices for writing Dockerfiles](https://docs.docker.com/develop/dev-best-practices/dockerfile_best-practices/) diff --git a/docs/guide/environment.md b/docs/guide/environment.md new file mode 100644 index 0000000..24e73a0 --- /dev/null +++ b/docs/guide/environment.md @@ -0,0 +1,358 @@ +--- +title: 环境配置 +createTime: 2025/11/09 00:26:55 +permalink: /guide/environment +--- +# 环境变量完整参考 + +本文档列出了 Cloud Index 支持的所有环境变量及其详细说明。 + +## 环境变量表 + +### 核心配置 + +| 变量名 | 类型 | 必需 | 默认值 | 说明 | +|-------|------|------|-------|------| +| `STORAGE_TYPE` | string | ✅ | - | 存储后端类型:`r2`、`s3`、`github` | +| `FLASK_ENV` | string | ❌ | development | Flask 环境:`development` 或 `production` | +| `FLASK_DEBUG` | bool | ❌ | 0 | 调试模式(0 或 1) | +| `FLASK_RUN_HOST` | string | ❌ | 127.0.0.1 | 应用监听地址 | +| `FLASK_RUN_PORT` | int | ❌ | 5000 | 应用监听端口 | + +### R2 配置 + +| 变量名 | 类型 | 必需 | 说明 | +|-------|------|------|------| +| `R2_ENDPOINT_URL` | string | ✅ | R2 端点 URL(包含 Account ID) | +| `R2_BUCKET_NAME` | string | ✅ | R2 存储桶名称 | +| `R2_REGION` | string | ❌ | 区域代码,R2 通常使用 `auto` | +| `R2_PUBLIC_URL` | string | ❌ | 公开访问 URL(用于生成分享链接) | +| `R2_PRESIGN_EXPIRES` | int | ❌ | 3600 | 预签名 URL 有效期(秒) | +| `ACCESS_KEY_ID` | string | ✅ | R2 API Token ID | +| `SECRET_ACCESS_KEY` | string | ✅ | R2 API Token Secret | + +### S3 配置 + +| 变量名 | 类型 | 必需 | 说明 | +|-------|------|------|------| +| `S3_BUCKET_NAME` | string | ✅ | S3 存储桶名称 | +| `S3_REGION` | string | ✅ | AWS 区域代码(如 `us-east-1`) | +| `S3_ENDPOINT_URL` | string | ❌ | 自定义 S3 端点(默认 AWS 官方) | +| `S3_PUBLIC_URL` | string | ❌ | 公开访问 URL | +| `S3_PRESIGN_EXPIRES` | int | ❌ | 3600 | 预签名 URL 有效期(秒) | +| `ACCESS_KEY_ID` | string | ✅ | AWS Access Key ID | +| `SECRET_ACCESS_KEY` | string | ✅ | AWS Secret Access Key | + +### GitHub 配置 + +| 变量名 | 类型 | 必需 | 说明 | +|-------|------|------|------| +| `GITHUB_REPO_OWNER` | string | ✅ | GitHub 用户名或组织名 | +| `GITHUB_REPO_NAME` | string | ✅ | GitHub 仓库名称 | +| `GITHUB_ACCESS_TOKEN` | string | ✅ | GitHub Personal Access Token | +| `GITHUB_BRANCH` | string | ❌ | 使用的分支,默认 `main` | +| `GITHUB_RAW_PROXY_URL` | string | ❌ | Raw 内容代理 URL(国内加速) | +| `GITHUB_PRESIGN_EXPIRES` | int | ❌ | 3600 | 预签名 URL 有效期(秒) | + +### 缓存配置 + +| 变量名 | 类型 | 必需 | 默认值 | 说明 | +|-------|------|------|-------|------| +| `THUMB_TTL_SECONDS` | int | ❌ | 3600 | 缩略图缓存过期时间(秒) | +| `CACHE_DIR` | string | ❌ | static/thumbs | 缓存目录路径 | + +### 日志配置 + +| 变量名 | 类型 | 必需 | 默认值 | 说明 | +|-------|------|------|-------|------| +| `LOG_LEVEL` | string | ❌ | INFO | 日志级别(DEBUG/INFO/WARNING/ERROR) | +| `LOG_FILE` | string | ❌ | - | 日志文件路径 | + +## 详细说明 + +### STORAGE_TYPE + +**类型**: String +**必需**: Yes +**可选值**: + +- `r2` - Cloudflare R2 +- `s3` - Amazon S3 +- `github` - GitHub 仓库 +- `github-release` - GitHub Release(开发中) + +**示例**: + +```env +STORAGE_TYPE=r2 +``` + +### FLASK_ENV + +**类型**: String +**必需**: No +**默认**: development +**可选值**: + +- `development` - 开发模式(启用自动重载、详细错误日志) +- `production` - 生产模式(性能优化、最小化日志) + +**示例**: + +```env +FLASK_ENV=production +``` + +### FLASK_DEBUG + +**类型**: Integer (0 or 1) +**必需**: No +**默认**: 0 +**说明**: 启用 Flask 调试器和代码热加载(仅用于开发) + +**示例**: + +```env +FLASK_DEBUG=1 +``` + +⚠️ **警告**: 不要在生产环境启用调试模式! + +### FLASK_RUN_HOST + +**类型**: String +**必需**: No +**默认**: 127.0.0.1 +**说明**: 应用监听的 IP 地址 + +**常用值**: + +```env +FLASK_RUN_HOST=0.0.0.0 # 监听所有网络接口(推荐用于部署) +FLASK_RUN_HOST=127.0.0.1 # 仅本地访问(开发用) +FLASK_RUN_HOST=192.168.1.10 # 监听特定 IP +``` + +### FLASK_RUN_PORT + +**类型**: Integer +**必需**: No +**默认**: 5000 +**说明**: 应用监听的端口号 + +**示例**: + +```env +FLASK_RUN_PORT=8080 # 使用 8080 端口 +FLASK_RUN_PORT=80 # 使用 HTTP 默认端口 +``` + +### ACCESS_KEY_ID 和 SECRET_ACCESS_KEY + +**类型**: String +**必需**: Yes(对于 R2 和 S3) +**说明**: 云存储服务的 API 凭证 + +⚠️ **安全提示**: + +- ✅ 在 `.env` 文件中存储凭证 +- ✅ 将 `.env` 加入 `.gitignore` +- ❌ 不要在代码中硬编码凭证 +- ❌ 不要上传 `.env` 到 Git +- ❌ 不要在日志中打印凭证 + +**示例**: + +```env +ACCESS_KEY_ID=abc123xyz789 +SECRET_ACCESS_KEY=def456uvw789ghi +``` + +### R2_ENDPOINT_URL + +**类型**: String +**必需**: Yes(对于 R2) +**格式**: `https://.r2.cloudflarestorage.com` +**说明**: Cloudflare R2 API 端点 + +**获取方式**: 在 Cloudflare 控制面板 R2 部分查看 + +**示例**: + +```env +R2_ENDPOINT_URL=https://a1b2c3d4e5f6g7h8i.r2.cloudflarestorage.com +``` + +### R2_BUCKET_NAME + +**类型**: String +**必需**: Yes(对于 R2) +**说明**: R2 存储桶名称 + +**示例**: + +```env +R2_BUCKET_NAME=my-storage +``` + +### R2_PUBLIC_URL + +**类型**: String +**必需**: No +**说明**: R2 公开访问 URL,用于生成可分享的文件链接 + +**格式**: `https://pub-.r2.dev` + +**获取方式**: 在 Cloudflare 控制面板 R2 存储桶设置中配置自定义域 + +**示例**: + +```env +R2_PUBLIC_URL=https://pub-my-storage.r2.dev +``` + +### S3_REGION + +**类型**: String +**必需**: Yes(对于 S3) +**说明**: AWS 区域代码 + +**常用值**: + +``` +us-east-1 美国东部(N. Virginia) +us-west-2 美国西部(Oregon) +eu-west-1 欧洲(Ireland) +ap-northeast-1 亚太(Tokyo) +ap-southeast-1 亚太(Singapore) +cn-north-1 中国(北京) +``` + +**示例**: + +```env +S3_REGION=ap-northeast-1 +``` + +### GITHUB_REPO_OWNER + +**类型**: String +**必需**: Yes(对于 GitHub) +**说明**: GitHub 用户名或组织名 + +**示例**: + +```env +GITHUB_REPO_OWNER=myusername +GITHUB_REPO_OWNER=my-organization # 组织名 +``` + +### GITHUB_ACCESS_TOKEN + +**类型**: String +**必需**: Yes(对于 GitHub) +**格式**: `ghp_xxxxxxxxxxxxxxxxxxxxx` +**说明**: GitHub Personal Access Token + +⚠️ **安全提示**: Token 具有访问仓库的权限,保护好它! + +### GITHUB_RAW_PROXY_URL + +**类型**: String +**必需**: No +**说明**: GitHub Raw 文件内容的代理 URL(用于加速国内访问) + +**推荐代理服务**: + +``` +https://raw.ghproxy.com/ 国内加速(推荐) +https://ghproxy.com/ 国内加速 +https://raw.githubusercontent.com/ 官方(无代理) +``` + +**示例**: + +```env +GITHUB_RAW_PROXY_URL=https://raw.ghproxy.com +``` + +### THUMB_TTL_SECONDS + +**类型**: Integer +**必需**: No +**默认**: 3600 +**说明**: 生成的缩略图缓存过期时间(秒) + +**常用值**: + +``` +3600 1 小时 +86400 1 天 +604800 1 周 +2592000 30 天 +``` + +**示例**: + +```env +THUMB_TTL_SECONDS=86400 # 缩略图缓存 1 天 +``` + +### LOG_LEVEL + +**类型**: String +**必需**: No +**默认**: INFO +**可选值**: DEBUG, INFO, WARNING, ERROR, CRITICAL + +**示例**: + +```env +LOG_LEVEL=DEBUG # 开发环境 +LOG_LEVEL=WARNING # 生产环境 +``` + +## 快速参考 + +### 最小配置(R2) + +```env +STORAGE_TYPE=r2 +ACCESS_KEY_ID=your_key +SECRET_ACCESS_KEY=your_secret +R2_ENDPOINT_URL=https://account.r2.cloudflarestorage.com +R2_BUCKET_NAME=mybucket +``` + +### 最小配置(S3) + +```env +STORAGE_TYPE=s3 +ACCESS_KEY_ID=your_key +SECRET_ACCESS_KEY=your_secret +S3_BUCKET_NAME=mybucket +S3_REGION=us-east-1 +``` + +### 最小配置(GitHub) + +```env +STORAGE_TYPE=github +GITHUB_REPO_OWNER=myusername +GITHUB_REPO_NAME=my-storage +GITHUB_ACCESS_TOKEN=ghp_xxx +``` + +## 验证配置 + +运行以下命令验证环境变量是否正确加载: + +```bash +python -c "import os; from dotenv import load_dotenv; load_dotenv(); print('STORAGE_TYPE:', os.getenv('STORAGE_TYPE'))" +``` + +## 相关文档 + +- [配置说明](./configuration.md) - 配置指南 +- [部署指南](./deployment.md) - 生产部署 +- [存储后端指南](../storage/) - 各后端详细配置 diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md new file mode 100644 index 0000000..33777ae --- /dev/null +++ b/docs/guide/introduction.md @@ -0,0 +1,228 @@ +--- +title: 项目介绍 +createTime: 2025/11/09 00:26:55 +permalink: /guide/introduction +--- +# 项目介绍 + +## 项目概述 + +**Cloud Index** 是一个现代化的、功能完整的云存储文件管理系统。它提供了一个统一的文件浏览、管理和共享界面,支持多种云存储后端,使用户能够轻松地在不同的云存储服务之间切换。 + +## 在线演示 + +你可以在在线演示中体验 Cloud Index 的主要功能(浏览、预览、上传、下载等)。 + +- Demo 地址:[https://r2.demo.cloud-index.rhen.cloud](https://r2.demo.cloud-index.rhen.cloud)(使用Cloudflare R2作为存储后端) +- Demo 地址:[https://github.demo.cloud-index.rhen.cloud](https://github.demo.cloud-index.rhen.cloud)(使用Github Repository作为存储后端) + +### 项目特点 + +#### 1. 多后端支持 + +通过灵活的架构设计,支持多种云存储服务: + +- **Cloudflare R2** - 低成本的S3兼容对象存储 +- **Amazon S3** - 业界标准的对象存储服务 +- **GitHub Repository** - 将GitHub仓库作为存储后端 +- **GitHub Release** - 利用Release API存储文件(开发中) + +后端可以通过简单的配置进行切换,无需修改代码。 + +#### 2. 完整的文件操作功能 + +提供常见的文件管理功能: + +- 📁 目录浏览与导航 +- 📝 文件详情查看(名称、大小、修改时间等) +- ⬆️ 文件上传 +- 🗑️ 文件删除 +- ✏️ 文件/文件夹重命名 +- 📂 创建新文件夹 +- 📋 复制文件/文件夹 +- 🔄 移动文件/文件夹 + +#### 3. 智能媒体处理 + +- 🖼️ 自动生成缩略图,支持缓存 +- 👁️ 图片预览 +- 📊 文件类型识别和对应图标 +- 🎨 美观的预览界面 + +#### 4. 分享与访问 + +- 🌐 生成公共访问URL(如果存储支持) +- 🔗 预签名URL支持,具有过期时间控制 +- 📱 移动设备友好的响应式设计 +- 🌙 深色模式支持 + +#### 5. 企业级特性 + +- 🔐 环境变量配置管理 +- 📊 文件大小格式化显示 +- 🌍 国际化支持(中文/英文) +- ⚡ 高性能缓存机制 + +## 项目架构 + +### 核心组件 + +``` +Cloud-Index/ +├── app.py # Flask 应用主入口 +├── handlers/ +│ └── routes.py # 路由处理 +├── storages/ +│ ├── base.py # 存储基类 +│ ├── factory.py # 存储工厂(策略模式) +│ ├── r2.py # Cloudflare R2 实现 +│ ├── s3.py # Amazon S3 实现 +│ └── github.py # GitHub 存储实现 +├── templates/ # HTML 模板 +│ ├── base.html # 基础模板 +│ ├── index.html # 主页面 +│ └── footer.html # 页脚 +└── static/ # 静态资源 + ├── css/ # 样式表 + ├── js/ # JavaScript 文件 + └── thumbs/ # 缩略图缓存 +``` + +### 架构模式 + +1. **工厂模式** - `StorageFactory` 负责根据配置创建相应的存储实现 +2. **策略模式** - 不同的存储后端实现相同的 `BaseStorage` 接口 +3. **MVC模式** - 使用 Flask 框架实现标准的 MVC 架构 + +## 技术栈 + +| 组件 | 技术 | 说明 | +|-----|------|------| +| **后端框架** | Flask | 轻量级 Python Web 框架 | +| **前端** | HTML5/CSS3/JS | 原生 Web 技术 | +| **对象存储** | AWS S3 SDK | boto3 库 | +| **文件处理** | Pillow | 图片处理库 | +| **API调用** | requests | HTTP 库 | +| **部署** | Docker/Vercel | 容器化和Serverless部署 | + +## 工作流程 + +### 文件浏览流程 + +``` +用户请求 + ↓ +Flask 路由处理 + ↓ +存储工厂获取对应后端 + ↓ +执行存储操作(list/get/delete等) + ↓ +模板渲染 + ↓ +返回给用户 +``` + +### 文件上传流程 + +``` +用户上传文件 + ↓ +Flask 接收请求 + ↓ +验证文件 + ↓ +调用存储后端上传 + ↓ +返回结果 +``` + +### 缩略图生成流程 + +``` +请求图片缩略图 + ↓ +检查缓存 + ↓ +缓存命中? → 返回缓存 + ↓ 否 +获取原始文件 + ↓ +使用 Pillow 生成缩略图 + ↓ +保存到本地缓存 + ↓ +返回缩略图 +``` + +## 存储后端选择指南 + +### Cloudflare R2 + +**最佳用途**: 低成本、小企业、边缘计算优先 + +- 💰 价格最低(存储费用免费,仅收取请求费) +- 🚀 全球 CDN 加速 +- 🔄 S3 API 兼容 +- 适合: 静态资源、备份、媒体库 + +### Amazon S3 + +**最佳用途**: 大企业、高可用性、完整生态 + +- 📊 功能最完整 +- 🔒 安全性最高 +- 🌍 全球可用 +- 💼 企业级支持 +- 适合: 生产环境、大规模应用、合规要求高 + +### GitHub Repository + +**最佳用途**: 轻量级、免费、版本控制 + +- 🆓 完全免费(利用GitHub存储) +- 📝 自动版本控制 +- 🔐 访问权限管理 +- 易于备份和迁移 +- 适合: 文档、配置文件、小文件、开源项目 + +## 性能指标 + +- **文件列表响应** < 100ms(本地缓存) +- **缩略图生成** 平均 50-200ms(取决于图片大小) +- **文件上传** 无限制(取决于网络) +- **并发连接** 支持数百并发请求 +- **缓存有效期** 可配置(默认1小时) + +## 与其他解决方案对比 + +| 特性 | Cloud Index | Nextcloud | MinIO | S3 Web UI | +|-----|---------|----------|-------|-----------| +| 多后端支持 | ✅ | ❌ | ❌ | ❌ | +| 易部署 | ✅ | ❌ | ⚠️ | ❌ | +| 低成本 | ✅ | ❌ | ⚠️ | ❌ | +| 功能完整度 | ✅ | ✅✅ | ✅ | ⚠️ | +| 学习曲线 | 低 | 高 | 中 | 低 | + +## 未来规划 + +- [ ] GitHub Release 存储支持 +- [ ] 基于数据库的用户权限管理 +- [ ] 操作日志记录与审计 +- [ ] Office 文档预览支持 +- [ ] 视频预览支持 +- [ ] 文件夹打包下载 +- [ ] API 文档完善 +- [ ] WebDAV 支持 +- [ ] 搜索功能增强 +- [ ] 分享链接和权限管理 + +## 许可证 + +GPLv3 License - 详见项目根目录的 LICENSE 文件 + +## 相关链接 + +- 📖 [GitHub 仓库](https://github.com/RhenCloud/Cloud-Index>) +- 🐛 [问题报告](https://github.com/RhenCloud/Cloud-Index/issues>) +- 💬 [讨论区](https://github.com/RhenCloud/Cloud-Index/discussions>) diff --git a/docs/guide/quickstart.md b/docs/guide/quickstart.md new file mode 100644 index 0000000..cd61bc2 --- /dev/null +++ b/docs/guide/quickstart.md @@ -0,0 +1,259 @@ +--- +title: 快速开始 +createTime: 2025/11/09 00:26:55 +permalink: /guide/quickstart +--- +# 快速开始 + +本指南将帮助你快速上手 Cloud Index。 + +## 5 分钟快速开始 + +### 第 1 步:启动应用 + +安装完成后,启动应用: + +```bash +python app.py +``` + +你会看到类似的输出: + +``` + * Serving Flask app 'app' + * Debug mode: off + * Running on http://127.0.0.1:5000 +``` + +### 第 2 步:打开浏览器 + +访问 `http://localhost:5000`,你会看到文件管理界面。 + +### 第 3 步:浏览文件 + +主界面显示存储桶/仓库中的文件和文件夹: + +- 📁 **文件夹** - 点击打开,浏览子文件夹 +- 📄 **文件** - 点击查看详情或下载 +- 🖼️ **图片** - 点击查看预览和缩略图 + +## 基本操作 + +### 文件浏览 + +| 操作 | 说明 | +|-----|------| +| **点击文件夹** | 打开文件夹,查看内容 | +| **点击文件名** | 查看文件详情 | +| **右键菜单** | 显示更多操作选项 | + +### 文件信息 + +每个文件显示以下信息: + +- 📝 **文件名** - 文件的完整名称 +- 📏 **大小** - 文件大小(自动格式化为 B/KB/MB/GB) +- 📅 **修改时间** - 最后修改时间 +- 🏷️ **文件类型** - 文件对应的图标 + +### 操作菜单 + +点击文件右侧的菜单按钮(⋮)或右键点击文件,获得以下选项: + +**如果是文件:** + +- 📥 **下载** - 下载文件到本地 +- 🔗 **复制链接** - 复制文件的公开访问链接 +- 🗑️ **删除** - 删除文件 +- ✏️ **重命名** - 重命名文件 + +**如果是文件夹:** + +- 📂 **新建文件夹** - 在当前文件夹创建子文件夹 +- ⬆️ **上传文件** - 上传文件到当前文件夹 +- ✏️ **重命名** - 重命名文件夹 +- 🗑️ **删除** - 删除整个文件夹(包含子文件) + +## 常见任务 + +### 上传文件 + +#### 使用 UI 上传 + +1. 点击"上传文件"按钮 +2. 选择要上传的文件 +3. 点击"确认" +4. 等待上传完成 + +#### 通过拖拽上传 + +1. 将文件拖到浏览器窗口 +2. 选择目标文件夹 +3. 放下鼠标,上传开始 + +### 下载文件 + +#### 单个文件下载 + +1. 点击文件 +2. 点击菜单中的"下载" +3. 文件保存到下载文件夹 + +#### 复制公开链接 + +1. 点击文件菜单 +2. 选择"复制链接" +3. 粘贴链接分享给他人 + +### 创建文件夹 + +1. 在目标位置点击"新建文件夹" +2. 输入文件夹名称 +3. 确认创建 + +### 移动/复制文件 + +1. 右键点击文件/文件夹 +2. 选择"剪切"或"复制" +3. 导航到目标文件夹 +4. 右键选择"粘贴" + +### 删除文件/文件夹 + +1. 右键点击文件/文件夹 +2. 选择"删除" +3. 确认删除 + +**⚠️ 注意**: 删除操作不可撤销,请谨慎操作。 + +## 图片预览 + +Cloud Index 对图片文件提供了特殊支持: + +- 🖼️ **缩略图显示** - 列表中显示图片缩略图 +- 👁️ **图片预览** - 点击图片查看全尺寸预览 +- ⚡ **缓存加速** - 缩略图被缓存以加快加载速度 +- 📐 **自适应大小** - 根据屏幕尺寸自动调整 + +## 深色模式 + +Cloud Index 支持深色模式,点击右上角的主题按钮 🌙/☀️ 切换: + +- 🌙 **深色模式** - 适合低光环境,保护眼睛 +- ☀️ **浅色模式** - 经典亮色主题 + +## 响应式设计 + +应用在所有设备上都能正常使用: + +| 设备 | 特性 | +|-----|------| +| **桌面** | 完整的侧边栏和功能菜单 | +| **平板** | 自适应布局,触屏友好 | +| **手机** | 简化菜单,优化触屏交互 | + +## 键盘快捷键 + +| 快捷键 | 功能 | +|-------|------| +| `Ctrl/Cmd + U` | 上传文件 | +| `Ctrl/Cmd + N` | 新建文件夹 | +| `Delete` | 删除选中项 | +| `Escape` | 关闭弹窗 | + +## 性能提示 + +### 加快加载速度 + +1. **使用缓存** - 缩略图被自动缓存 +2. **减少文件数** - 大文件夹可能加载较慢 +3. **选择快速网络** - 使用稳定的网络连接 +4. **启用 CDN** - 为存储配置 CDN 加速(如 Cloudflare) + +### 上传大文件 + +对于超过 100MB 的文件: + +1. 使用有线网络而不是 WiFi +2. 避免在高峰期上传 +3. 确保足够的磁盘空间 +4. 完成后验证文件完整性 + +## 设置和配置 + +### 环境变量设置 + +编辑 `.env` 文件配置: + +```env +# 选择存储后端 +STORAGE_TYPE=r2 # 或 s3, github + +# 存储凭证 +ACCESS_KEY_ID=your_key +SECRET_ACCESS_KEY=your_secret + +# 缩略图缓存时间 +THUMB_TTL_SECONDS=3600 +``` + +详见 [环境变量配置](./environment.md) + +### 存储后端切换 + +修改 `STORAGE_TYPE` 环境变量即可切换存储后端,无需修改代码: + +```bash +# 使用 Cloudflare R2 +STORAGE_TYPE=r2 + +# 或使用 Amazon S3 +STORAGE_TYPE=s3 + +# 或使用 GitHub 仓库 +STORAGE_TYPE=github +``` + +重启应用生效: + +```bash +# 关闭当前应用 (Ctrl+C) +# 重新启动 +python app.py +``` + +## 故障排除 + +### 文件显示不完整 + +- 检查存储配置是否正确 +- 验证访问凭证是否有效 +- 查看浏览器控制台是否有错误信息 + +### 上传失败 + +- 检查文件大小是否超过限制 +- 确保网络连接稳定 +- 验证存储空间是否充足 + +### 缩略图不显示 + +- 刷新页面重试 +- 检查 `static/thumbs/` 文件夹权限 +- 确保图片格式受支持(JPG, PNG, GIF, WebP) + +## 下一步 + +- 📖 [配置说明](./configuration.md) - 了解高级配置 +- 🚀 [部署指南](./deployment.md) - 在生产环境部署 +- 💾 [存储后端配置](../storage/) - 配置不同的存储后端 + +## 获取帮助 + +遇到问题? + +- 📖 查看 [完整文档](./introduction.md) +- 🐛 提交 [Issue](https://github.com/RhenCloud/Cloud-Index/issues>) +- 💬 在 [讨论区](https://github.com/RhenCloud/Cloud-Index/discussions>) 提问 + +祝你使用愉快!🎉 diff --git a/docs/guide/vercel.md b/docs/guide/vercel.md new file mode 100644 index 0000000..2641054 --- /dev/null +++ b/docs/guide/vercel.md @@ -0,0 +1,382 @@ +--- +title: Vercel 部署 +createTime: 2025/11/09 00:26:55 +permalink: /guide/vercel +--- +# Vercel 部署 + +在 Vercel 上快速部署 Cloud Index 的完整指南。 + +## 优势 + +- ✅ 零配置部署 +- ✅ 自动 HTTPS +- ✅ 全球 CDN 加速 +- ✅ 自动扩展 +- ✅ 免费额度充足 +- ✅ 与 GitHub 无缝集成 + +## 前置要求 + +- GitHub 账户 +- Vercel 账户([注册免费账户](https://vercel.com/signup)) +- 存储后端配置(R2、S3 或 GitHub) + +## 部署步骤 + +### 第 1 步:Fork 项目 + +访问 [Cloud Index GitHub 仓库](https://github.com/RhenCloud/Cloud-Index),点击 "Fork" 按钮。 + +### 第 2 步:连接到 Vercel + +1. 登录 [Vercel 控制台](https://vercel.com/dashboard) +2. 点击 "Add New..." → "Project" +3. 点击 "Import Git Repository" +4. 连接 GitHub 账户 +5. 选择你 Fork 的仓库 + +### 第 3 步:配置项目 + +在 Import 页面: + +1. **Project Name** - 输入项目名称(如 `cloud-index`) +2. **Framework** - 选择 "Python" 或保持默认 +3. **Root Directory** - 保持默认(根目录) + +### 第 4 步:配置环境变量 + +点击 "Environment Variables",添加以下变量: + +**基础配置:** + +``` +STORAGE_TYPE = r2 +``` + +**R2 存储配置:** + +``` +R2_ENDPOINT_URL = https://your-account-id.r2.cloudflarestorage.com +R2_BUCKET_NAME = your-bucket-name +ACCESS_KEY_ID = your_access_key +SECRET_ACCESS_KEY = your_secret_key +R2_PUBLIC_URL = https://pub-your-bucket.r2.dev +``` + +或 **S3 存储配置:** + +``` +STORAGE_TYPE = s3 +S3_BUCKET_NAME = your-bucket-name +S3_REGION = us-east-1 +ACCESS_KEY_ID = your_access_key +SECRET_ACCESS_KEY = your_secret_key +``` + +或 **GitHub 存储配置:** + +``` +STORAGE_TYPE = github +GITHUB_REPO_OWNER = your-username +GITHUB_REPO_NAME = your-repo-name +GITHUB_ACCESS_TOKEN = your_github_token +GITHUB_RAW_PROXY_URL = https://raw.ghproxy.com +``` + +**应用配置:** + +``` +FLASK_ENV = production +THUMB_TTL_SECONDS = 604800 +``` + +### 第 5 步:部署 + +1. 检查配置无误 +2. 点击 "Deploy" 按钮 +3. 等待部署完成 + +部署完成后,Vercel 会提供一个 URL(如 `https://cloud-index.vercel.app`) + +## 配置自定义域名 + +### 1. 添加域名 + +1. 进入项目设置 → "Domains" +2. 输入你的域名(如 `cloud.example.com`) +3. 点击 "Add" + +### 2. 配置 DNS + +Vercel 会提供 DNS 记录,按照说明在你的域名提供商处配置: + +- **CNAME** 记录指向 Vercel +- 或使用 **A** 记录指向 Vercel IP + +### 3. 验证和启用 + +DNS 生效后(通常需要几分钟到几小时),Vercel 会自动验证并启用 HTTPS。 + +## 自动部署 + +当你推送代码到 GitHub 时,Vercel 会自动部署新版本。 + +### 触发部署 + +提交代码到 main 分支: + +```bash +git add . +git commit -m "Update configuration" +git push origin main +``` + +Vercel 会自动开始部署。你可以在 Vercel Dashboard 中查看部署进度。 + +## 更新配置 + +### 方式一:通过 Vercel Dashboard + +1. 进入项目设置 +2. 选择 "Environment Variables" +3. 编辑相应变量 +4. 需要重新部署时,点击 Redeploy + +### 方式二:通过代码 + +在项目根目录创建 `vercel.json` 文件(已包含): + +```json +{ + "version": 2, + "builds": [ + { + "src": "app.py", + "use": "@vercel/python" + }, + { + "src": "/static/**", + "use": "@vercel/static" + } + ], + "routes": [ + { + "src": "/(.*)", + "dest": "app.py" + } + ] +} +``` + +编辑后推送到 GitHub,Vercel 会自动重新部署。 + +## 日志查看 + +### 查看部署日志 + +1. 进入项目 +2. 点击 "Deployments" 选项卡 +3. 选择相应的部署 +4. 查看 "Logs" 中的详细信息 + +### 查看实时日志 + +1. 进入项目 +2. 点击 "Functions" 选项卡 +3. 选择 `app.py` +4. 查看实时日志 + +### 使用 Vercel CLI + +```bash +# 安装 CLI +npm i -g vercel + +# 登录 +vercel login + +# 查看日志 +vercel logs + +# 实时日志 +vercel logs --follow +``` + +## 性能优化 + +### 1. 启用 Edge Caching + +在 `vercel.json` 中配置缓存头: + +```json +"routes": [ + { + "src": "/static/(.*)", + "headers": { + "cache-control": "public, max-age=86400, immutable" + }, + "dest": "app.py" + }, + { + "src": "/(.*)", + "dest": "app.py" + } +] +``` + +### 2. 优化缓存设置 + +增大缩略图缓存时间(在 Environment Variables): + +``` +THUMB_TTL_SECONDS = 2592000 # 30 天 +``` + +### 3. 使用 Vercel Analytics + +1. 进入项目设置 +2. 选择 "Analytics" +3. 启用 Vercel Analytics + +可以实时监控应用性能和用户行为。 + +## 监控和告警 + +### Vercel Monitoring + +在项目设置中配置告警: + +1. 进入项目 → "Settings" → "Notifications" +2. 设置部署失败时的通知 +3. 选择通知方式(Email、Slack 等) + +### 错误追踪 + +Vercel 自动集成错误追踪。通过以下方式查看: + +1. 进入 "Functions" 选项卡 +2. 查看错误率和详细错误信息 + +## 限制和配额 + +### 计算 + +- **免费版**: 100GB-Hours/月 +- 每次冷启动 < 10 秒 +- 单个函数最大执行时间 900 秒 + +### 存储 + +- **缓存**: 512MB(临时) +- **函数空间**: 50MB 代码 + +### 带宽 + +- **免费版**: 100GB/月 + +### 费用估算 + +假设月均 1 万次请求,每次执行 500ms: + +- 计算: 5,000 秒 / 1,000 = 5GB-Hours(远低于 100GB 免费额度) +- **预计费用**: 免费 ✅ + +## 故障排除 + +### 部署失败 + +检查: + +1. `vercel.json` 配置是否正确 +2. `requirements.txt` 是否包含所有依赖 +3. Python 版本是否兼容(推荐 3.9+) + +### 环境变量未生效 + +1. 确保在 Environment Variables 中正确配置 +2. 重新部署应用(Redeploy) +3. 清理浏览器缓存 + +### 冷启动慢 + +- Vercel 自动缓存函数以加速启动 +- 增加使用频率会自动改善冷启动时间 +- 无需手动优化 + +### 存储无法连接 + +检查: + +1. 环境变量是否正确 +2. 凭证是否有效 +3. 防火墙/安全组是否允许访问 + +### 缓存空间不足 + +清理或减少缓存: + +1. 减小缩略图生成质量 +2. 减少缓存过期时间 +3. 定期手动清理 + +## 成本优化建议 + +1. **使用 Cloudflare R2** 而不是 S3(成本更低) +2. **启用缓存** 减少存储访问次数 +3. **监控使用量** 避免超限 +4. **使用付费计划** 如果超过免费额度($20/月 Pro 计划) + +## 与本地开发保持同步 + +### 拉取最新变化 + +```bash +git pull origin main +``` + +### 测试本地更改 + +```bash +python app.py +# 访问 http://localhost:5000 +``` + +### 推送到 Vercel + +```bash +git add . +git commit -m "Bug fix or feature" +git push origin main +``` + +Vercel 会自动检测并部署。 + +## 回滚部署 + +如果新部署出现问题: + +1. 进入项目 → "Deployments" +2. 选择之前的稳定版本 +3. 点击 "Redeploy to Production" + +应用会立即回滚到之前的版本。 + +## 获取帮助 + +- 📖 [Vercel 文档](https://vercel.com/docs) +- 🐛 [提交 Issue](https://github.com/RhenCloud/Cloud-Index/issues>) +- 💬 [讨论区](https://github.com/RhenCloud/Cloud-Index/discussions>) +- 📧 Email: + +## 总结 + +| 功能 | 本地 | Docker | Vercel | +|-----|------|--------|--------| +| 部署难度 | 简单 | 中等 | 简单 | +| 成本 | 自有服务器 | 中等 | 小 | +| 性能 | 取决于服务器 | 好 | 优秀 | +| 扩展性 | 有限 | 中等 | 自动 | +| 推荐用途 | 开发测试 | 生产环境 | 中小型应用 | + +Vercel 最适合需要快速部署、无需运维的应用!🚀 diff --git a/docs/storage/github.md b/docs/storage/github.md new file mode 100644 index 0000000..7426702 --- /dev/null +++ b/docs/storage/github.md @@ -0,0 +1,516 @@ +--- +title: GitHub +createTime: 2025/11/09 00:26:55 +permalink: /storage/github +--- +# GitHub 存储配置指南 + +使用 GitHub 仓库作为存储后端的详细配置。 + +## 概述 + +GitHub 存储是一个创新的免费存储方案,利用 GitHub 仓库来存储文件: + +- 💚 完全免费(通过 GitHub) +- 📝 自动版本控制 +- 🔐 私密仓库支持 +- 🌍 全球访问 +- 📦 便于备份和迁移 + +## 为什么选择 GitHub 存储? + +### 优势 + +1. **完全免费** - 无需付费,利用 GitHub 存储空间 +2. **自动版本控制** - 所有文件自动保存版本历史 +3. **内置权限管理** - 利用 GitHub 的访问权限系统 +4. **易于备份** - 通过 Git 可以轻松备份和迁移 +5. **开发者友好** - 与 Git 工作流完美集成 + +### 限制 + +- 仓库大小建议不超过 1GB +- 文件大小建议不超过 100MB +- 不适合大规模二进制文件存储 + +### 推荐用途 + +- 📄 文档和文本文件 +- 🖼️ 博客和网站图片 +- 🔧 配置文件 +- 📋 CSV 数据文件 +- 🎯 开源项目资源 + +## 账户设置 + +### 1. 创建 GitHub 账户 + +如果还没有 GitHub 账户,访问 [GitHub](https://github.com/signup) 创建一个免费账户。 + +### 2. 创建仓库 + +1. 登录 GitHub +2. 点击 "+" 图标 → "New repository" +3. 输入仓库名称(例如 `my-storage`) +4. 选择 "Private"(私密)或 "Public"(公开) +5. **不要** 初始化 README +6. 点击 "Create repository" + +## 生成 Personal Access Token + +### 1. 创建 Token + +1. 登录 GitHub +2. 进入 Settings → Developer settings → Personal access tokens +3. 点击 "Generate new token"(选择 "Tokens (classic)") +4. 输入 Token 名称(例如 `cloud-index`) +5. 选择过期时间(推荐 "90 days" 或 "No expiration") + +### 2. 设置权限 + +选择以下权限: + +- ✅ **repo** - 完整控制私有仓库(包括所有子权限) +- ✅ **workflow** - 更新 GitHub Action 工作流 +- ❌ 其他权限保持未勾选 + +### 3. 生成并复制 Token + +1. 点击 "Generate token" +2. **立即复制 Token**(只显示一次) +3. 保存到安全位置 + +⚠️ **重要**: 不要分享你的 Token! + +## 配置环境变量 + +编辑 `.env` 文件: + +```env +# 存储类型 +STORAGE_TYPE=github + +# GitHub 账户信息 +GITHUB_REPO_OWNER=your-username +GITHUB_REPO_NAME=my-storage +GITHUB_ACCESS_TOKEN=ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + +# 可选:使用的分支 +GITHUB_BRANCH=main + +# 可选:GitHub Raw 内容代理(用于加速国内访问) +GITHUB_RAW_PROXY_URL=https://raw.ghproxy.com + +# 可选:预签名 URL 过期时间(秒) +GITHUB_PRESIGN_EXPIRES=3600 +``` + +**配置说明:** + +- `GITHUB_REPO_OWNER`: 你的 GitHub 用户名 +- `GITHUB_REPO_NAME`: 创建的仓库名称 +- `GITHUB_ACCESS_TOKEN`: 生成的 Personal Access Token +- `GITHUB_BRANCH`: 默认 `main`(仓库主分支) +- `GITHUB_RAW_PROXY_URL`: 可选,用于加速访问 + +## 国内加速代理配置 + +由于 GitHub 在国内访问速度较慢,推荐使用代理加速: + +### 推荐代理服务 + +```env +# GitHub 官方(无加速) +GITHUB_RAW_PROXY_URL= + +# ghproxy.com - 国内加速(推荐) +GITHUB_RAW_PROXY_URL=https://raw.ghproxy.com + +# ghproxy.net - 国内加速 +GITHUB_RAW_PROXY_URL=https://ghproxy.net + +# 其他代理服务 +GITHUB_RAW_PROXY_URL=https://raw.fastgit.org +``` + +## 初始化仓库 + +首次使用时,需要初始化仓库(可选但推荐): + +```bash +# 克隆空仓库 +git clone https://github.com/your-username/my-storage.git +cd my-storage + +# 创建初始文件 +echo "# 存储仓库" > README.md +git add README.md +git commit -m "Initial commit" +git push -u origin main + +# 返回 Cloud Index 目录 +cd ../cloud-index +``` + +## 测试连接 + +### 方式一:启动应用测试 + +```bash +python app.py +``` + +访问 `http://localhost:5000`,查看是否能正常显示文件列表。 + +### 方式二:使用 CLI 测试 + +```bash +# 测试 Token 是否有效 +curl -H "Authorization: token ghp_xxx" \ + https://api.github.com/repos/your-username/my-storage + +# 应该返回仓库信息 +``` + +### 方式三:Python 测试 + +```python +import requests + +token = "ghp_xxx" +repo_owner = "your-username" +repo_name = "my-storage" + +headers = { + "Authorization": f"token {token}", + "Accept": "application/vnd.github.v3+json" +} + +url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/contents" +response = requests.get(url, headers=headers) + +if response.status_code == 200: + print("连接成功!") + print("仓库文件:") + for item in response.json(): + print(f" - {item['name']} ({item['type']})") +else: + print(f"连接失败!错误代码:{response.status_code}") +``` + +## 管理仓库 + +### 通过 Cloud Index 管理 + +应用提供完整的文件管理功能: + +- 📁 浏览文件和文件夹 +- ⬆️ 上传文件 +- 🗑️ 删除文件 +- ✏️ 重命名文件 +- 📂 创建新文件夹 + +### 通过 GitHub Web 管理 + +1. 访问你的仓库主页 +2. 点击 "Add file" → "Upload files" +3. 选择要上传的文件 +4. 点击 "Commit changes" + +### 通过 Git 命令行管理 + +```bash +# 克隆仓库 +git clone https://github.com/your-username/my-storage.git +cd my-storage + +# 添加文件 +cp /path/to/file . + +# 提交更改 +git add . +git commit -m "Add new files" +git push + +# 删除文件 +git rm filename +git commit -m "Remove file" +git push + +# 查看历史 +git log +``` + +## 启用版本控制特性 + +### 查看文件历史 + +1. 在 GitHub Web 上打开文件 +2. 点击 "History" +3. 查看所有历史版本 + +### 恢复旧版本文件 + +```bash +# 查看文件历史 +git log -- filename + +# 恢复到特定版本 +git checkout -- filename + +# 提交恢复 +git commit -m "Restore filename to previous version" +git push +``` + +### 标记发布版本 + +```bash +# 创建标签 +git tag -a v1.0 -m "Release version 1.0" +git push origin v1.0 + +# 查看所有标签 +git tag -l +``` + +## 生成公开访问 URL + +### Raw 文件 URL + +文件会自动通过 Raw GitHub URL 访问: + +``` +# 官方 URL(国外快) +https://raw.githubusercontent.com/your-username/my-storage/main/path/to/file + +# 使用代理加速(国内快) +https://raw.ghproxy.com/https://raw.githubusercontent.com/your-username/my-storage/main/path/to/file +``` + +### 在应用中生成 + +在 Cloud Index 应用中: + +1. 点击文件 +2. 选择 "复制链接" +3. 分享链接给他人 + +## 最佳实践 + +### 1. 安全性 + +- ✅ 使用 Personal Access Token 而非用户密码 +- ✅ 定期轮换 Token +- ✅ 为 Token 设置过期时间 +- ✅ 不要分享 Token +- ✅ 使用私密仓库存储敏感信息 +- ✅ 不要在公开仓库存储个人数据 + +### 2. 性能优化 + +- ✅ 使用国内代理加速(如 ghproxy) +- ✅ 定期清理不需要的文件 +- ✅ 合理组织文件结构 +- ✅ 使用分支管理大型项目 + +### 3. 仓库管理 + +- ✅ 保持仓库大小 < 1GB +- ✅ 每个文件 < 100MB +- ✅ 定期清理历史版本 +- ✅ 使用 `.gitignore` 排除不需要的文件 + +### 4. 备份 + +- ✅ 定期备份重要文件 +- ✅ 使用 Git 本地备份 +- ✅ 定期推送到其他服务(如 GitLab) + +## 高级配置 + +### 使用 GitHub Actions 自动化 + +可以创建自动化工作流(可选): + +```yaml +# .github/workflows/backup.yml +name: Daily Backup + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + backup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Backup + run: | + # 你的备份脚本 + echo "Backup completed" +``` + +### 使用分支隔离环境 + +为不同环境使用不同分支: + +```bash +# 创建开发分支 +git checkout -b develop +git push -u origin develop + +# 创建生产分支 +git checkout -b production +git push -u origin production +``` + +## 文件大小限制处理 + +如果遇到文件过大(> 100MB): + +### 使用 Git LFS + +```bash +# 安装 Git LFS +git lfs install + +# 追踪大文件 +git lfs track "*.psd" +git add .gitattributes + +# 提交文件 +git add large-file.psd +git commit -m "Add large file" +git push +``` + +### 分割文件 + +```bash +# 分割大文件 +split -b 50M large-file.zip large-file.zip.part_ + +# 上传分割后的文件 +git add large-file.zip.part_* +git commit -m "Add split files" +git push + +# 恢复时合并 +cat large-file.zip.part_* > large-file.zip +``` + +## 常见问题 + +### Q: 如何更新 Token? + +**A:** + +1. 生成新 Token +2. 更新 `.env` 文件中的 `GITHUB_ACCESS_TOKEN` +3. 重启应用 + +### Q: Token 过期了怎么办? + +**A:** + +1. 进入 GitHub Settings +2. 重新生成 Token +3. 更新应用配置 + +### Q: 可以在组织中使用吗? + +**A:** 可以,配置仓库的所有者为组织名即可: + +```env +GITHUB_REPO_OWNER=my-organization +``` + +### Q: 仓库大小有限制吗? + +**A:** GitHub 建议仓库不超过 1GB。如果超过: + +1. 清理不需要的历史版本 +2. 使用 Git LFS +3. 分割仓库 + +### Q: 可以在多个应用中使用同一仓库吗? + +**A:** 可以,但需要注意并发冲突。建议: + +1. 为每个环境创建不同的仓库 +2. 使用分支隔离 +3. 定期同步 + +## 故障排除 + +### 连接失败 + +检查: + +1. Token 是否正确 +2. 仓库名称是否正确 +3. 用户名是否正确 +4. 网络连接是否正常 +5. Token 是否过期 + +### Token 无效 + +解决方案: + +1. 重新生成 Token +2. 确保有 `repo` 权限 +3. 检查 Token 是否过期 + +### 文件无法访问 + +检查: + +1. 仓库是否存在 +2. 文件是否已提交 +3. 是否使用了正确的分支 +4. 代理 URL 是否正确 + +### 上传缓慢 + +优化方案: + +1. 配置国内代理 +2. 分割大文件 +3. 检查网络连接 +4. 考虑使用其他存储后端 + +## 与其他存储的对比 + +| 特性 | GitHub | R2 | S3 | +|-----|--------|-----|-----| +| 成本 | 免费 | $0.36/百万请求 | $2-3/GB | +| 文件大小限制 | 100MB | 无限 | 5TB | +| 仓库大小限制 | 1GB | 无限 | 无限 | +| 版本控制 | ✅ | ❌ | ⚠️ | +| 适合大文件 | ❌ | ✅ | ✅ | + +## 成本示例 + +月均使用情况: + +| 指标 | 数值 | 费用 | +|-----|------|------| +| 存储 | 500MB | 免费 | +| 请求 | 10K | 免费 | +| 流量 | 1GB | 免费 | +| **总计** | - | **完全免费** ✅ | + +## 获取帮助 + +- 📖 [GitHub API 文档](https://docs.github.com/en/rest) +- 📖 [GitHub 仓库管理指南](https://docs.github.com/en/repositories) +- 🐛 [提交 Issue](https://github.com/RhenCloud/Cloud-Index/issues) +- 💬 [讨论区](https://github.com/RhenCloud/Cloud-Index/discussions) + +## 下一步 + +- 🚀 [快速开始](../guide/quickstart.md) - 开始使用应用 +- 📖 [存储后端对比](./overview.md) - 对比其他服务 +- 💾 [Cloudflare R2 配置](./r2.md) - R2 配置指南 diff --git a/docs/storage/overview.md b/docs/storage/overview.md new file mode 100644 index 0000000..4eb097e --- /dev/null +++ b/docs/storage/overview.md @@ -0,0 +1,239 @@ +--- +title: 后端概览 +createTime: 2025/11/09 00:26:55 +permalink: /storage/overview +--- +# 存储后端概览 + +Cloud Index 支持多个存储后端,可根据需求选择合适的服务。 + +## 后端对比 + +| 特性 | Cloudflare R2 | Amazon S3 | GitHub Repository | +|-----|------------|----------|------------------| +| **定价模式** | 流量免费 + 请求费 | 流量费 + 请求费 + 存储费 | 免费(通过 GitHub) | +| **价格水平** | 💚 最低 | 💛 中等 | 💚 免费 | +| **全球覆盖** | ✅ 全球 CDN | ✅ 全球 CDN | ✅ CDN 加速可选 | +| **易用性** | ✅ 简单 | ⚠️ 中等 | ✅ 简单 | +| **可扩展性** | ✅ 无限制 | ✅ 无限制 | ⚠️ 仓库大小限制(1GB) | +| **性能** | 🚀 优秀 | 🚀 优秀 | 🚀 优秀(配合 CDN) | +| **版本控制** | ❌ 无 | ❌ 无 | ✅ 自动 Git 历史 | +| **适用场景** | 个人/小团队 | 企业 | 开源/文档 | + +## 快速选择指南 + +### 选择 Cloudflare R2 + +**如果你需要:** + +- ✅ 最低成本 +- ✅ 快速启动 +- ✅ 全球加速 +- ✅ 简单配置 + +**推荐用途:** + +- 个人云盘 +- 小团队文件存储 +- 媒体文件托管 +- 备份存储 + +**成本估算(月均):** + +- 1GB 存储 + 1 万请求 = $0.001 左右(极低) + +### 选择 Amazon S3 + +**如果你需要:** + +- ✅ 完整功能 +- ✅ 企业级服务 +- ✅ 高可靠性 +- ✅ 专业支持 + +**推荐用途:** + +- 企业级应用 +- 生产环境存储 +- 大规模数据存储 +- 需要合规性的应用 + +**成本估算(月均):** + +- 1GB 存储 + 1 万请求 = $0.023 左右(按需计费) + +### 选择 GitHub Repository + +**如果你需要:** + +- ✅ 完全免费 +- ✅ 版本控制 +- ✅ 简单易用 +- ✅ 便于备份 + +**推荐用途:** + +- 文档存储 +- 配置文件 +- 小文件共享 +- 开源项目资源 +- 博客图片 + +**成本估算:** + +- 完全免费 ✅ + +## 功能特性对比 + +### 文件操作 + +| 操作 | R2 | S3 | GitHub | +|-----|-----|-----|---------| +| 上传 | ✅ | ✅ | ✅ | +| 下载 | ✅ | ✅ | ✅ | +| 删除 | ✅ | ✅ | ✅ | +| 列表 | ✅ | ✅ | ✅ | +| 重命名 | ✅ | ✅ | ✅ | +| 复制 | ✅ | ✅ | ⚠️ (需支持) | +| 移动 | ✅ | ✅ | ⚠️ (需支持) | + +### 高级功能 + +| 功能 | R2 | S3 | GitHub | +|-----|-----|-----|---------| +| 公开访问 URL | ✅ | ✅ | ✅ | +| 预签名 URL | ✅ | ✅ | ✅ | +| CDN 集成 | ✅ | ✅ | ✅ | +| 版本控制 | ❌ | ⚠️ (付费) | ✅ | +| 生命周期策略 | ✅ | ✅ | ❌ | +| 访问控制 | ✅ | ✅ | ✅ (Git 权限) | + +## 性能基准 + +基于 1 千次请求、1GB 文件的测试: + +| 操作 | R2 | S3 | GitHub | +|-----|-----|-----|---------| +| **列表** | ~50ms | ~80ms | ~150ms | +| **上传** | ~300ms | ~350ms | ~500ms | +| **下载** | ~100ms | ~120ms | ~200ms | +| **删除** | ~100ms | ~120ms | ~200ms | + +*注:实际性能取决于网络距离和文件大小* + +## 成本对比(月均) + +假设场景: + +- 存储:10GB +- 月请求:100,000 +- 流量:500GB + +| 服务 | 存储费 | 请求费 | 流量费 | 总计 | +|-----|-------|--------|--------|------| +| **R2** | 免费 | $0.36 | 免费 | **$0.36** 💚 | +| **S3** | $2.30 | $0.50 | $4.57 | **$7.37** | +| **GitHub** | 免费 | 免费 | 免费 | **免费** 🎉 | + +## 迁移指南 + +### R2 → S3 + +```bash +# 使用 aws cli 迁移 +aws s3 sync s3://r2-bucket/ s3://s3-bucket/ \ + --source-profile r2 \ + --profile s3 +``` + +### S3 → R2 + +```bash +# 使用 aws cli 迁移 +aws s3 sync s3://s3-bucket/ s3://r2-bucket/ \ + --source-profile s3 \ + --profile r2 \ + --endpoint-url https://account.r2.cloudflarestorage.com +``` + +### GitHub → R2 + +```bash +# 1. 从 GitHub 克隆仓库 +git clone https://github.com/user/repo.git +cd repo + +# 2. 使用工具上传到 R2 +# 使用 rclone、aws cli 等工具 +``` + +## 如何选择 + +### 决策树 + +``` +是否需要完全免费? +├─ 是 → GitHub Repository ✅ +└─ 否 + └─ 是否需要企业级功能? + ├─ 是 → Amazon S3 ✅ + └─ 否 → Cloudflare R2 ✅(最佳平衡) +``` + +### 快速决策表 + +| 场景 | 推荐 | 理由 | +|-----|------|------| +| 个人博客 | GitHub | 免费且简单 | +| 小团队文件 | R2 | 成本低,性能好 | +| 企业应用 | S3 | 功能完整,支持好 | +| 大规模存储 | R2 | 流量免费,成本最低 | +| 版本控制重要 | GitHub | 自动 Git 历史 | + +## 后续配置 + +选择好存储后端后,按照相应指南进行配置: + +- **[Cloudflare R2 配置](./r2.md)** - 详细配置步骤 +- **[Amazon S3 配置](./s3.md)** - AWS S3 设置 +- **[GitHub 存储配置](./github.md)** - GitHub 仓库配置 + +## 常见问题 + +### Q: 可以中途更换存储后端吗? + +**A:** 可以!只需修改 `.env` 文件中的 `STORAGE_TYPE` 环境变量。但需要: + +- 手动迁移现有文件 +- 重新配置凭证 + +### Q: 多个后端能同时使用吗? + +**A:** 目前不支持,但可以: + +- 部署多个应用实例 +- 每个实例使用不同后端 +- 通过负载均衡器分流 + +### Q: 有免费额度吗? + +**A:** + +- **R2**: 每月前 1000 万请求免费 ✅ +- **S3**: 新用户 12 个月免费套餐 +- **GitHub**: 完全免费(通过 GitHub)✅ + +### Q: 如何监控使用成本? + +**A:** + +- **R2**: Cloudflare 控制面板实时显示 +- **S3**: AWS 成本管理器 +- **GitHub**: 不产生成本 + +## 获取帮助 + +- 📖 [R2 详细配置](./r2.md) +- 📖 [S3 详细配置](./s3.md) +- 📖 [GitHub 详细配置](./github.md) +- 🐛 [提交 Issue](https://github.com/RhenCloud/Cloud-Index/issues) diff --git a/docs/storage/r2.md b/docs/storage/r2.md new file mode 100644 index 0000000..ea7fa90 --- /dev/null +++ b/docs/storage/r2.md @@ -0,0 +1,390 @@ +--- +title: Cloudflare R2 +createTime: 2025/11/09 00:26:55 +permalink: /storage/r2 +--- +# Cloudflare R2 配置指南 + +详细的 Cloudflare R2 配置步骤和最佳实践。 + +## 概述 + +Cloudflare R2 是一个 S3 兼容的对象存储服务,具有以下优势: + +- 💚 存储流量完全免费 +- 🌍 全球 CDN 加速 +- 💰 请求费用低(每 100 万次 $0.36) +- ⚡ 高性能和高可靠性 +- 🔄 S3 API 完全兼容 + +## 账户设置 + +### 1. 创建 Cloudflare 账户 + +访问 [Cloudflare 官网](https://dash.cloudflare.com/sign-up) 创建免费账户。 + +### 2. 激活 R2 + +1. 登录 Cloudflare 控制面板 +2. 左侧菜单选择 "R2" +3. 点击 "开始使用 R2" +4. 阅读条款并确认 + +## 创建存储桶 + +### 1. 创建新桶 + +1. 进入 R2 → "存储桶" +2. 点击 "创建存储桶" +3. 输入存储桶名称(例如 `my-storage`) + - 名称必须全局唯一 + - 只能包含小写字母、数字和连字符 +4. 选择区域(通常选择 "自动" APAC) +5. 点击 "创建存储桶" + +### 2. 存储桶设置 + +进入存储桶 → "设置": + +- **CORS**: 启用 CORS 以支持跨域请求 +- **生命周期规则**: 可选,用于自动删除过期文件 +- **版本控制**: 保持禁用(不需要版本历史) + +## 获取 API 凭证 + +### 1. 创建 API Token + +1. 进入 R2 → "API 令牌" +2. 点击 "创建 API 令牌" +3. 选择 "Edit" 权限(允许读写) +4. 配置 TTL(可选,默认无限期) +5. 复制 **Token ID** 和 **Token Secret** +6. 点击 "创建 API 令牌" + +**权限说明:** + +- **读取**: 仅允许列表和下载 +- **编辑**: 允许读、写和删除(推荐) +- **删除**: 包含删除和管理员操作 + +### 2. 记录账户 ID + +在 R2 仪表盘的任何存储桶页面可以看到 **Account ID**(例如 `a1b2c3d4e5f6g7h8i`) + +保存以下信息: + +```env +ACCESS_KEY_ID = your_token_id +SECRET_ACCESS_KEY = your_token_secret +R2_ACCOUNT_ID = your_account_id +R2_BUCKET_NAME = your-bucket-name +``` + +## 配置环境变量 + +编辑 `.env` 文件: + +```env +# 存储类型 +STORAGE_TYPE=r2 + +# API 凭证 +ACCESS_KEY_ID=your_token_id +SECRET_ACCESS_KEY=your_token_secret + +# R2 配置 +R2_ENDPOINT_URL=https://your_account_id.r2.cloudflarestorage.com +R2_BUCKET_NAME=your-bucket-name +R2_REGION=auto + +# 可选:公开访问配置 +R2_PUBLIC_URL=https://pub-your-bucket-name.r2.dev + +# 可选:预签名 URL 过期时间(秒,默认 3600) +R2_PRESIGN_EXPIRES=3600 +``` + +## 配置公开访问(可选) + +若要生成可分享的公开链接,需要配置公开 URL。 + +### 1. 启用公开访问 + +1. 进入存储桶 → "设置" +2. 找到 "Public access" 部分 +3. 点击 "Allow public access" + +### 2. 配置自定义域(推荐) + +#### 方式 A:使用 R2 默认 URL + +```env +R2_PUBLIC_URL=https://pub-your-bucket-name.r2.dev +``` + +#### 方式 B:使用自定义域 + +1. 进入存储桶 → "设置" → "Custom domains" +2. 点击 "Connect domain" +3. 输入你的域名(例如 `assets.example.com`) +4. 在域名 DNS 设置中添加 CNAME 记录: + + ``` + assets.example.com CNAME your-bucket-name.r2.dev + ``` + +5. 点击 "Continue" + +配置环境变量: + +```env +R2_PUBLIC_URL=https://assets.example.com +``` + +## 与 CDN 集成 + +### 方式 A:Cloudflare CDN(推荐) + +R2 已与 Cloudflare CDN 整合: + +1. 进入存储桶设置 +2. CDN 部分会自动显示 CDN 可用性 +3. 公开访问的文件会自动通过 CDN 加速 + +### 方式 B:其他 CDN 供应商 + +若使用其他 CDN(如 Akamai、AWS CloudFront): + +1. 配置 CDN 源指向 R2 +2. CDN 会自动缓存文件 +3. 在应用中使用 CDN URL + +```env +# 使用 CDN 加速 +R2_PUBLIC_URL=https://your-cdn-url.com +``` + +## 测试连接 + +### 方式一:启动应用测试 + +```bash +python app.py +``` + +访问 `http://localhost:5000`,查看是否能正常显示文件列表。 + +### 方式二:使用 CLI 测试 + +```bash +# 安装 aws cli +pip install awscli + +# 配置凭证 +aws configure --profile r2 + +# 输入以下信息: +# AWS Access Key ID: your_token_id +# AWS Secret Access Key: your_token_secret +# Default region: auto + +# 测试连接 +aws s3 ls s3://your-bucket-name --profile r2 --endpoint-url https://your_account_id.r2.cloudflarestorage.com +``` + +### 方式三:Python 测试 + +```python +import boto3 + +s3 = boto3.client( + 's3', + endpoint_url='https://your_account_id.r2.cloudflarestorage.com', + aws_access_key_id='your_token_id', + aws_secret_access_key='your_token_secret', + region_name='auto' +) + +# 列出所有对象 +response = s3.list_objects_v2(Bucket='your-bucket-name') +for obj in response.get('Contents', []): + print(obj['Key']) +``` + +## 常见配置 + +### 启用 CORS + +如果需要从浏览器直接上传文件到 R2: + +1. 进入存储桶 → "设置" +2. 找到 CORS 部分 +3. 添加以下规则: + +```json +[ + { + "AllowedOrigins": ["*"], + "AllowedMethods": ["GET", "HEAD", "PUT", "POST", "DELETE"], + "AllowedHeaders": ["*"], + "ExposeHeaders": ["ETag"] + } +] +``` + +### 生命周期规则(可选) + +自动删除旧文件以节省成本: + +1. 进入存储桶 → "设置" → "生命周期规则" +2. 点击 "添加规则" +3. 配置规则: + - **前缀**: 可选(如 `cache/`) + - **在上传后删除**: 指定天数(如 30 天) +4. 点击 "添加" + +## 监控和管理 + +### 查看使用情况 + +1. 进入 R2 仪表盘 +2. 查看 "存储使用" 和 "请求统计" +3. 可以看到: + - 存储桶大小(GB) + - 月度请求数 + - 估计费用 + +### 管理文件 + +通过 Cloudflare 控制面板: + +1. 进入存储桶 → "对象" +2. 可以: + - 📁 浏览文件夹 + - 📥 上传文件 + - 📤 下载文件 + - 🗑️ 删除文件 + - 📋 查看详情 + +也可以通过 Cloud Index 应用管理: + +访问应用 UI 进行所有文件操作。 + +## 最佳实践 + +### 1. 安全性 + +- ✅ 使用编辑权限 Token(最小权限原则) +- ✅ 定期轮换凭证 +- ✅ 不要在版本控制中提交凭证 +- ✅ 使用 `.env` 文件管理凭证 + +### 2. 性能优化 + +- ✅ 启用 R2 CDN 加速 +- ✅ 设置合理的缓存 TTL +- ✅ 定期清理过期文件 +- ✅ 使用生命周期规则自动清理 + +### 3. 成本控制 + +- ✅ 设置存储使用警告 +- ✅ 定期检查费用 +- ✅ 删除不需要的文件 +- ✅ 使用生命周期规则 + +### 4. 监控 + +- ✅ 定期检查使用统计 +- ✅ 设置告警 +- ✅ 记录访问日志 +- ✅ 备份重要数据 + +## 常见问题 + +### Q: 如何获取文件的公开 URL? + +**A:** 在 Cloud Index 应用中: + +1. 点击文件菜单 +2. 选择 "复制链接" +3. 分享链接 + +### Q: 如何上传大文件? + +**A:** R2 支持多部分上传(通过应用自动处理): + +- 单个文件最大 5GB +- 应用会自动分块上传 + +### Q: 费用会很高吗? + +**A:** R2 价格极低: + +- 存储:每月每 GB $0.015 +- 请求:每 100 万次 $0.36 +- 流量:完全免费 ✅ + +典型用户月费 < $1 + +### Q: 可以删除 API Token 吗? + +**A:** 可以,但需要谨慎: + +1. 进入 R2 → "API 令牌" +2. 找到 Token 点击删除 +3. 需要配置新 Token 后才能继续使用应用 + +## 故障排除 + +### 连接失败 + +检查: + +1. 凭证是否正确 +2. 端点 URL 是否正确(包含 Account ID) +3. 存储桶名称是否正确 +4. 网络连接是否正常 + +### 上传失败 + +检查: + +1. Token 权限是否为 "编辑" 或更高 +2. 存储桶是否存在 +3. 文件名是否有效 +4. 磁盘空间是否充足 + +### 文件无法访问 + +检查: + +1. 是否启用了公开访问 +2. R2_PUBLIC_URL 配置是否正确 +3. CDN 是否正常工作 +4. 文件权限设置 + +## 成本示例 + +假设月均使用情况: + +| 指标 | 数值 | 费用 | +|-----|------|------| +| 存储 | 10GB | $0.15 | +| 请求 | 100K | $0.036 | +| 流量 | 1TB | $0 | +| **总计** | - | **$0.186** | + +极低成本!✅ + +## 获取帮助 + +- 📖 [Cloudflare R2 官方文档](https://developers.cloudflare.com/r2/) +- 🐛 [提交 Issue](https://github.com/RhenCloud/Cloud-Index/issues) +- 💬 [讨论区](https://github.com/RhenCloud/Cloud-Index/discussions) + +## 下一步 + +- 🚀 [快速开始](../guide/quickstart.md) - 开始使用应用 +- 📖 [其他存储后端](./overview.md) - 对比其他服务 +- 💾 [S3 配置](./s3.md) - AWS S3 配置 diff --git a/docs/storage/s3.md b/docs/storage/s3.md new file mode 100644 index 0000000..4241513 --- /dev/null +++ b/docs/storage/s3.md @@ -0,0 +1,478 @@ +--- +title: Amazon S3 +createTime: 2025/11/09 00:26:55 +permalink: /storage/s3 +--- +# Amazon S3 配置指南 + +详细的 Amazon S3 配置步骤和最佳实践。 + +## 概述 + +Amazon S3(Simple Storage Service)是业界标准的对象存储服务,具有以下优势: + +- 🏢 企业级服务 +- 🔐 最高的安全性 +- 📊 功能最完整 +- 🌍 全球可用 +- 📈 自动扩展 + +## 账户设置 + +### 1. 创建 AWS 账户 + +访问 [AWS 官网](https://aws.amazon.com/) 创建账户。新用户享受 12 个月免费套餐。 + +### 2. 访问 S3 控制台 + +1. 登录 AWS 管理控制台 +2. 搜索 "S3" +3. 进入 S3 服务 + +## 创建存储桶 + +### 1. 创建新桶 + +1. 点击 "创建存储桶" +2. 输入存储桶名称(例如 `my-cloud-storage`) + - 名称必须全局唯一 + - 只能包含小写字母、数字、连字符和点 +3. 选择区域(例如 `ap-northeast-1` 东京) +4. **ACL** - 保持默认(禁用) +5. **阻止公有访问设置** - 根据需求配置(见下一步) +6. 点击 "创建存储桶" + +### 2. 配置公开访问(可选) + +若要让文件可以公开访问: + +1. 进入存储桶 → "权限" +2. 找到 "阻止公有访问" 部分 +3. 点击 "编辑" +4. **取消勾选** "阻止所有公有访问" +5. 点击 "保存" + +### 3. 启用 ACL(仅在需要时) + +1. 进入存储桶 → "权限" +2. 找到 "对象所有权" 部分 +3. 点击 "编辑" +4. 选择 "ACL 已启用" +5. 点击 "保存" + +## 创建 IAM 用户和凭证 + +### 1. 创建 IAM 用户 + +使用 IAM 用户而不是根账户更安全: + +1. 进入 IAM 控制台 +2. 左侧菜单 → "用户" +3. 点击 "创建用户" +4. 输入用户名(例如 `Cloud Index-user`) +5. 点击 "创建用户" + +### 2. 配置权限 + +#### 方式 A:使用托管策略(推荐) + +1. 进入用户详情 +2. 点击 "添加权限" → "直接附加现有策略" +3. 搜索 "AmazonS3FullAccess" +4. 勾选并点击 "下一步" +5. 点击 "添加权限" + +#### 方式 B:使用自定义策略(更安全) + +1. 进入用户详情 +2. 点击 "添加权限" → "创建内联策略" +3. 选择 JSON +4. 粘贴以下策略: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "s3:ListAllMyBuckets", + "s3:GetBucketLocation" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "s3:ListBucket", + "s3:GetObjectVersion", + "s3:ListBucketVersions" + ], + "Resource": "arn:aws:s3:::my-cloud-storage" + }, + { + "Effect": "Allow", + "Action": [ + "s3:GetObject", + "s3:PutObject", + "s3:DeleteObject" + ], + "Resource": "arn:aws:s3:::my-cloud-storage/*" + } + ] +} +``` + +5. 点击 "创建策略" + +### 3. 创建访问密钥 + +1. 进入用户详情 +2. 点击 "安全凭证" 选项卡 +3. 向下滚动到 "访问密钥" +4. 点击 "创建访问密钥" +5. 选择 "其他" +6. 点击 "下一步" +7. 复制 **Access Key ID** 和 **Secret Access Key** +8. 保存到安全位置 + +**⚠️ 重要**: 密钥只显示一次,请立即保存! + +## 配置环境变量 + +编辑 `.env` 文件: + +```env +# 存储类型 +STORAGE_TYPE=s3 + +# AWS 凭证 +ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE +SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + +# S3 配置 +S3_BUCKET_NAME=my-cloud-storage +S3_REGION=ap-northeast-1 + +# 可选:公开访问配置 +S3_PUBLIC_URL=https://my-cloud-storage.s3.ap-northeast-1.amazonaws.com + +# 可选:预签名 URL 过期时间(秒,默认 3600) +S3_PRESIGN_EXPIRES=3600 +``` + +## 常用 AWS 区域 + +选择离你最近的区域以获得最佳性能: + +| 区域代码 | 位置 | 说明 | +|---------|------|------| +| `us-east-1` | 美国东部(N. Virginia) | 美国 | +| `us-west-2` | 美国西部(Oregon) | 美国西海岸 | +| `eu-west-1` | 欧洲(Ireland) | 欧洲 | +| `ap-northeast-1` | 亚太(Tokyo) | 日本、韩国 | +| `ap-southeast-1` | 亚太(Singapore) | 东南亚 | +| `cn-north-1` | 中国(北京) | 中国 | + +## 配置公开访问 URL + +### 方式 A:使用 S3 默认 URL + +```env +S3_PUBLIC_URL=https://bucket-name.s3.region.amazonaws.com +``` + +### 方式 B:使用 CloudFront CDN + +1. 进入 CloudFront 控制台 +2. 点击 "创建分配" +3. 源域名:选择你的 S3 存储桶 +4. 其他设置保持默认 +5. 点击 "创建分配" +6. 等待部署(约 15-20 分钟) +7. 复制分配域名 + +配置环境变量: + +```env +S3_PUBLIC_URL=https://d123abc456.cloudfront.net +``` + +### 方式 C:使用自定义域名 + +1. 使用 Route 53 或其他 DNS 服务 +2. 创建 CNAME 记录指向 S3 或 CloudFront +3. 配置 SSL 证书 + +```env +S3_PUBLIC_URL=https://assets.example.com +``` + +## 启用 CORS(如需跨域请求) + +1. 进入存储桶 +2. 点击 "权限" +3. 向下滚动到 "CORS" +4. 点击 "编辑" +5. 粘贴以下配置: + +```json +[ + { + "AllowedHeaders": ["*"], + "AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"], + "AllowedOrigins": ["*"], + "ExposeHeaders": ["ETag"] + } +] +``` + +6. 点击 "保存更改" + +## 启用版本控制(可选) + +1. 进入存储桶 +2. 点击 "属性" +3. 找到 "版本控制" +4. 点击 "编辑" +5. 选择 "启用" +6. 点击 "保存更改" + +## 启用生命周期规则(自动清理) + +自动删除过期文件以节省成本: + +1. 进入存储桶 +2. 点击 "管理" +3. 点击 "创建生命周期规则" +4. 输入规则名称(例如 `delete-old-cache`) +5. 配置规则: + - **前缀**:可选(如 `cache/`) + - **对象年龄**:30 天后删除 + - **过期对象删除标记**:勾选 +6. 点击 "创建规则" + +## 测试连接 + +### 方式一:启动应用测试 + +```bash +python app.py +``` + +访问 `http://localhost:5000`,查看是否能正常显示文件列表。 + +### 方式二:使用 AWS CLI 测试 + +```bash +# 安装 aws cli +pip install awscli + +# 配置凭证 +aws configure + +# 输入以下信息: +# AWS Access Key ID: AKIAIOSFODNN7EXAMPLE +# AWS Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY +# Default region: ap-northeast-1 +# Default output format: json + +# 测试连接 +aws s3 ls s3://my-cloud-storage +``` + +### 方式三:Python 测试 + +```python +import boto3 + +s3 = boto3.client( + 's3', + aws_access_key_id='AKIAIOSFODNN7EXAMPLE', + aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', + region_name='ap-northeast-1' +) + +# 列出所有对象 +response = s3.list_objects_v2(Bucket='my-cloud-storage') +for obj in response.get('Contents', []): + print(obj['Key']) +``` + +## 成本优化建议 + +### 1. 选择合适的存储类型 + +S3 提供多种存储类别: + +| 类别 | 适用场景 | 成本 | +|------|---------|------| +| **S3 标准** | 经常访问的数据 | 💛 中等 | +| **S3 智能分层** | 访问模式不确定 | 自动优化 | +| **S3 标准-IA** | 不经常访问 | 💚 低 | +| **Glacier** | 归档数据 | 🔥 极低 | + +默认使用 S3 标准即可。 + +### 2. 启用生命周期规则 + +自动将旧文件迁移到更便宜的存储类: + +```json +{ + "Transitions": [ + { + "Days": 90, + "StorageClass": "GLACIER" + } + ], + "Expiration": { + "Days": 180 + } +} +``` + +### 3. 定期清理 + +1. 定期检查存储桶大小 +2. 删除不需要的文件 +3. 删除过期的版本 + +### 4. 监控成本 + +1. 进入 AWS 成本管理器 +2. 设置成本告警 +3. 定期审查费用 + +## 监控和管理 + +### 查看存储使用情况 + +1. 进入存储桶 +2. 点击 "指标" +3. 可以看到: + - 存储桶大小 + - 对象数量 + - 请求统计 + +### 启用访问日志 + +1. 进入存储桶 → "属性" +2. 找到 "服务器访问日志" +3. 点击 "编辑" +4. 启用日志 +5. 指定目标存储桶和前缀 +6. 点击 "保存更改" + +## 最佳实践 + +### 1. 安全性 + +- ✅ 使用 IAM 用户而非根账户 +- ✅ 使用最小权限原则 +- ✅ 定期轮换访问密钥 +- ✅ 启用 MFA(多因素认证) +- ✅ 启用 CloudTrail 审计 +- ✅ 不要在代码中提交凭证 + +### 2. 性能 + +- ✅ 使用 CloudFront CDN +- ✅ 启用传输加速(可选) +- ✅ 选择适当的区域 +- ✅ 使用多部分上传(应用自动处理) + +### 3. 可靠性 + +- ✅ 启用版本控制 +- ✅ 启用 MFA 删除保护 +- ✅ 启用服务器端加密 +- ✅ 定期备份 + +### 4. 成本控制 + +- ✅ 使用生命周期规则 +- ✅ 监控使用成本 +- ✅ 定期清理过期数据 +- ✅ 使用合适的存储类别 + +## 常见问题 + +### Q: 新用户有免费额度吗? + +**A:** 是的!AWS 12 个月免费套餐包括: + +- 5GB S3 存储 +- 20,000 GET 请求 +- 2,000 PUT 请求 + +之后按使用量计费。 + +### Q: 月费大概多少? + +**A:** 取决于使用量。示例: + +- 存储 100GB:~$2.30 +- 请求 1M:~$0.50 +- 流量 100GB:~$0.92 +- **总计**:~$3.72/月 + +### Q: 如何降低成本? + +**A:** + +1. 使用 S3 标准-IA(便宜 50%) +2. 启用生命周期规则 +3. 压缩文件 +4. 使用 CloudFront CDN(减少 S3 请求) + +### Q: 如何处理大文件上传? + +**A:** S3 支持: + +- 单个对象最大 5TB +- 应用自动使用多部分上传 +- 没有大小限制 + +## 故障排除 + +### 连接失败 + +检查: + +1. Access Key 和 Secret Key 是否正确 +2. 区域代码是否正确 +3. 存储桶名称是否正确 +4. IAM 用户是否有 S3 权限 +5. 网络连接是否正常 + +### 上传失败 + +检查: + +1. IAM 用户是否有 `s3:PutObject` 权限 +2. 存储桶是否存在 +3. 文件名是否有效 +4. 磁盘空间是否充足 + +### 公开文件无法访问 + +检查: + +1. 是否启用了公开访问 +2. 是否配置了正确的 URL +3. 是否启用了 CORS +4. CloudFront 是否正常工作 + +## 获取帮助 + +- 📖 [AWS S3 官方文档](https://docs.aws.amazon.com/s3/) +- 📖 [AWS SDK for Python 文档](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) +- 🐛 [提交 Issue](https://github.com/RhenCloud/Cloud-Index/issues>) +- 💬 [讨论区](https://github.com/RhenCloud/Cloud-Index/discussions) + +## 下一步 + +- 🚀 [快速开始](../guide/quickstart.md) - 开始使用应用 +- 📖 [存储后端对比](./overview.md) - 对比其他服务 +- 💾 [Cloudflare R2 配置](./r2.md) - R2 配置指南 diff --git a/package.json b/package.json new file mode 100644 index 0000000..170ce9c --- /dev/null +++ b/package.json @@ -0,0 +1,33 @@ +{ + "name": "cloud-index-docs", + "type": "module", + "version": "1.0.0", + "description": "一个支持多种云存储后端的文件管理、索引和浏览服务", + "packageManager": "pnpm@10.12.4", + "author": "RhenCloud ", + "license": "MIT", + "scripts": { + "docs:build": "vuepress build docs --clean-cache --clean-temp", + "docs:dev": "vuepress dev docs", + "docs:dev-clean": "vuepress dev docs --clean-cache --clean-temp", + "docs:preview": "http-server docs/.vuepress/dist", + "vp-update": "pnpm dlx vp-update" + }, + "devDependencies": { + "@vuepress/bundler-vite": "2.0.0-rc.26", + "http-server": "^14.1.1", + "typescript": "^5.9.3", + "vue": "^3.5.22", + "vuepress": "2.0.0-rc.26", + "vuepress-theme-plume": "1.0.0-rc.175" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "@parcel/watcher", + "esbuild" + ] + }, + "engines": { + "node": "^20.6.0 || >=22.0.0" + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..cedcee6 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4477 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@vuepress/bundler-vite': + specifier: 2.0.0-rc.26 + version: 2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3) + http-server: + specifier: ^14.1.1 + version: 14.1.1 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vue: + specifier: ^3.5.22 + version: 3.5.24(typescript@5.9.3) + vuepress: + specifier: 2.0.0-rc.26 + version: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + vuepress-theme-plume: + specifier: 1.0.0-rc.175 + version: 1.0.0-rc.175(@algolia/client-search@5.43.0)(markdown-it@14.1.0)(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + +packages: + + '@ai-sdk/gateway@2.0.7': + resolution: {integrity: sha512-/AI5AKi4vOK9SEb8Z1dfXkhsJ5NAfWsoJQc96B/mzn2KIrjw5occOjIwD06scuhV9xWlghCoXJT1sQD9QH/tyg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.16': + resolution: {integrity: sha512-lsWQY9aDXHitw7C1QRYIbVGmgwyT98TF3MfM8alNIXKpdJdi+W782Rzd9f1RyOfgRmZ08gJ2EYNDhWNK7RqpEA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.0': + resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + engines: {node: '>=18'} + + '@ai-sdk/react@2.0.89': + resolution: {integrity: sha512-r2uCqx042JOjNrSlDrjh7ufSIfU2BM6Lo4qe47KHkYuJjPfssxhLpJUCFLB01iV7Foyn/xpbq06Zr6WI4qUDgw==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.25.76 || ^4.1.8 + peerDependenciesMeta: + zod: + optional: true + + '@algolia/abtesting@1.9.0': + resolution: {integrity: sha512-4q9QCxFPiDIx1n5w41A1JMkrXI8p0ugCQnCGFtCKZPmWtwgWCqwVRncIbp++81xSELFZVQUfiB7Kbsla1tIBSw==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.19.2': + resolution: {integrity: sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==} + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2': + resolution: {integrity: sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-shared@1.19.2': + resolution: {integrity: sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.43.0': + resolution: {integrity: sha512-YsKYkohIMxiYEAu8nppZi5EioYDUIo9Heoor8K8vMUnkUtGCOEU/Q4p5OWaYSSBx3evo09Ga9rG4jsKViIcDzQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.43.0': + resolution: {integrity: sha512-kDGJWt3nzf0nu5RPFXQhNGl6Q0cn35fazxVWXhd0Fw3Vo6gcVfrcezcBenHb66laxnVJ7uwr1uKhmsu3Wy25sQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.43.0': + resolution: {integrity: sha512-RAFipkAnI8xhL/Sgi/gpXgNWN5HDM6F7z4NNNOcI8ZMYysZEBsqVXojg/WdKEKkQCOHVTZ3mooIjc5BaQdyVtA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.43.0': + resolution: {integrity: sha512-PmVs83THco8Qig3cAjU9a5eAGaSxsfgh7PdmWMQFE/MCmIcLPv0MVpgfcGGyPjZGYvPC4cg+3q7JJxcNSsEaTg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.43.0': + resolution: {integrity: sha512-Bs4zMLXvkAr19FSOZWNizlNUpRFxZVxtvyEJ+q3n3+hPZUcKjo0LIh15qghhRcQPEihjBN6Gr/U+AqRfOCsvnA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.43.0': + resolution: {integrity: sha512-pwHv+z8TZAKbwAWt9+v2gIqlqcCFiMdteTdgdPn2yOBRx4WUQdsIWAaG9GiV3by8jO51FuFQnTohhauuI63y3A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.43.0': + resolution: {integrity: sha512-wKy6x6fKcnB1CsfeNNdGp4dzLzz04k8II3JLt6Sp81F8s57Ks3/K9qsysmL9SJa8P486s719bBttVLE8JJYurQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.43.0': + resolution: {integrity: sha512-TA21h2KwqCUyPXhSAWF3R2UES/FAnzjaVPDI6cRPXeadX+pdrGN0GWat5gSUATJVcMHECn+lGvuMMRxO86o2Pg==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.43.0': + resolution: {integrity: sha512-rvWVEiA1iLcFmHS3oIXGIBreHIxNZqEFDjiNyRtLEffgd62kul2DjXM7H5bOouDMTo1ywMWT9OeQnzrhlTGAwA==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.43.0': + resolution: {integrity: sha512-scCijGd38npvH2uHbYhO4f1SR8It5R2FZqOjNcMfw/7Ph7Hxvl+cd7Mo6RzIxsNRcLW5RrwjtpTK3gpDe8r/WQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.43.0': + resolution: {integrity: sha512-jMkRLWJYr4Hcmpl89e4vIWs69Mkf8Uwx7MG5ZKk2UxW3G3TmouGjI0Ph5mVPmg3Jf1UG3AdmVDc4XupzycT1Jw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.43.0': + resolution: {integrity: sha512-KyQiVz+HdYtissC0J9KIGhHhKytQyJX+82GVsbv5rSCXbETnAoojvUyCn+3KRtWUvMDYCsZ+Y7hM71STTUJUJg==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.43.0': + resolution: {integrity: sha512-UnUBNY0U+oT0bkYDsEqVsCkErC2w7idk4CRiLSzicqY8tGylD9oP0j13X/fse1CuiAFCCr3jfl+cBlN6dC0OFw==} + engines: {node: '>= 14.0.0'} + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@9.3.0': + resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@docsearch/core@4.3.1': + resolution: {integrity: sha512-ktVbkePE+2h9RwqCUMbWXOoebFyDOxHqImAqfs+lC8yOU+XwEW4jgvHGJK079deTeHtdhUNj0PXHSnhJINvHzQ==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + + '@docsearch/css@4.3.1': + resolution: {integrity: sha512-Jnct7LKOi/+Oxbmq215YPYASkMdZqtyyDCkma8Cj4sCcbBuybL6fvyBaX7uJoM6kVF7aIpBA38RhHAyN5ByCHg==} + + '@docsearch/js@4.3.1': + resolution: {integrity: sha512-Xi2OztaQqTnNj0HGTcS/RtoXe4ASOgKRuH8hAKKqISqv13oUxpVBIBUHpvPIU4qgmJRZN2gA2gdjdn+VuvrvRQ==} + + '@docsearch/react@4.3.1': + resolution: {integrity: sha512-vbKwgDuHi/YA0CiicXhJm4DSfOIOccl3FJlkdVmeZ5d61wNbPdAnAy71i7FF0JzO6noCQScidBBguOCaNfauEw==} + peerDependencies: + '@types/react': '>= 16.8.0 < 20.0.0' + react: '>= 16.8.0 < 20.0.0' + react-dom: '>= 16.8.0 < 20.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + + '@iconify/vue@5.0.0': + resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==} + peerDependencies: + vue: '>=3' + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@lit-labs/ssr-dom-shim@1.4.0': + resolution: {integrity: sha512-ficsEARKnmmW5njugNYKipTm4SFnbik7CXtoencDZzmzo/dQ+2Q0bgkzJuoJP20Aj0F+izzJjOqsnkd6F/o1bw==} + + '@lit/reactive-element@2.1.1': + resolution: {integrity: sha512-N+dm5PAYdQ8e6UlywyyrgI2t++wFGXfHx+dSJ1oBrg6FAxUj40jId++EaRm80MKX5JnlH1sBsyZ5h0bcZKemCg==} + + '@mdit-vue/plugin-component@3.0.2': + resolution: {integrity: sha512-Fu53MajrZMOAjOIPGMTdTXgHLgGU9KwTqKtYc6WNYtFZNKw04euSfJ/zFg8eBY/2MlciVngkF7Gyc2IL7e8Bsw==} + engines: {node: '>=20.0.0'} + + '@mdit-vue/plugin-frontmatter@3.0.2': + resolution: {integrity: sha512-QKKgIva31YtqHgSAz7S7hRcL7cHXiqdog4wxTfxeQCHo+9IP4Oi5/r1Y5E93nTPccpadDWzAwr3A0F+kAEnsVQ==} + engines: {node: '>=20.0.0'} + + '@mdit-vue/plugin-headers@3.0.2': + resolution: {integrity: sha512-Z3PpDdwBTO5jlW2r617tQibkwtCc5unTnj/Ew1SCxTQaXjtKgwP9WngdSN+xxriISHoNOYzwpoUw/1CW8ntibA==} + engines: {node: '>=20.0.0'} + + '@mdit-vue/plugin-sfc@3.0.2': + resolution: {integrity: sha512-dhxIrCGu5Nd4Cgo9JJHLjdNy2lMEv+LpimetBHDSeEEJxJBC4TPN0Cljn+3/nV1uJdGyw33UZA86PGdgt1LsoA==} + engines: {node: '>=20.0.0'} + + '@mdit-vue/plugin-title@3.0.2': + resolution: {integrity: sha512-KTDP7s68eKTwy4iYp5UauQuVJf+tDMdJZMO6K4feWYS8TX95ItmcxyX7RprfBWLTUwNXBYOifsL6CkIGlWcNjA==} + engines: {node: '>=20.0.0'} + + '@mdit-vue/plugin-toc@3.0.2': + resolution: {integrity: sha512-Dz0dURjD5wR4nBxFMiqb0BTGRAOkCE60byIemqLqnkF6ORKKJ8h5aLF5J5ssbLO87hwu81IikHiaXvqoiEneoQ==} + engines: {node: '>=20.0.0'} + + '@mdit-vue/shared@3.0.2': + resolution: {integrity: sha512-anFGls154h0iVzUt5O43EaqYvPwzfUxQ34QpNQsUQML7pbEJMhcgkRNvYw9hZBspab+/TP45agdPw5joh6/BBA==} + engines: {node: '>=20.0.0'} + + '@mdit-vue/types@3.0.2': + resolution: {integrity: sha512-00aAZ0F0NLik6I6Yba2emGbHLxv+QYrPH00qQ5dFKXlAo1Ll2RHDXwY7nN2WAfrx2pP+WrvSRFTGFCNGdzBDHw==} + engines: {node: '>=20.0.0'} + + '@mdit/helper@0.22.1': + resolution: {integrity: sha512-lDpajcdAk84aYCNAM/Mi3djw38DJq7ocLw5VOSMu/u2YKX3/OD37a6Qb59in8Uyp4SiAbQoSHa8px6hgHEpB5g==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-alert@0.22.3': + resolution: {integrity: sha512-9g99rjLCFd8upA/DXbhGmEM7GMFocy6SRk4OekxuAy9t1aDOE/r5IJgUbBIvc9kMkg39ug0yXtMkKwAt2zp5Hg==} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-attrs@0.23.3': + resolution: {integrity: sha512-DsPY1e1WCjEt0FnKib10vuM2l2g6IB39OmGKBupJ1PgU2jwmxssKQrD02ewhecuNh1QjNgjkx0riiSoUat8ecw==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-container@0.22.2': + resolution: {integrity: sha512-QBBti5EyQzVl/qzFAD9YAhiAB9S2zF/4MPAS4kwm7VkmeYrcj2HpZpA7snMjnWh3CtriDcaIMInhg0vDtDwyfA==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-figure@0.22.2': + resolution: {integrity: sha512-mCbrhfbP8VopTzYHw1OnUAEnhh1C24Sx8ExAJpHgnM7HnNF54a+MXbywXZZJAbRZ22l3J2wrxL+IOxKYgNlgdg==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-footnote@0.22.3': + resolution: {integrity: sha512-4hkki9vlIsRDhb7BZLL53s/htRHcubOkjakHPa7Jkj8BZ8/C++0wF13dr73OXcLNVKe/3JWE6pEl1aKETG20Gw==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + + '@mdit/plugin-img-lazyload@0.22.1': + resolution: {integrity: sha512-ombpBQqR1zYjtr4/7s8EvIVx/ymtiflWksXropYz81o0I9Bm9Os1UPuNgjwfT/DEhIit4HMaJhjpKhGkYrOKgA==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-img-mark@0.22.2': + resolution: {integrity: sha512-+dfw7HBSg9/ETWguCbhudpIEIsWN81Ro23agEuU8JO1RDpkiMAFVBcUAFqUWr9+4KHQhiBtyEWn1Y7l+d17RXg==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-img-size@0.22.3': + resolution: {integrity: sha512-dd2coSTYi5rDg+dIQYgIcHlLvE4C6Q7w8GQj5mdvHF0aek46V6PICZC9tQnPe+GcKKyAg5B1MGBo1+suJVXA5A==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-include@0.22.2': + resolution: {integrity: sha512-H/zm9M7nVBo/eOSZG5YMd0qXk7lEw+z968Z8cjLgvOlh1IMSCX2ZwD3EVeIPGfEOjYQ9hzlZVkTxwZan0VgTJg==} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-katex-slim@0.24.0': + resolution: {integrity: sha512-Bj69Qu7AsK4UkWkFIiRyJlVJ1g5S+d6/YZrDKSc0XabElCGgOhGf+f84h/aW4xbgky8sQBDE4Iutrfggg22TaA==} + engines: {node: '>= 18'} + peerDependencies: + katex: ^0.16.25 + markdown-it: ^14.1.0 + peerDependenciesMeta: + katex: + optional: true + markdown-it: + optional: true + + '@mdit/plugin-mark@0.22.1': + resolution: {integrity: sha512-2blMM/gGyqPARvaal44mt0pOi+8phmFpj7D4suG4qMd1j8aGDZl9R7p8inbr3BePOady1eloh0SWSCdskmutZg==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-mathjax-slim@0.24.0': + resolution: {integrity: sha512-ZFE2DC6LMPzHj/icSk+s0MeV0eWF42XT6oa2+NltfBOoNCQxgrJ57h4K77M2FDA79E7GkMFkJmmlM935j86JDQ==} + engines: {node: '>= 18'} + peerDependencies: + '@mathjax/src': ^4.0.0 + markdown-it: ^14.1.0 + peerDependenciesMeta: + '@mathjax/src': + optional: true + markdown-it: + optional: true + + '@mdit/plugin-plantuml@0.22.3': + resolution: {integrity: sha512-vnMTNO8HsXGQq8DIux+4Y082M/IkT+ICEZhe0EIXgKfbCORa7jQiw1mCKX4L+okqntglOkM5ItvfSdyCbrqidQ==} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-sub@0.22.2': + resolution: {integrity: sha512-+NSz8IMYNAfQWBRBX6jf3PMIubkQSwy3v4ElW5CP4a0U4r1Youw3MOcDa6FRwW9TZ/+t8E+E3DaBeYcRi/+bGw==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-sup@0.22.2': + resolution: {integrity: sha512-xgpCAbNgyrJW8NyvB5vGbRVlnCSnNjiJ3zyHAqqr9IqPGH1jCWidOlLLWiIOtfqvUExsLmtyt4c76SZb5MiKYw==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-tab@0.22.3': + resolution: {integrity: sha512-TPMHgVEsqvsCPVwt1KZGhJsVW/6XNyp9VXy2X2nNXvaklfK2+l6DJBWLeN+lPwzXvASnE5CkEFvaY4627zDt9A==} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-tasklist@0.22.2': + resolution: {integrity: sha512-tYxp4tDomTb9NzIphoDXWJxjQZxFuqP4PjU0H9AecUyWuSRP+HICCqe/HVNTTpB0+WDeuVtnxAW9kX08ekxUWw==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-tex@0.22.2': + resolution: {integrity: sha512-iniJQ9BPZc8AGdLPRoyC+nDA0SoDSe+AETma4y2dOk/EbaSZMYgMaZO843mk5JV7eJkfRc6TWcTIE2CqY2/9Rg==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@mdit/plugin-uml@0.22.2': + resolution: {integrity: sha512-pe1p527i66rKThIxz6yOrBILyl1E+jZtDexuUHnNKAKEgXx+f10eCENLN7+9L59K2pbARj3PtdxDC0fs+e2DqA==} + engines: {node: '>= 18'} + peerDependencies: + markdown-it: ^14.1.0 + peerDependenciesMeta: + markdown-it: + optional: true + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@pengzhanbo/utils@2.1.0': + resolution: {integrity: sha512-mdcNoYZ6S9EhRqAIpjnD2dcFxaP7E9JdMrP2z5uXuEesddNcmQ4GvEs/wcyxKmFXqeFdL88fJu7l8a6hNN4zPQ==} + + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rolldown/pluginutils@1.0.0-beta.29': + resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + + '@rollup/rollup-android-arm-eabi@4.53.1': + resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.1': + resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.1': + resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.1': + resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.1': + resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.1': + resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.53.1': + resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.53.1': + resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.53.1': + resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.53.1': + resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-gnu@4.53.1': + resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.53.1': + resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.53.1': + resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.53.1': + resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.53.1': + resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.53.1': + resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openharmony-arm64@4.53.1': + resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.1': + resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.1': + resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.1': + resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.1': + resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.15.0': + resolution: {integrity: sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==} + + '@shikijs/engine-javascript@3.15.0': + resolution: {integrity: sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==} + + '@shikijs/engine-oniguruma@3.15.0': + resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + + '@shikijs/langs@3.15.0': + resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + + '@shikijs/themes@3.15.0': + resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + + '@shikijs/transformers@3.15.0': + resolution: {integrity: sha512-Hmwip5ovvSkg+Kc41JTvSHHVfCYF+C8Cp1omb5AJj4Xvd+y9IXz2rKJwmFRGsuN0vpHxywcXJ1+Y4B9S7EG1/A==} + + '@shikijs/types@3.15.0': + resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/hash-sum@1.0.2': + resolution: {integrity: sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it-emoji@3.0.1': + resolution: {integrity: sha512-cz1j8R35XivBqq9mwnsrP2fsz2yicLhB8+PDtuVkKOExwEdsVBNI+ROL3sbhtR5occRZ66vT0QnwFZCqdjf3pA==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@24.10.0': + resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} + + '@types/picomatch@4.0.2': + resolution: {integrity: sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vercel/oidc@3.0.3': + resolution: {integrity: sha512-yNEQvPcVrK9sIe637+I0jD6leluPxzwJKx/Haw6F4H77CdDsszUn5V3o96LPziXkSNE2B83+Z3mjqGKBK/R6Gg==} + engines: {node: '>= 20'} + + '@vitejs/plugin-vue@6.0.1': + resolution: {integrity: sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.24': + resolution: {integrity: sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==} + + '@vue/compiler-dom@3.5.24': + resolution: {integrity: sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==} + + '@vue/compiler-sfc@3.5.24': + resolution: {integrity: sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==} + + '@vue/compiler-ssr@3.5.24': + resolution: {integrity: sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@8.0.3': + resolution: {integrity: sha512-YxZE7xNvvfq5XmjJh1ml+CzVNrRjuZYCuT5Xjj0u9RlXU7za/MRuZDUXcKfp0j7IvYkDut49vlKqbiQ1xhXP2w==} + + '@vue/devtools-kit@8.0.3': + resolution: {integrity: sha512-UF4YUOVGdfzXLCv5pMg2DxocB8dvXz278fpgEE+nJ/DRALQGAva7sj9ton0VWZ9hmXw+SV8yKMrxP2MpMhq9Wg==} + + '@vue/devtools-shared@8.0.3': + resolution: {integrity: sha512-s/QNll7TlpbADFZrPVsaUNPCOF8NvQgtgmmB7Tip6pLf/HcOvBTly0lfLQ0Eylu9FQ4OqBhFpLyBgwykiSf8zw==} + + '@vue/reactivity@3.5.24': + resolution: {integrity: sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==} + + '@vue/runtime-core@3.5.24': + resolution: {integrity: sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==} + + '@vue/runtime-dom@3.5.24': + resolution: {integrity: sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==} + + '@vue/server-renderer@3.5.24': + resolution: {integrity: sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==} + peerDependencies: + vue: 3.5.24 + + '@vue/shared@3.5.24': + resolution: {integrity: sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==} + + '@vuepress-plume/plugin-fonts@1.0.0-rc.175': + resolution: {integrity: sha512-FLxyr8EEPdg+0GTvBSnsnFrZ9vSjZgccGT7Qu064NV6w2EI45wWbXXufcl+k5uAUA9QwWnqiR89qmkEHn6Bxnw==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress-plume/plugin-search@1.0.0-rc.175': + resolution: {integrity: sha512-NhEcCJ8I8a3tlKQDyfYovLP1yct1eZ3p/xETsKTBNrkqk6eYUXw8jdGxbefwshJSRoB91fuGEk9QQCo9wr/pkA==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/bundler-vite@2.0.0-rc.26': + resolution: {integrity: sha512-4+YfKs2iOxuVSMW+L2tFzu2+X2HiGAREpo1DbkkYVDa5GyyPR+YsSueXNZMroTdzWDk5kAUz2Z1Tz1lIu7TO2g==} + + '@vuepress/bundlerutils@2.0.0-rc.26': + resolution: {integrity: sha512-OnhUvzuJFEzPBjivZX7j6EhPE6sAwAIfyi3pAFmOpQDHPP7/l0q2I4bNVVGK4t9EZDu4N7Dl40/oFHhIMy5New==} + + '@vuepress/cli@2.0.0-rc.26': + resolution: {integrity: sha512-63/4nIHrl9pbutUWs6SirWxmyykjvR9BWvu7bvczO1hAkWOyDQPcU18JXWy8q38CyMzPxCeedUfP3BQsZs3UgA==} + hasBin: true + + '@vuepress/client@2.0.0-rc.26': + resolution: {integrity: sha512-+irF1HOTD6sAHdcTjp3yRcfuGlJYAW+YvDhq+7n3TPXeMH/wJbmGmAs2oRIDkx6Nlt3XkMMpFo7e9pOU22ut1w==} + + '@vuepress/core@2.0.0-rc.26': + resolution: {integrity: sha512-Wyiv9oRvdT0lAPGU0Pj1HetjKicbX8/gqbBVYv2MmL7Y4a3r0tyQ92IdZ8LHiAgPvzctntQr/JXIELedvU1t/w==} + + '@vuepress/helper@2.0.0-rc.118': + resolution: {integrity: sha512-g+v+KQBfalhYbAAmb6ivFwBgyoi6tQkyKwMQNEPEbaUnCeZl+tAEr7RvTNLX2ZCcKSZeSp3PKciYEtFseDzN2A==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/highlighter-helper@2.0.0-rc.118': + resolution: {integrity: sha512-9LH7QrMPKzFB+XIWEwd8CY6CaPOTG6FE7RJ4Uj7iSNsjvUFCoMrxspvVpURoh/e12tRuSu3HGx3j02W8Vip/9g==} + peerDependencies: + '@vueuse/core': ^14.0.0 + vuepress: 2.0.0-rc.26 + peerDependenciesMeta: + '@vueuse/core': + optional: true + + '@vuepress/markdown@2.0.0-rc.26': + resolution: {integrity: sha512-ZAXkRxqPDjxqcG4j4vN2ZL5gmuRmgGH7n0s/7pcWIGFH3BJodp/PXMYCklnne1VwARIim9rqE3FKPB/ifJX0yA==} + + '@vuepress/plugin-cache@2.0.0-rc.118': + resolution: {integrity: sha512-xCZix1fQTzclztnBR/48Jj9jBnX3CNcZce05FayjpFooCvMYWTdPo0379TLeiZxALdB9/oN7ymru/eaCtm306g==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-comment@2.0.0-rc.118': + resolution: {integrity: sha512-dIM5dNs4G/5cjR5RzQ2L9xx2ZuBR6e3seD5STWOeHCsqOvE25+cXI3skBpi+MK94u+5VAmKw6vA1McIqUE9g4w==} + peerDependencies: + '@waline/client': ^3.7.1 + artalk: ^2.9.1 + twikoo: ^1.6.41 + vuepress: 2.0.0-rc.26 + peerDependenciesMeta: + '@waline/client': + optional: true + artalk: + optional: true + twikoo: + optional: true + + '@vuepress/plugin-copy-code@2.0.0-rc.118': + resolution: {integrity: sha512-3NWcXF/2n3+3wpH60MkTCLPNjMzAhx03OFqIOHB8broJXPPBESrYWy0oJWtf2erwBtKzU8a28H2RxnXZNiO83Q==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-docsearch@2.0.0-rc.118': + resolution: {integrity: sha512-9Ym5TCHWazijWKrzHfEZrRh2BUlfqubT7F0gN8XuaCdxYLo9plHYbAHseiQtH1oGeC3pAXveqPL2qiqPHThvfA==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-git@2.0.0-rc.118': + resolution: {integrity: sha512-dOk4oW6O+Thmu9/+nJ5wuEtoBloKzXsGWJOm1An0lfiggR+Hmxqs06y7/kHyLU0KcM5qzgr4ycgH9Z3Dyq7JAg==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-markdown-chart@2.0.0-rc.118': + resolution: {integrity: sha512-T2sjNJHYoX8VmVye5UX5foxhr6kcYRiVze0r7w0SJWK2MxWBnTHFxATt549tlOVNWY6gBRvnJNdLCc282uEA2A==} + peerDependencies: + chart.js: ^4.4.7 + echarts: ^6.0.0 + flowchart.ts: ^3.0.1 + markmap-lib: ^0.18.11 + markmap-toolbar: ^0.18.10 + markmap-view: ^0.18.10 + mermaid: ^11.12.0 + vuepress: 2.0.0-rc.26 + peerDependenciesMeta: + chart.js: + optional: true + echarts: + optional: true + flowchart.ts: + optional: true + markmap-lib: + optional: true + markmap-toolbar: + optional: true + markmap-view: + optional: true + mermaid: + optional: true + + '@vuepress/plugin-markdown-hint@2.0.0-rc.118': + resolution: {integrity: sha512-wuhiQ3kJTK7SKOkwcjb1+VT1npxtdWL6+Lwn9frXlliGm1gTjGsaVeezSjzVeVOI5ZaUB4lEEr8Dkw7iwN4gxA==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-markdown-image@2.0.0-rc.118': + resolution: {integrity: sha512-ZvDvb8pmIn/9RfSvC0ChE93mt8yULFXfeJCpdRw/a3kV9zYmqxb33lRtg7Lo6jOBSDTjsVZE/orxb4kgeNWvkQ==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-markdown-include@2.0.0-rc.118': + resolution: {integrity: sha512-YGd5mTMRYJQUoq/+pEU+736+fMOG3oQQB5juX+rlsup/w89B7Crk4o/jdJIvncMzoEWGkX1yaWNmAyZdk+AEAw==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-markdown-math@2.0.0-rc.118': + resolution: {integrity: sha512-0uFbgMbAhrbnn625LSYs1GISr5LP+jUK49fgmU3m9YcpYNK/1X8pJ5uxQvDJqMdFN/umTvQpLxnzjFecoguB+g==} + peerDependencies: + '@mathjax/src': ^4.0.0 + katex: ^0.16.21 + vuepress: 2.0.0-rc.26 + peerDependenciesMeta: + '@mathjax/src': + optional: true + katex: + optional: true + + '@vuepress/plugin-nprogress@2.0.0-rc.118': + resolution: {integrity: sha512-f9vB4OARxm32VqGEDLF48Dui5O/uxOfUqaK0mJiYUVwRdNNJNNsKI4qWw+Fnk0KPHNBnCp/jnwhq0rQlzYUn4Q==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-photo-swipe@2.0.0-rc.118': + resolution: {integrity: sha512-P+zV6nU9SqI1zo4I+l3Wqz3ZpadymWJBQBdAU1vu0ladNyBpiXzJ63QgwXwpor34mc3qz2OHlHPrqd2704SQLw==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-reading-time@2.0.0-rc.118': + resolution: {integrity: sha512-vtIpNrnIONadIER8Jq/TqsMN66JnAdSI6WB9mCN8BuTj1ZZO+wgHQ65Mnj2Nv77hwl+ASSjVKkXpnJkJxVlqWA==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-replace-assets@2.0.0-rc.118': + resolution: {integrity: sha512-O5MP1TyfzYUo8LSessUfL70CNWs6OHqaqNXvxKBwMkiWyGj+NAwDDv5YPsk9UKDWe0EIawTjP4eWwxytKyX9Pg==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-seo@2.0.0-rc.118': + resolution: {integrity: sha512-z7ztlqK6vqwZyjGumBQbQ0QnaDR0XrCIdL4xN/xSE2xN3K8ua6fk0r8Chk1vDA/RhfZ89T2UFlCjaVN0CT+66w==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-shiki@2.0.0-rc.118': + resolution: {integrity: sha512-8hpO9IGmr7v3dFJy4u9sP3uDaR8X1b8nfvnkrfNdnkz8/rrp1MYdPESdWnkx0t+pDxX0Pxg3mDcohvuQHaBfig==} + peerDependencies: + '@vuepress/shiki-twoslash': 2.0.0-rc.118 + vuepress: 2.0.0-rc.26 + peerDependenciesMeta: + '@vuepress/shiki-twoslash': + optional: true + + '@vuepress/plugin-sitemap@2.0.0-rc.118': + resolution: {integrity: sha512-HOFA4U4Mm8UTc4A5+0citi2p9muMk6QnfJLeM2WZAMVkesOYEm0QPO5QkPoD3DCOKRB/wdP4cXwCT04ut133SA==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/plugin-watermark@2.0.0-rc.118': + resolution: {integrity: sha512-TbA6hbpMi6ZoXLEolomKJt8w+4wInEMaTGL4VIbBXQGciPZzdIr8/zyPluq7S7fP5Cnys86VX3iT/pY+gDAUSw==} + peerDependencies: + vuepress: 2.0.0-rc.26 + + '@vuepress/shared@2.0.0-rc.26': + resolution: {integrity: sha512-Zl9XNG/fYenZqzuYYGOfHzjmp1HCOj68gcJnJABOX1db0H35dkPSPsxuMjbTljClUqMlfj70CLeip/h04upGVw==} + + '@vuepress/utils@2.0.0-rc.26': + resolution: {integrity: sha512-RWzZrGQ0WLSWdELuxg7c6q1D9I22T5PfK/qNFkOsv9eD3gpUsU4jq4zAoumS8o+NRIWHovCJ9WnAhHD0Ns5zAw==} + + '@vueuse/core@14.0.0': + resolution: {integrity: sha512-d6tKRWkZE8IQElX2aHBxXOMD478fHIYV+Dzm2y9Ag122ICBpNKtGICiXKOhWU3L1kKdttDD9dCMS4bGP3jhCTQ==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@14.0.0': + resolution: {integrity: sha512-5A0X7q9qyLtM3xyghq5nK/NEESf7cpcZlkQgXTMuW4JWiAMYxc1ImdhhGrk4negFBsq3ejvAlRmLdNrkcTzk1Q==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@14.0.0': + resolution: {integrity: sha512-6yoGqbJcMldVCevkFiHDBTB1V5Hq+G/haPlGIuaFZHpXC0HADB0EN1ryQAAceiW+ryS3niUwvdFbGiqHqBrfVA==} + + '@vueuse/shared@14.0.0': + resolution: {integrity: sha512-mTCA0uczBgurRlwVaQHfG0Ja7UdGe4g9mwffiJmvLiTtp1G4AQyIjej6si/k8c8pUwTfVpNufck+23gXptPAkw==} + peerDependencies: + vue: ^3.5.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ai@5.0.89: + resolution: {integrity: sha512-8Nq+ZojGacQrupoJEQLrTDzT5VtR3gyp5AaqFSV3tzsAXlYQ9Igb7QE3yeoEdzOk5IRfDwWL7mDCUD+oBg1hDA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + algoliasearch@5.43.0: + resolution: {integrity: sha512-hbkK41JsuGYhk+atBDxlcKxskjDCh3OOEDpdKZPtw+3zucBqhlojRG5e5KtCmByGyYvwZswVeaSWglgLn2fibg==} + engines: {node: '>= 14.0.0'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + baseline-browser-mapping@2.8.25: + resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + hasBin: true + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + + bcrypt-ts@7.1.0: + resolution: {integrity: sha512-t/Dqr9YzYmn/+oPQBgotBPUuezpZD5CPBwapM5Ep1p3zsLmEycMdXOfZpWbztSBWJ41DlB7EluJBUDsAGSiUeQ==} + engines: {node: '>=20'} + + birpc@2.7.0: + resolution: {integrity: sha512-tub/wFGH49vNCm0xraykcY3TcRgX/3JsALYq/Lwrtti+bTyFHkCUAWF5wgYoie8P41wYwig2mIKiqoocr1EkEQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001754: + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.1.2: + resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + engines: {node: '>=20.18.1'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@3.3.0: + resolution: {integrity: sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==} + engines: {node: '>=18.20'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + corser@2.0.1: + resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} + engines: {node: '>= 0.4.0'} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.249: + resolution: {integrity: sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==} + + encoding-sniffer@0.2.1: + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + envinfo@7.20.0: + resolution: {integrity: sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==} + engines: {node: '>=4'} + hasBin: true + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + focus-trap@7.6.6: + resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-extra@11.3.2: + resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + giscus@1.6.0: + resolution: {integrity: sha512-Zrsi8r4t1LVW950keaWcsURuZUQwUaMKjvJgTCY125vkW6OiEBkatE7ScJDbpqKHdZwb///7FVC21SE3iFK3PQ==} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hash-sum@2.0.0: + resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-sanitize@5.0.2: + resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + htm@3.1.1: + resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-server@14.1.1: + resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} + engines: {node: '>=12'} + hasBin: true + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + katex@0.16.25: + resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==} + hasBin: true + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lit-element@4.2.1: + resolution: {integrity: sha512-WGAWRGzirAgyphK2urmYOV72tlvnxw7YfyLDgQ+OZnM9vQQBQnumQ7jUJe6unEzwGU3ahFOjuz1iz1jjrpCPuw==} + + lit-html@3.3.1: + resolution: {integrity: sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==} + + lit@3.3.1: + resolution: {integrity: sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + markdown-it-anchor@9.2.0: + resolution: {integrity: sha512-sa2ErMQ6kKOA4l31gLGYliFQrMKkqSO0ZJgGhDHKijPf0pNFM9vghjAh3gn26pS4JDRs7Iwa9S36gxm3vgZTzg==} + peerDependencies: + '@types/markdown-it': '*' + markdown-it: '*' + + markdown-it-container@4.0.0: + resolution: {integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==} + + markdown-it-emoji@3.0.0: + resolution: {integrity: sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==} + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + marked@16.4.2: + resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.3: + resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + ora@9.0.0: + resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + engines: {node: '>=20'} + + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + + parse5-htmlparser2-tree-adapter@7.1.0: + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} + + parse5-parser-stream@7.1.2: + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + photoswipe@5.4.4: + resolution: {integrity: sha512-WNFHoKrkZNnvFFhbHL93WDkW3ifwVOXSW3w1UuZZelSmgXpIGiZSNlZJq37rR8YejqME2rHs9EhH9ZvlvFH2NA==} + engines: {node: '>= 0.12.0'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + portfinder@1.0.38: + resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} + engines: {node: '>= 10.12'} + + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} + peerDependencies: + jiti: '>=1.21.0' + postcss: '>=8.0.9' + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.0.1: + resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-sanitize@6.0.0: + resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.53.1: + resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.3: + resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + secure-compare@3.0.1: + resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + + shiki@3.15.0: + resolution: {integrity: sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sitemap@8.0.2: + resolution: {integrity: sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + superjson@2.2.5: + resolution: {integrity: sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + swr@2.3.6: + resolution: {integrity: sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + synckit@0.11.11: + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tm-grammars@1.25.3: + resolution: {integrity: sha512-3o/WgiU7JfzK04KnzilL7m4FUMttlR/+dN0oYtta2J7DWdO/dwFNg/RkcqcpArYkNXKzCRe/74FP/fG5sT3m5w==} + + tm-themes@1.10.12: + resolution: {integrity: sha512-SXAgP6PhFy66shJ5SBY+K9/MMZH+PXEyGRbMQBMVPXDzXfKTUYeNiJ+hN2FS5hpOOY8u156+pGcoKmZ5oOf+Zw==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-debounce@4.0.0: + resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici@7.16.0: + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + union@0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unplugin@2.3.10: + resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} + engines: {node: '>=18.12.0'} + + upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@7.1.12: + resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vue-router@4.6.3: + resolution: {integrity: sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==} + peerDependencies: + vue: ^3.5.0 + + vue@3.5.24: + resolution: {integrity: sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuepress-plugin-md-power@1.0.0-rc.175: + resolution: {integrity: sha512-g6rUKbnixw0LtbCh7ecRY54Re0rTrknWyCqYQvi15MLDs8ugclDVzMHjbN/4GtUZUrCBVPqpmD9LVV2NiMdU5Q==} + peerDependencies: + artplayer: ^5.3.0 + dashjs: ^5.0.3 + esbuild: ^0.25.11 + hls.js: ^1.6.13 + less: ^4.4.2 + markdown-it: ^14.1.0 + mpegts.js: ^1.7.3 + pyodide: ^0.29.0 + sass: ^1.93.2 + sass-embedded: ^1.93.2 + stylus: ^0.64.0 + vuepress: 2.0.0-rc.26 + peerDependenciesMeta: + artplayer: + optional: true + dashjs: + optional: true + hls.js: + optional: true + less: + optional: true + markdown-it: + optional: true + mpegts.js: + optional: true + pyodide: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + + vuepress-theme-plume@1.0.0-rc.175: + resolution: {integrity: sha512-Md9qyuJMlC6G6e4ORDr3kBYOrVRnmGcVEAjc8NkQwiN30dLp9t/2aIYI6qbZHbEZwhjemVAM1K6vI1zR/9/VcA==} + engines: {node: ^20.6.0 || >=22.0.0} + peerDependencies: + '@iconify/json': ^2.2.402 + '@vuepress/shiki-twoslash': 2.0.0-rc.118 + gsap: ^3.13.0 + mathjax-full: ^3.2.2 + ogl: ^1.0.11 + postprocessing: ^6.37.8 + swiper: ^12.0.3 + three: ^0.180.0 + vuepress: 2.0.0-rc.26 + peerDependenciesMeta: + '@iconify/json': + optional: true + '@vuepress/shiki-twoslash': + optional: true + gsap: + optional: true + mathjax-full: + optional: true + ogl: + optional: true + postprocessing: + optional: true + swiper: + optional: true + three: + optional: true + + vuepress@2.0.0-rc.26: + resolution: {integrity: sha512-ztTS3m6Q2MAb6D26vM2UyU5nOuxIhIk37SSD3jTcKI00x4ha0FcwY3Cm0MAt6w58REBmkwNLPxN5iiulatHtbw==} + engines: {node: ^20.9.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@vuepress/bundler-vite': 2.0.0-rc.26 + '@vuepress/bundler-webpack': 2.0.0-rc.26 + vue: ^3.5.22 + peerDependenciesMeta: + '@vuepress/bundler-vite': + optional: true + '@vuepress/bundler-webpack': + optional: true + + watermark-js-plus@1.6.3: + resolution: {integrity: sha512-iCLOGf70KacIwjGF9MDViYxQcRiVwOH7l42qDHLeE2HeUsQD1EQuUC9cKRG/4SErTUmdqV3yf5WnKk2dRARHPQ==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod@4.1.12: + resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ai-sdk/gateway@2.0.7(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + '@vercel/oidc': 3.0.3 + zod: 4.1.12 + + '@ai-sdk/provider-utils@3.0.16(zod@4.1.12)': + dependencies: + '@ai-sdk/provider': 2.0.0 + '@standard-schema/spec': 1.0.0 + eventsource-parser: 3.0.6 + zod: 4.1.12 + + '@ai-sdk/provider@2.0.0': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@2.0.89(react@19.2.0)(zod@4.1.12)': + dependencies: + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + ai: 5.0.89(zod@4.1.12) + react: 19.2.0 + swr: 2.3.6(react@19.2.0) + throttleit: 2.1.0 + optionalDependencies: + zod: 4.1.12 + + '@algolia/abtesting@1.9.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/autocomplete-core@1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-shared@1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)': + dependencies: + '@algolia/client-search': 5.43.0 + algoliasearch: 5.43.0 + + '@algolia/client-abtesting@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-analytics@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-common@5.43.0': {} + + '@algolia/client-insights@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-personalization@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-query-suggestions@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/client-search@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/ingestion@1.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/monitoring@1.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/recommend@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + '@algolia/requester-browser-xhr@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + + '@algolia/requester-fetch@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + + '@algolia/requester-node-http@5.43.0': + dependencies: + '@algolia/client-common': 5.43.0 + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.5.0 + tinyexec: 1.0.2 + + '@antfu/utils@9.3.0': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@docsearch/core@4.3.1(react@19.2.0)': + optionalDependencies: + react: 19.2.0 + + '@docsearch/css@4.3.1': {} + + '@docsearch/js@4.3.1': + dependencies: + htm: 3.1.1 + + '@docsearch/react@4.3.1(@algolia/client-search@5.43.0)(react@19.2.0)(search-insights@2.17.3)': + dependencies: + '@ai-sdk/react': 2.0.89(react@19.2.0)(zod@4.1.12) + '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.43.0)(algoliasearch@5.43.0)(search-insights@2.17.3) + '@docsearch/core': 4.3.1(react@19.2.0) + '@docsearch/css': 4.3.1 + ai: 5.0.89(zod@4.1.12) + algoliasearch: 5.43.0 + marked: 16.4.2 + zod: 4.1.12 + optionalDependencies: + react: 19.2.0 + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.0.2': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.3.0 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + + '@iconify/vue@5.0.0(vue@3.5.24(typescript@5.9.3))': + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.24(typescript@5.9.3) + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@lit-labs/ssr-dom-shim@1.4.0': {} + + '@lit/reactive-element@2.1.1': + dependencies: + '@lit-labs/ssr-dom-shim': 1.4.0 + + '@mdit-vue/plugin-component@3.0.2': + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit-vue/plugin-frontmatter@3.0.2': + dependencies: + '@mdit-vue/types': 3.0.2 + '@types/markdown-it': 14.1.2 + gray-matter: 4.0.3 + markdown-it: 14.1.0 + + '@mdit-vue/plugin-headers@3.0.2': + dependencies: + '@mdit-vue/shared': 3.0.2 + '@mdit-vue/types': 3.0.2 + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit-vue/plugin-sfc@3.0.2': + dependencies: + '@mdit-vue/types': 3.0.2 + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit-vue/plugin-title@3.0.2': + dependencies: + '@mdit-vue/shared': 3.0.2 + '@mdit-vue/types': 3.0.2 + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit-vue/plugin-toc@3.0.2': + dependencies: + '@mdit-vue/shared': 3.0.2 + '@mdit-vue/types': 3.0.2 + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit-vue/shared@3.0.2': + dependencies: + '@mdit-vue/types': 3.0.2 + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit-vue/types@3.0.2': {} + + '@mdit/helper@0.22.1(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-alert@0.22.3(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-attrs@0.23.3(markdown-it@14.1.0)': + dependencies: + '@mdit/helper': 0.22.1(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-container@0.22.2(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-figure@0.22.2(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-footnote@0.22.3(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + '@mdit/plugin-img-lazyload@0.22.1(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-img-mark@0.22.2(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-img-size@0.22.3(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-include@0.22.2(markdown-it@14.1.0)': + dependencies: + '@mdit/helper': 0.22.1(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + upath: 2.0.1 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-katex-slim@0.24.0(katex@0.16.25)(markdown-it@14.1.0)': + dependencies: + '@mdit/helper': 0.22.1(markdown-it@14.1.0) + '@mdit/plugin-tex': 0.22.2(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + katex: 0.16.25 + markdown-it: 14.1.0 + + '@mdit/plugin-mark@0.22.1(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-mathjax-slim@0.24.0(markdown-it@14.1.0)': + dependencies: + '@mdit/plugin-tex': 0.22.2(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-plantuml@0.22.3(markdown-it@14.1.0)': + dependencies: + '@mdit/plugin-uml': 0.22.2(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-sub@0.22.2(markdown-it@14.1.0)': + dependencies: + '@mdit/helper': 0.22.1(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-sup@0.22.2(markdown-it@14.1.0)': + dependencies: + '@mdit/helper': 0.22.1(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-tab@0.22.3(markdown-it@14.1.0)': + dependencies: + '@mdit/helper': 0.22.1(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-tasklist@0.22.2(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-tex@0.22.2(markdown-it@14.1.0)': + dependencies: + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@mdit/plugin-uml@0.22.2(markdown-it@14.1.0)': + dependencies: + '@mdit/helper': 0.22.1(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + optionalDependencies: + markdown-it: 14.1.0 + + '@opentelemetry/api@1.9.0': {} + + '@pengzhanbo/utils@2.1.0': {} + + '@pkgr/core@0.2.9': {} + + '@rolldown/pluginutils@1.0.0-beta.29': {} + + '@rollup/rollup-android-arm-eabi@4.53.1': + optional: true + + '@rollup/rollup-android-arm64@4.53.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.1': + optional: true + + '@rollup/rollup-darwin-x64@4.53.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.1': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.1': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.1': + optional: true + + '@shikijs/core@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.3 + + '@shikijs/engine-oniguruma@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + + '@shikijs/themes@3.15.0': + dependencies: + '@shikijs/types': 3.15.0 + + '@shikijs/transformers@3.15.0': + dependencies: + '@shikijs/core': 3.15.0 + '@shikijs/types': 3.15.0 + + '@shikijs/types@3.15.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@standard-schema/spec@1.0.0': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.8': {} + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 24.10.0 + + '@types/hash-sum@1.0.2': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 24.10.0 + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it-emoji@3.0.1': + dependencies: + '@types/markdown-it': 14.1.2 + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/ms@2.1.0': {} + + '@types/node@17.0.45': {} + + '@types/node@24.10.0': + dependencies: + undici-types: 7.16.0 + + '@types/picomatch@4.0.2': {} + + '@types/sax@1.2.7': + dependencies: + '@types/node': 17.0.45 + + '@types/trusted-types@2.0.7': {} + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.3.0': {} + + '@vercel/oidc@3.0.3': {} + + '@vitejs/plugin-vue@6.0.1(vite@7.1.12(@types/node@24.10.0))(vue@3.5.24(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.12(@types/node@24.10.0) + vue: 3.5.24(typescript@5.9.3) + + '@vue/compiler-core@3.5.24': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.24 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.24': + dependencies: + '@vue/compiler-core': 3.5.24 + '@vue/shared': 3.5.24 + + '@vue/compiler-sfc@3.5.24': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.24 + '@vue/compiler-dom': 3.5.24 + '@vue/compiler-ssr': 3.5.24 + '@vue/shared': 3.5.24 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.24': + dependencies: + '@vue/compiler-dom': 3.5.24 + '@vue/shared': 3.5.24 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@8.0.3': + dependencies: + '@vue/devtools-kit': 8.0.3 + + '@vue/devtools-kit@8.0.3': + dependencies: + '@vue/devtools-shared': 8.0.3 + birpc: 2.7.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 2.0.0 + speakingurl: 14.0.1 + superjson: 2.2.5 + + '@vue/devtools-shared@8.0.3': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.24': + dependencies: + '@vue/shared': 3.5.24 + + '@vue/runtime-core@3.5.24': + dependencies: + '@vue/reactivity': 3.5.24 + '@vue/shared': 3.5.24 + + '@vue/runtime-dom@3.5.24': + dependencies: + '@vue/reactivity': 3.5.24 + '@vue/runtime-core': 3.5.24 + '@vue/shared': 3.5.24 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.24(vue@3.5.24(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.24 + '@vue/shared': 3.5.24 + vue: 3.5.24(typescript@5.9.3) + + '@vue/shared@3.5.24': {} + + '@vuepress-plume/plugin-fonts@1.0.0-rc.175(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + + '@vuepress-plume/plugin-search@1.0.0-rc.175(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + '@vueuse/integrations': 14.0.0(focus-trap@7.6.6)(vue@3.5.24(typescript@5.9.3)) + chokidar: 4.0.3 + focus-trap: 7.6.6 + mark.js: 8.11.1 + minisearch: 7.2.0 + p-map: 7.0.3 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - nprogress + - qrcode + - sortablejs + - typescript + - universal-cookie + + '@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3)': + dependencies: + '@vitejs/plugin-vue': 6.0.1(vite@7.1.12(@types/node@24.10.0))(vue@3.5.24(typescript@5.9.3)) + '@vuepress/bundlerutils': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/client': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/core': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/shared': 2.0.0-rc.26 + '@vuepress/utils': 2.0.0-rc.26 + autoprefixer: 10.4.21(postcss@8.5.6) + connect-history-api-fallback: 2.0.0 + postcss: 8.5.6 + postcss-load-config: 6.0.1(postcss@8.5.6) + rollup: 4.53.1 + vite: 7.1.12(@types/node@24.10.0) + vue: 3.5.24(typescript@5.9.3) + vue-router: 4.6.3(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - yaml + + '@vuepress/bundlerutils@2.0.0-rc.26(typescript@5.9.3)': + dependencies: + '@vuepress/client': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/core': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/shared': 2.0.0-rc.26 + '@vuepress/utils': 2.0.0-rc.26 + vue: 3.5.24(typescript@5.9.3) + vue-router: 4.6.3(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - supports-color + - typescript + + '@vuepress/cli@2.0.0-rc.26(typescript@5.9.3)': + dependencies: + '@vuepress/core': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/shared': 2.0.0-rc.26 + '@vuepress/utils': 2.0.0-rc.26 + cac: 6.7.14 + chokidar: 4.0.3 + envinfo: 7.20.0 + esbuild: 0.25.12 + transitivePeerDependencies: + - supports-color + - typescript + + '@vuepress/client@2.0.0-rc.26(typescript@5.9.3)': + dependencies: + '@vue/devtools-api': 8.0.3 + '@vue/devtools-kit': 8.0.3 + '@vuepress/shared': 2.0.0-rc.26 + vue: 3.5.24(typescript@5.9.3) + vue-router: 4.6.3(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/core@2.0.0-rc.26(typescript@5.9.3)': + dependencies: + '@vuepress/client': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/markdown': 2.0.0-rc.26 + '@vuepress/shared': 2.0.0-rc.26 + '@vuepress/utils': 2.0.0-rc.26 + vue: 3.5.24(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + - typescript + + '@vuepress/helper@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vue/shared': 3.5.24 + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + cheerio: 1.1.2 + fflate: 0.8.2 + gray-matter: 4.0.3 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/highlighter-helper@2.0.0-rc.118(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + optionalDependencies: + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + + '@vuepress/markdown@2.0.0-rc.26': + dependencies: + '@mdit-vue/plugin-component': 3.0.2 + '@mdit-vue/plugin-frontmatter': 3.0.2 + '@mdit-vue/plugin-headers': 3.0.2 + '@mdit-vue/plugin-sfc': 3.0.2 + '@mdit-vue/plugin-title': 3.0.2 + '@mdit-vue/plugin-toc': 3.0.2 + '@mdit-vue/shared': 3.0.2 + '@mdit-vue/types': 3.0.2 + '@types/markdown-it': 14.1.2 + '@types/markdown-it-emoji': 3.0.1 + '@vuepress/shared': 2.0.0-rc.26 + '@vuepress/utils': 2.0.0-rc.26 + markdown-it: 14.1.0 + markdown-it-anchor: 9.2.0(@types/markdown-it@14.1.2)(markdown-it@14.1.0) + markdown-it-emoji: 3.0.0 + mdurl: 2.0.0 + transitivePeerDependencies: + - supports-color + + '@vuepress/plugin-cache@2.0.0-rc.118(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + ci-info: 4.3.1 + lru-cache: 11.2.2 + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + + '@vuepress/plugin-comment@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + giscus: 1.6.0 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-copy-code@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-docsearch@2.0.0-rc.118(@algolia/client-search@5.43.0)(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@docsearch/css': 4.3.1 + '@docsearch/js': 4.3.1 + '@docsearch/react': 4.3.1(@algolia/client-search@5.43.0)(react@19.2.0)(search-insights@2.17.3) + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + ts-debounce: 4.0.0 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - react + - react-dom + - search-insights + - typescript + + '@vuepress/plugin-git@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + rehype-parse: 9.0.1 + rehype-sanitize: 6.0.0 + rehype-stringify: 10.0.1 + unified: 11.0.5 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-markdown-chart@2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@mdit/plugin-container': 0.22.2(markdown-it@14.1.0) + '@mdit/plugin-plantuml': 0.22.3(markdown-it@14.1.0) + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - markdown-it + - typescript + + '@vuepress/plugin-markdown-hint@2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@mdit/plugin-alert': 0.22.3(markdown-it@14.1.0) + '@mdit/plugin-container': 0.22.2(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - markdown-it + - typescript + - vue + + '@vuepress/plugin-markdown-image@2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@mdit/plugin-figure': 0.22.2(markdown-it@14.1.0) + '@mdit/plugin-img-lazyload': 0.22.1(markdown-it@14.1.0) + '@mdit/plugin-img-mark': 0.22.2(markdown-it@14.1.0) + '@mdit/plugin-img-size': 0.22.3(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - markdown-it + - typescript + + '@vuepress/plugin-markdown-include@2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@mdit/plugin-include': 0.22.2(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - markdown-it + - typescript + + '@vuepress/plugin-markdown-math@2.0.0-rc.118(katex@0.16.25)(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@mdit/plugin-katex-slim': 0.24.0(katex@0.16.25)(markdown-it@14.1.0) + '@mdit/plugin-mathjax-slim': 0.24.0(markdown-it@14.1.0) + '@types/markdown-it': 14.1.2 + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + optionalDependencies: + katex: 0.16.25 + transitivePeerDependencies: + - markdown-it + - typescript + + '@vuepress/plugin-nprogress@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-photo-swipe@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + photoswipe: 5.4.4 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-reading-time@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-replace-assets@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + magic-string: 0.30.21 + unplugin: 2.3.10 + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-seo@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-shiki@2.0.0-rc.118(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@shikijs/transformers': 3.15.0 + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/highlighter-helper': 2.0.0-rc.118(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + nanoid: 5.1.6 + shiki: 3.15.0 + synckit: 0.11.11 + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - '@vueuse/core' + - typescript + + '@vuepress/plugin-sitemap@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + sitemap: 8.0.2 + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + transitivePeerDependencies: + - typescript + + '@vuepress/plugin-watermark@2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)))': + dependencies: + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + watermark-js-plus: 1.6.3 + transitivePeerDependencies: + - typescript + + '@vuepress/shared@2.0.0-rc.26': + dependencies: + '@mdit-vue/types': 3.0.2 + + '@vuepress/utils@2.0.0-rc.26': + dependencies: + '@types/debug': 4.1.12 + '@types/fs-extra': 11.0.4 + '@types/hash-sum': 1.0.2 + '@types/picomatch': 4.0.2 + '@vuepress/shared': 2.0.0-rc.26 + debug: 4.4.3 + fs-extra: 11.3.2 + hash-sum: 2.0.0 + ora: 9.0.0 + picocolors: 1.1.1 + picomatch: 4.0.3 + tinyglobby: 0.2.15 + upath: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.0.0 + '@vueuse/shared': 14.0.0(vue@3.5.24(typescript@5.9.3)) + vue: 3.5.24(typescript@5.9.3) + + '@vueuse/integrations@14.0.0(focus-trap@7.6.6)(vue@3.5.24(typescript@5.9.3))': + dependencies: + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + '@vueuse/shared': 14.0.0(vue@3.5.24(typescript@5.9.3)) + vue: 3.5.24(typescript@5.9.3) + optionalDependencies: + focus-trap: 7.6.6 + + '@vueuse/metadata@14.0.0': {} + + '@vueuse/shared@14.0.0(vue@3.5.24(typescript@5.9.3))': + dependencies: + vue: 3.5.24(typescript@5.9.3) + + acorn@8.15.0: {} + + ai@5.0.89(zod@4.1.12): + dependencies: + '@ai-sdk/gateway': 2.0.7(zod@4.1.12) + '@ai-sdk/provider': 2.0.0 + '@ai-sdk/provider-utils': 3.0.16(zod@4.1.12) + '@opentelemetry/api': 1.9.0 + zod: 4.1.12 + + algoliasearch@5.43.0: + dependencies: + '@algolia/abtesting': 1.9.0 + '@algolia/client-abtesting': 5.43.0 + '@algolia/client-analytics': 5.43.0 + '@algolia/client-common': 5.43.0 + '@algolia/client-insights': 5.43.0 + '@algolia/client-personalization': 5.43.0 + '@algolia/client-query-suggestions': 5.43.0 + '@algolia/client-search': 5.43.0 + '@algolia/ingestion': 1.43.0 + '@algolia/monitoring': 1.43.0 + '@algolia/recommend': 5.43.0 + '@algolia/requester-browser-xhr': 5.43.0 + '@algolia/requester-fetch': 5.43.0 + '@algolia/requester-node-http': 5.43.0 + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + async@3.2.6: {} + + autoprefixer@10.4.21(postcss@8.5.6): + dependencies: + browserslist: 4.27.0 + caniuse-lite: 1.0.30001754 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-value-parser: 4.2.0 + + bail@2.0.2: {} + + baseline-browser-mapping@2.8.25: {} + + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + + bcrypt-ts@7.1.0: {} + + birpc@2.7.0: {} + + boolbase@1.0.0: {} + + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.25 + caniuse-lite: 1.0.30001754 + electron-to-chromium: 1.5.249 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + + cac@6.7.14: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + caniuse-lite@1.0.30001754: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.2.2 + css-what: 6.2.2 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + + cheerio@1.1.2: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + encoding-sniffer: 0.2.1 + htmlparser2: 10.0.0 + parse5: 7.3.0 + parse5-htmlparser2-tree-adapter: 7.1.0 + parse5-parser-stream: 7.1.2 + undici: 7.16.0 + whatwg-mimetype: 4.0.0 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + ci-info@4.3.1: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@3.3.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + comma-separated-tokens@2.0.3: {} + + commander@8.3.0: {} + + confbox@0.1.8: {} + + confbox@0.2.2: {} + + connect-history-api-fallback@2.0.0: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + corser@2.0.1: {} + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + csstype@3.1.3: {} + + dayjs@1.11.19: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + dequal@2.0.3: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.249: {} + + encoding-sniffer@0.2.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-encoding: 3.1.1 + + entities@4.5.0: {} + + entities@6.0.1: {} + + envinfo@7.20.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + escalade@3.2.0: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + eventemitter3@4.0.7: {} + + eventsource-parser@3.0.6: {} + + exsolve@1.0.7: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fflate@0.8.2: {} + + focus-trap@7.6.6: + dependencies: + tabbable: 6.3.0 + + follow-redirects@1.15.11: {} + + fraction.js@4.3.7: {} + + fs-extra@11.3.2: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + giscus@1.6.0: + dependencies: + lit: 3.3.1 + + globals@15.15.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hash-sum@2.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-sanitize@5.0.2: + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.3.0 + unist-util-position: 5.0.0 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + he@1.2.0: {} + + hookable@5.5.3: {} + + htm@3.1.1: {} + + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + + html-void-elements@3.0.0: {} + + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.11 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-server@14.1.1: + dependencies: + basic-auth: 2.0.1 + chalk: 4.1.2 + corser: 2.0.1 + he: 1.2.0 + html-encoding-sniffer: 3.0.0 + http-proxy: 1.18.1 + mime: 1.6.0 + minimist: 1.2.8 + opener: 1.5.2 + portfinder: 1.0.38 + secure-compare: 3.0.1 + union: 0.5.0 + url-join: 4.0.1 + transitivePeerDependencies: + - debug + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + image-size@2.0.2: {} + + is-extendable@0.1.1: {} + + is-interactive@2.0.0: {} + + is-plain-obj@4.1.0: {} + + is-unicode-supported@2.1.0: {} + + is-what@5.5.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-schema@0.4.0: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + katex@0.16.25: + dependencies: + commander: 8.3.0 + + kind-of@6.0.3: {} + + kolorist@1.8.0: {} + + lilconfig@3.1.3: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lit-element@4.2.1: + dependencies: + '@lit-labs/ssr-dom-shim': 1.4.0 + '@lit/reactive-element': 2.1.1 + lit-html: 3.3.1 + + lit-html@3.3.1: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.1: + dependencies: + '@lit/reactive-element': 2.1.1 + lit-element: 4.2.1 + lit-html: 3.3.1 + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + lru-cache@11.2.2: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mark.js@8.11.1: {} + + markdown-it-anchor@9.2.0(@types/markdown-it@14.1.2)(markdown-it@14.1.0): + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + markdown-it-container@4.0.0: {} + + markdown-it-emoji@3.0.0: {} + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + marked@16.4.2: {} + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdurl@2.0.0: {} + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + mime@1.6.0: {} + + mimic-function@5.0.1: {} + + minimist@1.2.8: {} + + minisearch@7.2.0: {} + + mitt@3.0.1: {} + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + node-releases@2.0.27: {} + + normalize-range@0.1.2: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-inspect@1.13.4: {} + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.3: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + + opener@1.5.2: {} + + ora@9.0.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.3.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.2.2 + string-width: 8.1.0 + strip-ansi: 7.1.2 + + p-map@7.0.3: {} + + package-manager-detector@1.5.0: {} + + parse5-htmlparser2-tree-adapter@7.1.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.3.0 + + parse5-parser-stream@7.1.2: + dependencies: + parse5: 7.3.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + pathe@2.0.3: {} + + perfect-debounce@2.0.0: {} + + photoswipe@5.4.4: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + + portfinder@1.0.38: + dependencies: + async: 3.2.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + postcss-load-config@6.0.1(postcss@8.5.6): + dependencies: + lilconfig: 3.1.3 + optionalDependencies: + postcss: 8.5.6 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + property-information@7.1.0: {} + + punycode.js@2.3.1: {} + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.11: {} + + react@19.2.0: {} + + readdirp@4.1.2: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.0.1: + dependencies: + regex-utilities: 2.3.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-sanitize@6.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-sanitize: 5.0.2 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + requires-port@1.0.0: {} + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + rfdc@1.4.1: {} + + rollup@4.53.1: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.1 + '@rollup/rollup-android-arm64': 4.53.1 + '@rollup/rollup-darwin-arm64': 4.53.1 + '@rollup/rollup-darwin-x64': 4.53.1 + '@rollup/rollup-freebsd-arm64': 4.53.1 + '@rollup/rollup-freebsd-x64': 4.53.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.1 + '@rollup/rollup-linux-arm-musleabihf': 4.53.1 + '@rollup/rollup-linux-arm64-gnu': 4.53.1 + '@rollup/rollup-linux-arm64-musl': 4.53.1 + '@rollup/rollup-linux-loong64-gnu': 4.53.1 + '@rollup/rollup-linux-ppc64-gnu': 4.53.1 + '@rollup/rollup-linux-riscv64-gnu': 4.53.1 + '@rollup/rollup-linux-riscv64-musl': 4.53.1 + '@rollup/rollup-linux-s390x-gnu': 4.53.1 + '@rollup/rollup-linux-x64-gnu': 4.53.1 + '@rollup/rollup-linux-x64-musl': 4.53.1 + '@rollup/rollup-openharmony-arm64': 4.53.1 + '@rollup/rollup-win32-arm64-msvc': 4.53.1 + '@rollup/rollup-win32-ia32-msvc': 4.53.1 + '@rollup/rollup-win32-x64-gnu': 4.53.1 + '@rollup/rollup-win32-x64-msvc': 4.53.1 + fsevents: 2.3.3 + + safe-buffer@5.1.2: {} + + safer-buffer@2.1.2: {} + + sax@1.4.3: {} + + search-insights@2.17.3: {} + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + secure-compare@3.0.1: {} + + shiki@3.15.0: + dependencies: + '@shikijs/core': 3.15.0 + '@shikijs/engine-javascript': 3.15.0 + '@shikijs/engine-oniguruma': 3.15.0 + '@shikijs/langs': 3.15.0 + '@shikijs/themes': 3.15.0 + '@shikijs/types': 3.15.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + sitemap@8.0.2: + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.4.3 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + sprintf-js@1.0.3: {} + + stdin-discarder@0.2.2: {} + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strip-bom-string@1.0.0: {} + + superjson@2.2.5: + dependencies: + copy-anything: 4.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + swr@2.3.6(react@19.2.0): + dependencies: + dequal: 2.0.3 + react: 19.2.0 + use-sync-external-store: 1.6.0(react@19.2.0) + + synckit@0.11.11: + dependencies: + '@pkgr/core': 0.2.9 + + tabbable@6.3.0: {} + + throttleit@2.1.0: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tm-grammars@1.25.3: {} + + tm-themes@1.10.12: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-debounce@4.0.0: {} + + typescript@5.9.3: {} + + uc.micro@2.1.0: {} + + ufo@1.6.1: {} + + undici-types@7.16.0: {} + + undici@7.16.0: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + union@0.5.0: + dependencies: + qs: 6.14.0 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@2.0.1: {} + + unplugin@2.3.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 + webpack-virtual-modules: 0.6.2 + + upath@2.0.1: {} + + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + url-join@4.0.1: {} + + use-sync-external-store@1.6.0(react@19.2.0): + dependencies: + react: 19.2.0 + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@7.1.12(@types/node@24.10.0): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.1 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.0 + fsevents: 2.3.3 + + vue-router@4.6.3(vue@3.5.24(typescript@5.9.3)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.24(typescript@5.9.3) + + vue@3.5.24(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.24 + '@vue/compiler-sfc': 3.5.24 + '@vue/runtime-dom': 3.5.24 + '@vue/server-renderer': 3.5.24(vue@3.5.24(typescript@5.9.3)) + '@vue/shared': 3.5.24 + optionalDependencies: + typescript: 5.9.3 + + vuepress-plugin-md-power@1.0.0-rc.175(esbuild@0.25.12)(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))): + dependencies: + '@mdit/plugin-attrs': 0.23.3(markdown-it@14.1.0) + '@mdit/plugin-footnote': 0.22.3(markdown-it@14.1.0) + '@mdit/plugin-mark': 0.22.1(markdown-it@14.1.0) + '@mdit/plugin-sub': 0.22.2(markdown-it@14.1.0) + '@mdit/plugin-sup': 0.22.2(markdown-it@14.1.0) + '@mdit/plugin-tab': 0.22.3(markdown-it@14.1.0) + '@mdit/plugin-tasklist': 0.22.2(markdown-it@14.1.0) + '@pengzhanbo/utils': 2.1.0 + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + chokidar: 4.0.3 + esbuild: 0.25.12 + image-size: 2.0.2 + local-pkg: 1.1.2 + lru-cache: 11.2.2 + markdown-it-container: 4.0.0 + nanoid: 5.1.6 + shiki: 3.15.0 + tm-grammars: 1.25.3 + tm-themes: 1.10.12 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + optionalDependencies: + markdown-it: 14.1.0 + transitivePeerDependencies: + - typescript + + vuepress-theme-plume@1.0.0-rc.175(@algolia/client-search@5.43.0)(markdown-it@14.1.0)(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))): + dependencies: + '@iconify/utils': 3.0.2 + '@iconify/vue': 5.0.0(vue@3.5.24(typescript@5.9.3)) + '@pengzhanbo/utils': 2.1.0 + '@vuepress-plume/plugin-fonts': 1.0.0-rc.175(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress-plume/plugin-search': 1.0.0-rc.175(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/helper': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-cache': 2.0.0-rc.118(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-comment': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-copy-code': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-docsearch': 2.0.0-rc.118(@algolia/client-search@5.43.0)(react@19.2.0)(search-insights@2.17.3)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-git': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-markdown-chart': 2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-markdown-hint': 2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-markdown-image': 2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-markdown-include': 2.0.0-rc.118(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-markdown-math': 2.0.0-rc.118(katex@0.16.25)(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-nprogress': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-photo-swipe': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-reading-time': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-replace-assets': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-seo': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-shiki': 2.0.0-rc.118(@vueuse/core@14.0.0(vue@3.5.24(typescript@5.9.3)))(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-sitemap': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vuepress/plugin-watermark': 2.0.0-rc.118(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + '@vueuse/core': 14.0.0(vue@3.5.24(typescript@5.9.3)) + bcrypt-ts: 7.1.0 + chokidar: 4.0.3 + dayjs: 1.11.19 + esbuild: 0.25.12 + gray-matter: 4.0.3 + js-yaml: 4.1.0 + katex: 0.16.25 + local-pkg: 1.1.2 + nanoid: 5.1.6 + p-map: 7.0.3 + package-manager-detector: 1.5.0 + picomatch: 4.0.3 + vue: 3.5.24(typescript@5.9.3) + vuepress: 2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)) + vuepress-plugin-md-power: 1.0.0-rc.175(esbuild@0.25.12)(markdown-it@14.1.0)(typescript@5.9.3)(vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3))) + transitivePeerDependencies: + - '@algolia/client-search' + - '@mathjax/src' + - '@types/react' + - '@waline/client' + - artalk + - artplayer + - async-validator + - axios + - change-case + - chart.js + - dashjs + - drauu + - echarts + - flowchart.ts + - fuse.js + - hls.js + - idb-keyval + - jwt-decode + - less + - markdown-it + - markmap-lib + - markmap-toolbar + - markmap-view + - mermaid + - mpegts.js + - nprogress + - pyodide + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - supports-color + - twikoo + - typescript + - universal-cookie + + vuepress@2.0.0-rc.26(@vuepress/bundler-vite@2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3))(typescript@5.9.3)(vue@3.5.24(typescript@5.9.3)): + dependencies: + '@vuepress/cli': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/client': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/core': 2.0.0-rc.26(typescript@5.9.3) + '@vuepress/markdown': 2.0.0-rc.26 + '@vuepress/shared': 2.0.0-rc.26 + '@vuepress/utils': 2.0.0-rc.26 + vue: 3.5.24(typescript@5.9.3) + optionalDependencies: + '@vuepress/bundler-vite': 2.0.0-rc.26(@types/node@24.10.0)(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + - typescript + + watermark-js-plus@1.6.3: {} + + web-namespaces@2.0.1: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + yoctocolors@2.1.2: {} + + zod@4.1.12: {} + + zwitch@2.0.4: {} diff --git a/vercel.json b/vercel.json new file mode 100644 index 0000000..129e441 --- /dev/null +++ b/vercel.json @@ -0,0 +1,6 @@ +{ + "framework": null, + "buildCommand": "pnpm run docs:build", + "installCommand": "pnpm install", + "outputDirectory": "docs/.vuepress/dist" +}