diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..eece8af
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,64 @@
+# 构建 VitePress 站点并将其部署到 GitHub Pages 的示例工作流程
+#
+name: Deploy VitePress site to Pages
+
+on:
+ # 在针对 `main` 分支的推送上运行。如果你
+ # 使用 `master` 分支作为默认分支,请将其更改为 `master`
+ push:
+ branches: [main]
+
+ # 允许你从 Actions 选项卡手动运行此工作流程
+ workflow_dispatch:
+
+# 设置 GITHUB_TOKEN 的权限,以允许部署到 GitHub Pages
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+# 只允许同时进行一次部署,跳过正在运行和最新队列之间的运行队列
+# 但是,不要取消正在进行的运行,因为我们希望允许这些生产部署完成
+concurrency:
+ group: pages
+ cancel-in-progress: false
+
+jobs:
+ # 构建工作
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # 如果未启用 lastUpdated,则不需要
+ # - uses: pnpm/action-setup@v3 # 如果使用 pnpm,请取消注释
+ # - uses: oven-sh/setup-bun@v1 # 如果使用 Bun,请取消注释
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm # 或 pnpm / yarn
+ - name: Setup Pages
+ uses: actions/configure-pages@v4
+ - name: Install dependencies
+ run: npm ci # 或 pnpm install / yarn install / bun install
+ - name: Build with VitePress
+ run: npm run docs:build # 或 pnpm docs:build / yarn docs:build / bun run docs:build
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/.vitepress/dist
+
+ # 部署工作
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ needs: build
+ runs-on: ubuntu-latest
+ name: Deploy
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 5246620..9f0a50d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -161,3 +161,5 @@ cython_debug/
.idea
+node_modules
+docs/.vitepress/cache
\ No newline at end of file
diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs
new file mode 100644
index 0000000..6840f6b
--- /dev/null
+++ b/docs/.vitepress/config.mjs
@@ -0,0 +1,51 @@
+import {defineConfig} from 'vitepress'
+
+// https://vitepress.dev/reference/site-config
+export default defineConfig({
+ title: "程序员阿江-Relakkes的爬虫教程",
+ description: "程序员阿江-Relakkes的爬虫教程",
+ lastUpdated: true,
+ themeConfig: {
+ search: {
+ provider: 'local'
+ },
+ // https://vitepress.dev/reference/default-theme-config
+ nav: [
+ {text: '首页', link: '/'},
+ {text: 'B站主页', link: 'https://space.bilibili.com/434377496'},
+ {text: '联系作者', link: 'https://github.com/NanmiCoder'},
+ ],
+
+ sidebar: [
+ {
+ text: 'Python爬虫入门',
+ collapsed: false,
+ items: [
+ {text: '01_为什么要写这个爬虫教程', link: '/爬虫入门/01_为什么要写这个爬虫教程'},
+ {text: '02_个人学会爬虫能赚钱吗', link: '/爬虫入门/02_个人学会爬虫能赚钱吗'},
+ {text: '03_网络爬虫到底是什么', link: '/爬虫入门/03_网络爬虫到底是什么'},
+ {text: '04_爬虫的基本工作原理', link: '/爬虫入门/04_爬虫的基本工作原理'},
+ {text: '05_常用的抓包工具有那些', link: '/爬虫入门/05_常用的抓包工具有那些'},
+ {
+ text: '06_Python写爬虫的优势',
+ link: '/爬虫入门/06_为什么说用Python写爬虫有天生优势'
+ },
+ {text: '07_Python常见的网络请求库', link: '/爬虫入门/07_Python常见的网络请求库'},
+ {text: '08_入门实战1_静态网页数据提取', link: '/爬虫入门/08_爬虫入门实战1_静态网页数据提取'},
+ {text: '09_入门实战2_动态数据提取', link: '/爬虫入门/09_爬虫入门实战2_动态数据提取'},
+ {text: '10_入门实战3_数据存储实现', link: '/爬虫入门/10_爬虫入门实战3_数据存储实现'},
+ {text: '11_入门实战4_高效率的爬虫实现', link: '/爬虫入门/11_爬虫入门实战4_高效率的爬虫实现'},
+ {
+ text: '12_入门实战5_编写易于维护的代码',
+ link: '/爬虫入门/12_爬虫入门实战5_编写易于维护的爬虫代码'
+ }
+ ]
+ }
+ ],
+
+ socialLinks: [
+ {icon: 'github', link: 'https://github.com/NanmiCoder/CrawlerTutorial'}
+ ]
+ },
+
+})
diff --git a/docs/.vitepress/theme/custom.css b/docs/.vitepress/theme/custom.css
new file mode 100644
index 0000000..fcc8e90
--- /dev/null
+++ b/docs/.vitepress/theme/custom.css
@@ -0,0 +1,9 @@
+/* .vitepress/theme/custom.css */
+/**
+ * Component: Sidebar
+ * -------------------------------------------------------------------------- */
+
+:root {
+ --vp-sidebar-width: 285px;
+ --vp-sidebar-bg-color: var(--vp-c-bg-alt);
+}
\ No newline at end of file
diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js
new file mode 100644
index 0000000..bed9095
--- /dev/null
+++ b/docs/.vitepress/theme/index.js
@@ -0,0 +1,5 @@
+// .vitepress/theme/index.js
+import DefaultTheme from 'vitepress/theme'
+import './custom.css'
+
+export default DefaultTheme
\ No newline at end of file
diff --git a/README.md b/docs/index.md
similarity index 69%
rename from README.md
rename to docs/index.md
index 212c30e..f19a7bd 100644
--- a/README.md
+++ b/docs/index.md
@@ -1,8 +1,7 @@
-## 关于作者
+# 关于作者
大家好,我是程序员阿江-Relakkes,近期我会给大家出一些爬虫方面的教程,爬虫入门、进阶、高级都有,有需要的朋友,star仓库并持续关注本仓库的更新。
-### 基本信息
-- [自媒体爬虫MediaCrawler作者](https://github.com/NanmiCoder/MediaCrawler)
+- [Github万星开源自媒体爬虫仓库MediaCrawler作者](https://github.com/NanmiCoder/MediaCrawler)
- 全栈程序员,熟悉Python、Golang、JavaScript,工作中主要用Golang。
- 曾经主导并参与过百万级爬虫采集系统架构设计与编码
- 爬虫是一种技术兴趣爱好,参与爬虫有一种对抗的感觉,越难越兴奋。
@@ -14,20 +13,20 @@
- [x] [03_网络爬虫到底是什么](爬虫入门/03_网络爬虫到底是什么.md)
- [x] [04_爬虫的基本工作原理](爬虫入门/04_爬虫的基本工作原理.md)
- [x] [05_常用的抓包工具有那些](爬虫入门/05_常用的抓包工具有那些.md)
-- [x] [06_为什么说用Python写爬虫有天生优势](爬虫入门/06_为什么说用Python写爬虫有天生优势.md)
+- [x] [06_Python写爬虫的优势](爬虫入门/06_为什么说用Python写爬虫有天生优势.md)
- [x] [07_Python常见的网络请求库](爬虫入门/07_Python常见的网络请求库.md)
-- [x] [08_爬虫入门实战1_静态网页数据提取](爬虫入门/08_爬虫入门实战1_静态网页数据提取.md)
-- [x] [09_爬虫入门实战2_动态数据提取](爬虫入门/09_爬虫入门实战2_动态数据提取.md)
-- [x] [10_爬虫入门实战3_数据存储实现](爬虫入门/10_爬虫入门实战3_数据存储实现.md)
-- [ ] [11_爬虫入门实战4_高效率的爬虫实现](爬虫入门/11_爬虫入门实战4_高效率的爬虫实现.md)
-- [ ] [12_爬虫入门实战5_编写易于维护的爬虫代码](爬虫入门/12_爬虫入门实战5_编写易于维护的爬虫代码.md)
+- [x] [08_入门实战1_静态网页数据提取](爬虫入门/08_爬虫入门实战1_静态网页数据提取.md)
+- [x] [09_入门实战2_动态数据提取](爬虫入门/09_爬虫入门实战2_动态数据提取.md)
+- [x] [10_入门实战3_数据存储实现](爬虫入门/10_爬虫入门实战3_数据存储实现.md)
+- [ ] [11_入门实战4_高效率的爬虫实现](爬虫入门/11_爬虫入门实战4_高效率的爬虫实现.md)
+- [ ] [12_入门实战5_编写易于维护的爬虫代码](爬虫入门/12_爬虫入门实战5_编写易于维护的爬虫代码.md)
+## 爬虫进阶
+## 高级爬虫
## 爬虫交流群
可以加作者wx拉进群: yzglan,备注来自github爬虫教程.
-## 爬虫进阶
-## 高级爬虫
## 免责声明
>本仓库的所有内容仅供学习和参考之用,禁止用于商业用途。任何人或组织不得将本仓库的内容用于非法用途或侵犯他人合法权益。本仓库所涉及的爬虫技术仅用于学习和研究,不得用于对其他平台进行大规模爬虫或其他非法行为。对于因使用本仓库内容而引起的任何法律责任,本仓库不承担任何责任。使用本仓库的内容即表示您同意本免责声明的所有条款和条件。
diff --git a/static/images/100000001.png b/docs/static/images/100000001.png
similarity index 100%
rename from static/images/100000001.png
rename to docs/static/images/100000001.png
diff --git a/static/images/1000000010.png b/docs/static/images/1000000010.png
similarity index 100%
rename from static/images/1000000010.png
rename to docs/static/images/1000000010.png
diff --git a/static/images/1000000011.png b/docs/static/images/1000000011.png
similarity index 100%
rename from static/images/1000000011.png
rename to docs/static/images/1000000011.png
diff --git a/static/images/1000000012.png b/docs/static/images/1000000012.png
similarity index 100%
rename from static/images/1000000012.png
rename to docs/static/images/1000000012.png
diff --git a/static/images/1000000013.png b/docs/static/images/1000000013.png
similarity index 100%
rename from static/images/1000000013.png
rename to docs/static/images/1000000013.png
diff --git a/static/images/1000000014.png b/docs/static/images/1000000014.png
similarity index 100%
rename from static/images/1000000014.png
rename to docs/static/images/1000000014.png
diff --git a/static/images/100000002.png b/docs/static/images/100000002.png
similarity index 100%
rename from static/images/100000002.png
rename to docs/static/images/100000002.png
diff --git a/static/images/100000003.png b/docs/static/images/100000003.png
similarity index 100%
rename from static/images/100000003.png
rename to docs/static/images/100000003.png
diff --git a/static/images/100000004.png b/docs/static/images/100000004.png
similarity index 100%
rename from static/images/100000004.png
rename to docs/static/images/100000004.png
diff --git a/static/images/100000005.png b/docs/static/images/100000005.png
similarity index 100%
rename from static/images/100000005.png
rename to docs/static/images/100000005.png
diff --git a/static/images/100000006.png b/docs/static/images/100000006.png
similarity index 100%
rename from static/images/100000006.png
rename to docs/static/images/100000006.png
diff --git a/static/images/100000007.png b/docs/static/images/100000007.png
similarity index 100%
rename from static/images/100000007.png
rename to docs/static/images/100000007.png
diff --git a/static/images/100000008.png b/docs/static/images/100000008.png
similarity index 100%
rename from static/images/100000008.png
rename to docs/static/images/100000008.png
diff --git a/static/images/100000009.png b/docs/static/images/100000009.png
similarity index 100%
rename from static/images/100000009.png
rename to docs/static/images/100000009.png
diff --git a/static/images/qrcode/1.JPG b/docs/static/images/qrcode/1.JPG
similarity index 100%
rename from static/images/qrcode/1.JPG
rename to docs/static/images/qrcode/1.JPG
diff --git a/static/images/rumen_08/img.png b/docs/static/images/rumen_08/img.png
similarity index 100%
rename from static/images/rumen_08/img.png
rename to docs/static/images/rumen_08/img.png
diff --git a/static/images/rumen_08/img_1.png b/docs/static/images/rumen_08/img_1.png
similarity index 100%
rename from static/images/rumen_08/img_1.png
rename to docs/static/images/rumen_08/img_1.png
diff --git a/static/images/rumen_08/img_10.png b/docs/static/images/rumen_08/img_10.png
similarity index 100%
rename from static/images/rumen_08/img_10.png
rename to docs/static/images/rumen_08/img_10.png
diff --git a/static/images/rumen_08/img_11.png b/docs/static/images/rumen_08/img_11.png
similarity index 100%
rename from static/images/rumen_08/img_11.png
rename to docs/static/images/rumen_08/img_11.png
diff --git a/static/images/rumen_08/img_12.png b/docs/static/images/rumen_08/img_12.png
similarity index 100%
rename from static/images/rumen_08/img_12.png
rename to docs/static/images/rumen_08/img_12.png
diff --git a/static/images/rumen_08/img_2.png b/docs/static/images/rumen_08/img_2.png
similarity index 100%
rename from static/images/rumen_08/img_2.png
rename to docs/static/images/rumen_08/img_2.png
diff --git a/static/images/rumen_08/img_3.png b/docs/static/images/rumen_08/img_3.png
similarity index 100%
rename from static/images/rumen_08/img_3.png
rename to docs/static/images/rumen_08/img_3.png
diff --git a/static/images/rumen_08/img_4.png b/docs/static/images/rumen_08/img_4.png
similarity index 100%
rename from static/images/rumen_08/img_4.png
rename to docs/static/images/rumen_08/img_4.png
diff --git a/static/images/rumen_08/img_5.png b/docs/static/images/rumen_08/img_5.png
similarity index 100%
rename from static/images/rumen_08/img_5.png
rename to docs/static/images/rumen_08/img_5.png
diff --git a/static/images/rumen_08/img_6.png b/docs/static/images/rumen_08/img_6.png
similarity index 100%
rename from static/images/rumen_08/img_6.png
rename to docs/static/images/rumen_08/img_6.png
diff --git a/static/images/rumen_08/img_7.png b/docs/static/images/rumen_08/img_7.png
similarity index 100%
rename from static/images/rumen_08/img_7.png
rename to docs/static/images/rumen_08/img_7.png
diff --git a/static/images/rumen_08/img_8.png b/docs/static/images/rumen_08/img_8.png
similarity index 100%
rename from static/images/rumen_08/img_8.png
rename to docs/static/images/rumen_08/img_8.png
diff --git a/static/images/rumen_08/img_9.png b/docs/static/images/rumen_08/img_9.png
similarity index 100%
rename from static/images/rumen_08/img_9.png
rename to docs/static/images/rumen_08/img_9.png
diff --git a/static/images/wechat_pay.jpeg b/docs/static/images/wechat_pay.jpeg
similarity index 100%
rename from static/images/wechat_pay.jpeg
rename to docs/static/images/wechat_pay.jpeg
diff --git a/static/images/zfb_pay.png b/docs/static/images/zfb_pay.png
similarity index 100%
rename from static/images/zfb_pay.png
rename to docs/static/images/zfb_pay.png
diff --git "a/static/images/\347\237\245\350\257\206\346\230\237\347\220\203.png" "b/docs/static/images/\347\237\245\350\257\206\346\230\237\347\220\203.png"
similarity index 100%
rename from "static/images/\347\237\245\350\257\206\346\230\237\347\220\203.png"
rename to "docs/static/images/\347\237\245\350\257\206\346\230\237\347\220\203.png"
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/01_\344\270\272\344\273\200\344\271\210\350\246\201\345\206\231\350\277\231\344\270\252\347\210\254\350\231\253\346\225\231\347\250\213.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/01_\344\270\272\344\273\200\344\271\210\350\246\201\345\206\231\350\277\231\344\270\252\347\210\254\350\231\253\346\225\231\347\250\213.md"
similarity index 98%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/01_\344\270\272\344\273\200\344\271\210\350\246\201\345\206\231\350\277\231\344\270\252\347\210\254\350\231\253\346\225\231\347\250\213.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/01_\344\270\272\344\273\200\344\271\210\350\246\201\345\206\231\350\277\231\344\270\252\347\210\254\350\231\253\346\225\231\347\250\213.md"
index ec197fb..4c15483 100644
--- "a/\347\210\254\350\231\253\345\205\245\351\227\250/01_\344\270\272\344\273\200\344\271\210\350\246\201\345\206\231\350\277\231\344\270\252\347\210\254\350\231\253\346\225\231\347\250\213.md"
+++ "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/01_\344\270\272\344\273\200\344\271\210\350\246\201\345\206\231\350\277\231\344\270\252\347\210\254\350\231\253\346\225\231\347\250\213.md"
@@ -1,4 +1,4 @@
-## 为什么写这个爬虫教程?
+# 为什么写这个爬虫教程?
- 满足需求:我的[自媒体平台爬虫](https://github.com/NanmiCoder/MediaCrawler)爆火了之后,越来越多人私信我都是问想要学习爬虫时,我意识到了有很多人对这个爬虫领域感兴趣,但却不知道从何入手。因此决定撰写这个爬虫教程。
- 分享经验:首先我这个人虽然技术一般,但是真的很喜欢分享,平时工作中我学到了什么新知识都迫不及待的想要跟身边同事去分享,所以既然大家有需要,那么我会分享自己在爬虫领域的一些经验知识和见解。
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/02_\344\270\252\344\272\272\345\255\246\344\274\232\347\210\254\350\231\253\350\203\275\350\265\232\351\222\261\345\220\227.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/02_\344\270\252\344\272\272\345\255\246\344\274\232\347\210\254\350\231\253\350\203\275\350\265\232\351\222\261\345\220\227.md"
similarity index 97%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/02_\344\270\252\344\272\272\345\255\246\344\274\232\347\210\254\350\231\253\350\203\275\350\265\232\351\222\261\345\220\227.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/02_\344\270\252\344\272\272\345\255\246\344\274\232\347\210\254\350\231\253\350\203\275\350\265\232\351\222\261\345\220\227.md"
index fbc753d..f897710 100644
--- "a/\347\210\254\350\231\253\345\205\245\351\227\250/02_\344\270\252\344\272\272\345\255\246\344\274\232\347\210\254\350\231\253\350\203\275\350\265\232\351\222\261\345\220\227.md"
+++ "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/02_\344\270\252\344\272\272\345\255\246\344\274\232\347\210\254\350\231\253\350\203\275\350\265\232\351\222\261\345\220\227.md"
@@ -1,4 +1,4 @@
-## 个人学会爬虫能赚钱吗?
+# 个人学会爬虫能赚钱吗?
**先说结论**
>肯定可以赚钱,关键在于挣得多还是少。掌握任何一门技术,都有赚钱的机会,因为技术需求一直存在。
@@ -13,7 +13,7 @@
爬虫挣钱的分类我基于我个人的经验总结了一下,大致分为三类,`兼职小活`、`长期雇佣关系`、`专职爬虫`,下面对这三类都做一个简单介绍
-### 1、兼职小活
+## 1、兼职小活
我们经常能在各种卖爬虫课直播间看到一些主播晒关于接单成交截图之类,其实这些截图我认为有真有假,可能大部分都是真的,因为市场是一个供需关系来的,有需求自然就有提供方,爬虫这个也不例外。
在现如今这个数据为王的时代。做事儿都需要有强有力的数据做支撑然后去做决策,而不是盲目的去做。我打个比方:
@@ -24,7 +24,7 @@
> 这类活我们可以把它统称为:兼职小活,特点:`客单价低`,`大多是一次性需求`,`花的时间相对少`。
-### 2、长期雇佣关系
+## 2、长期雇佣关系
长期雇佣关系这个从字面意思就比较好理解了,基于某一类固定需求,长期给需求方提供服务,这里我举一个我之前兼职遇到的客户吧
她是一个女生,她们公式是xxx相关的业务,她接到了领导的一个需求,需要定期出一份她们公司所在省份的xxx业务数据。
@@ -39,7 +39,7 @@
> 这类活我们可以把它统称为:长期雇佣关系, 特点:`客单价有高有低`,`大多为数据导出清洗需求`,`回购 or 复购`。
-### 3、专职爬虫
+## 3、专职爬虫
这一类就比较直观了,就是找一个`爬虫工程师`的工作,工作内容一般为:数据采集、数据清洗、爬虫系统设计与架构。
薪水的话拿一线城市举个例子吧,初级的话大概在8-14k 中高级 15 - 30k,当然这是一个参考区间,有的可能更高,有的可能稍微少点。
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/03_\347\275\221\347\273\234\347\210\254\350\231\253\345\210\260\345\272\225\346\230\257\344\273\200\344\271\210.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/03_\347\275\221\347\273\234\347\210\254\350\231\253\345\210\260\345\272\225\346\230\257\344\273\200\344\271\210.md"
similarity index 91%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/03_\347\275\221\347\273\234\347\210\254\350\231\253\345\210\260\345\272\225\346\230\257\344\273\200\344\271\210.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/03_\347\275\221\347\273\234\347\210\254\350\231\253\345\210\260\345\272\225\346\230\257\344\273\200\344\271\210.md"
index a447b68..d69762b 100644
--- "a/\347\210\254\350\231\253\345\205\245\351\227\250/03_\347\275\221\347\273\234\347\210\254\350\231\253\345\210\260\345\272\225\346\230\257\344\273\200\344\271\210.md"
+++ "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/03_\347\275\221\347\273\234\347\210\254\350\231\253\345\210\260\345\272\225\346\230\257\344\273\200\344\271\210.md"
@@ -1,7 +1,7 @@
-## 网络爬虫到底是什么?
+# 网络爬虫到底是什么?
![](../static/images/100000002.png)
-### 1、看看维基百科的定义
+## 1、看看维基百科的定义
> 网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。
> 网络搜索引擎等站点通过爬虫软件更新自身的网站内容或其对其他网站的索引。网络爬虫可以将自己所访问的页面保存下来,以便搜索引擎事后生成索引供用户搜索。
> 爬虫访问网站的过程会消耗目标系统资源。不少网络系统并不默许爬虫工作。因此在访问大量页面时,爬虫需要考虑到规划、负载,还需要讲“礼貌”。 不愿意被爬虫访问、被爬虫主人知晓的公开站点可以使用robots.txt文件之类的方法避免访问。这个文件可以要求机器人只对网站的一部分进行索引,或完全不作处理。
@@ -9,7 +9,7 @@
> 爬虫还可以验证超链接和HTML代码,用于网络抓取
-### 2、Google和百度搜索引擎是如何工作的呢?
+## 2、Google和百度搜索引擎是如何工作的呢?
- 首先,网络爬虫持续抓取网站内容,将其存储在搜索引擎的数据库中。
- 紧接着,索引程序对数据库中的网页进行整理,创建倒排索引。
- 最后,当用户输入查询关键词时,搜索程序会在索引中查找相关内容,并通过排序算法(例如Pagerank)将最相关的结果展现给用户。
@@ -22,22 +22,22 @@
为了解决这一问题,搜索引擎和网站之间形成了一种默契——robots.txt协议。网站通过这个文件指明哪些内容可以被爬虫抓取,哪些不可以;同时,搜索引擎在访问网站时会通过User-Agent标识自己的身份(如Googlebot、Baiduspider),以此保持双方的和平共处和互利共赢。
-### 3、爬虫Crawler的职责
-#### 抓取页面(Fetching)
+## 3、爬虫Crawler的职责
+### 抓取页面(Fetching)
网络爬虫会按照一定的规则和算法,访问网站上的页面并下载页面内容。这个过程需要考虑页面的深度、频率、并发请求数量等因素,以确保高效地获取数据。
-#### 解析页面(Parsing)
+### 解析页面(Parsing)
爬虫需要解析下载的页面内容,提取其中的文本、链接、图像等信息。通过解析页面,爬虫可以识别页面结构、内容特征以及与其他页面的关联。
-#### 处理链接(Link Handling)
+### 处理链接(Link Handling)
爬虫在解析页面时会提取页面中的链接,然后根据一定的策略处理这些链接。这包括去重、筛选、调度等操作,以确保爬虫系统能够高效地覆盖目标网站的内容。
-#### 存储数据(Storing)
+### 存储数据(Storing)
爬虫需要将抓取到的数据进行存储,通常存储在数据库或索引中。这样可以为后续的数据处理、索引建立和搜索提供支持。
-#### 遵守规则(Respect Robots.txt)
+### 遵守规则(Respect Robots.txt)
:爬虫需要遵守网站所有者制定的规则,比如robots.txt文件中定义的爬取限制。爬虫需要尊重网站的爬取策略,以避免对目标网站造成不必要的干扰。
-### 4、总结
+## 4、总结
网络爬虫在信息检索系统中扮演着数据搜集和处理的关键角色。通过抓取、解析、处理链接、存储数据、更新索引等一系列操作,网络爬虫为搜索引擎提供了高效的数据支持,帮助用户快速准确地获取所需信息。
\ No newline at end of file
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/04_\347\210\254\350\231\253\347\232\204\345\237\272\346\234\254\345\267\245\344\275\234\345\216\237\347\220\206.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/04_\347\210\254\350\231\253\347\232\204\345\237\272\346\234\254\345\267\245\344\275\234\345\216\237\347\220\206.md"
similarity index 100%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/04_\347\210\254\350\231\253\347\232\204\345\237\272\346\234\254\345\267\245\344\275\234\345\216\237\347\220\206.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/04_\347\210\254\350\231\253\347\232\204\345\237\272\346\234\254\345\267\245\344\275\234\345\216\237\347\220\206.md"
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/05_\345\270\270\347\224\250\347\232\204\346\212\223\345\214\205\345\267\245\345\205\267\346\234\211\351\202\243\344\272\233.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/05_\345\270\270\347\224\250\347\232\204\346\212\223\345\214\205\345\267\245\345\205\267\346\234\211\351\202\243\344\272\233.md"
similarity index 100%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/05_\345\270\270\347\224\250\347\232\204\346\212\223\345\214\205\345\267\245\345\205\267\346\234\211\351\202\243\344\272\233.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/05_\345\270\270\347\224\250\347\232\204\346\212\223\345\214\205\345\267\245\345\205\267\346\234\211\351\202\243\344\272\233.md"
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/06_\344\270\272\344\273\200\344\271\210\350\257\264\347\224\250Python\345\206\231\347\210\254\350\231\253\346\234\211\345\244\251\347\224\237\344\274\230\345\212\277.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/06_\344\270\272\344\273\200\344\271\210\350\257\264\347\224\250Python\345\206\231\347\210\254\350\231\253\346\234\211\345\244\251\347\224\237\344\274\230\345\212\277.md"
similarity index 100%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/06_\344\270\272\344\273\200\344\271\210\350\257\264\347\224\250Python\345\206\231\347\210\254\350\231\253\346\234\211\345\244\251\347\224\237\344\274\230\345\212\277.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/06_\344\270\272\344\273\200\344\271\210\350\257\264\347\224\250Python\345\206\231\347\210\254\350\231\253\346\234\211\345\244\251\347\224\237\344\274\230\345\212\277.md"
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/07_Python\345\270\270\350\247\201\347\232\204\347\275\221\347\273\234\350\257\267\346\261\202\345\272\223.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/07_Python\345\270\270\350\247\201\347\232\204\347\275\221\347\273\234\350\257\267\346\261\202\345\272\223.md"
similarity index 96%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/07_Python\345\270\270\350\247\201\347\232\204\347\275\221\347\273\234\350\257\267\346\261\202\345\272\223.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/07_Python\345\270\270\350\247\201\347\232\204\347\275\221\347\273\234\350\257\267\346\261\202\345\272\223.md"
index 053ecfd..af1ef51 100644
--- "a/\347\210\254\350\231\253\345\205\245\351\227\250/07_Python\345\270\270\350\247\201\347\232\204\347\275\221\347\273\234\350\257\267\346\261\202\345\272\223.md"
+++ "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/07_Python\345\270\270\350\247\201\347\232\204\347\275\221\347\273\234\350\257\267\346\261\202\345\272\223.md"
@@ -1,4 +1,4 @@
-### 1. 常用的网络请求库
+# 1. 常用的网络请求库
在Python中,进行网络请求的库主要分为同步和异步两大类。
@@ -10,7 +10,7 @@
- `aiohttp`: 支持异步请求的库,使用`asyncio`进行网络通信,适合处理高并发需求。
- `httpx`: 是一个全功能的HTTP客户端,支持HTTP/1.1和HTTP/2,并且同时支持同步和异步接口。
-### 2. 优缺点及适用场景
+## 2. 优缺点及适用场景
- `urllib`:
- **优点**: 标准库,不需要额外安装。
@@ -32,7 +32,7 @@
- **缺点**: 相对较新,社区支持和稳定性正在增强中。
- **适用场景**: 需要同时使用同步和异步请求,或需要HTTP/2支持的应用。
-### 3. Requests和httpx的使用
+## 3. Requests和httpx的使用
> headers、cookies、auth、proxy这几种是我们日常爬虫过程中,经常需要使用的,下面分别基于request和httpx来展示如何使用
- **Requests**:
@@ -86,7 +86,7 @@
httpx 的设计灵感来源于 requests,因此两者在用法上有很多相似之处。这是因为 httpx 的开发者希望提供一个类似于 requests 的简洁、易用的接口,同时又能够支持更多的功能和特性,比如对异步请求的支持以及对 HTTP/2 的原生支持。因此,如果您熟悉 requests 的用法,那么学习和使用 httpx 会变得非常容易和顺畅。
-### 4. 入门示例
+## 4. 入门示例
- **Requests示例**:
@@ -106,7 +106,7 @@ response = httpx.get('https://httpbin.org/get')
print(response.json())
```
-### 5. 实际业务逻辑示例
+## 5. 实际业务逻辑示例
假设我们需要实现一个功能:向`httpbin.org/post`发送POST请求,提交一些数据,并接收响应。
@@ -135,10 +135,10 @@ async def post_data():
asyncio.run(post_data())
```
-### 6. 异步爬虫的趋势
+## 6. 异步爬虫的趋势
Python3.7之后,随着`asyncio`库的成熟和普及,异步编程在Python中变得更加容易实现。异步爬虫可以同时发起和管理成百上千的网络请求,而不会阻塞主线程。这使得编写高性能的爬虫代码不再是难事,尤其是在数据采集、实时数据处理等领域,异步爬虫将会成为一种趋势。
-### 7. 总结
+## 7. 总结
在选择合适的网络请求库时,应考虑实际应用的需求:对于简单或不频繁的网络请求,可以选择`urllib`或`requests`;而在需要处理大量并发连接的场景下,则应考虑使用`aiohttp`或`httpx`。随着Python异步编程的发展,未来异步爬虫无疑会在性能和效率上带来更多优势。
\ No newline at end of file
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/08_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2301_\351\235\231\346\200\201\347\275\221\351\241\265\346\225\260\346\215\256\346\217\220\345\217\226.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/08_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2301_\351\235\231\346\200\201\347\275\221\351\241\265\346\225\260\346\215\256\346\217\220\345\217\226.md"
similarity index 99%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/08_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2301_\351\235\231\346\200\201\347\275\221\351\241\265\346\225\260\346\215\256\346\217\220\345\217\226.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/08_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2301_\351\235\231\346\200\201\347\275\221\351\241\265\346\225\260\346\215\256\346\217\220\345\217\226.md"
index c641646..b93037e 100644
--- "a/\347\210\254\350\231\253\345\205\245\351\227\250/08_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2301_\351\235\231\346\200\201\347\275\221\351\241\265\346\225\260\346\215\256\346\217\220\345\217\226.md"
+++ "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/08_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2301_\351\235\231\346\200\201\347\275\221\351\241\265\346\225\260\346\215\256\346\217\220\345\217\226.md"
@@ -1,16 +1,16 @@
-## 爬虫静态网页数据提取
+# 爬虫静态网页数据提取
> 为了照顾一些新入门的朋友,本篇的内容html内容解析会用两个库来完成,一个是`BeautifulSoup` 另一个是我比较喜欢用的`parsel`. 大多数新入门朋友可能学习爬虫的时候,都是从BeautifulSoup这个库开始的。
-### 什么是静态网页
+## 什么是静态网页
静态网页是指内容固定不变的网页,它的内容是直接写在 HTML 文件中的,不会因为用户的请求或者其他因素而改变。静态网页的内容通常由 HTML、CSS 和 JavaScript 组成,服务器只需要将这些文件发送给浏览器,浏览器就可以直接解析并显示网页内容。
-### 静态网页工作原理
+## 静态网页工作原理
>当用户在浏览器中输入一个静态网页的 URL 时,浏览器会向服务器发送一个 HTTP 请求,请求获取该 URL 对应的 HTML 文件。服务器接收到请求后,会在服务器上查找对应的 HTML 文件,并将其内容发送给浏览器。浏览器接收到 HTML 文件后,会解析其中的 HTML、CSS 和 JavaScript 代码,并根据这些代码渲染出网页内容。
![](../static/images/100000003.png)
-### 爬取静态网页一般需要那些技术
+## 爬取静态网页一般需要那些技术
- 会一点点前端的三件套(html、css、js)不会的朋友可以去菜鸟教程上面看一看,只需要简单的入门,知道html标签的一个结构,css选择器的简单用法,js的话暂时不太需要。
- 会使用网络请求库,比如requests、httpx等
- 会使用html解析库,比如BeautifulSoup、parsel等
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/09_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2302_\345\212\250\346\200\201\346\225\260\346\215\256\346\217\220\345\217\226.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/09_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2302_\345\212\250\346\200\201\346\225\260\346\215\256\346\217\220\345\217\226.md"
similarity index 99%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/09_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2302_\345\212\250\346\200\201\346\225\260\346\215\256\346\217\220\345\217\226.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/09_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2302_\345\212\250\346\200\201\346\225\260\346\215\256\346\217\220\345\217\226.md"
index eb706cc..1329a0a 100644
--- "a/\347\210\254\350\231\253\345\205\245\351\227\250/09_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2302_\345\212\250\346\200\201\346\225\260\346\215\256\346\217\220\345\217\226.md"
+++ "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/09_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2302_\345\212\250\346\200\201\346\225\260\346\215\256\346\217\220\345\217\226.md"
@@ -2,11 +2,11 @@
在爬虫入门实战1中,我们学习了如何从静态网页中提取数据。这一节,我们将探索动态网页的数据提取,这是爬虫技术中更为高级也更为常见的一个环节。
-# 什么是动态网页
+## 什么是动态网页
动态网页与静态网页不同,其内容是可以根据用户操作、请求参数或者是服务器端的数据变化而变化的。动态网页的内容通常是通过客户端的JavaScrip发起异步请求,由服务端动态返回的数据(json、html)
-# 动态网页工作原理
+## 动态网页工作原理
动态网页的数据加载通常有两种方式:
@@ -15,14 +15,14 @@
![](../static/images/1000000011.png)
-# 爬取动态网页需要的技术
+## 爬取动态网页需要的技术
- 理解AJAX和API请求:动态网页往往通过AJAX请求获取数据,了解这一点对于数据提取至关重要。
- 使用浏览器开发者工具:通过分析网络请求,找出数据加载的具体过程。
- 使用适合动态网页的请求库,如requests、httpx、aiohttp等。
- 使用适合动态网页的驱动库,如Selenium、Puppeteer、Playwirght等,模拟浏览器行为获取数据。
- 学习JavaScript基础,有助于理解网页是如何动态加载数据的。
-# 实战示例1:爬取雅虎财经网站的数字加密货币数据
+## 实战示例1:爬取雅虎财经网站的数字加密货币数据
## 任务需求描述
目标站点URL:https://finance.yahoo.com/crypto
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/10_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2303_\346\225\260\346\215\256\345\255\230\345\202\250\345\256\236\347\216\260.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/10_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2303_\346\225\260\346\215\256\345\255\230\345\202\250\345\256\236\347\216\260.md"
similarity index 99%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/10_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2303_\346\225\260\346\215\256\345\255\230\345\202\250\345\256\236\347\216\260.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/10_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2303_\346\225\260\346\215\256\345\255\230\345\202\250\345\256\236\347\216\260.md"
index 7348ac2..7fc25d2 100644
--- "a/\347\210\254\350\231\253\345\205\245\351\227\250/10_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2303_\346\225\260\346\215\256\345\255\230\345\202\250\345\256\236\347\216\260.md"
+++ "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/10_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2303_\346\225\260\346\215\256\345\255\230\345\202\250\345\256\236\347\216\260.md"
@@ -5,7 +5,7 @@
> 你不妨思考一下,如果是你,你会怎么设计你的爬虫程序支持不同的存储方式呢?
-# 前置准备
+## 前置准备
在正式讨论数据存储之前,我们先来回顾一下在 [动态数据这一章](09_爬虫入门实战2_动态数据提取.md) 是如何获取动态数据。
在动态数据获取这一章,我们是不是爬取了一个雅虎财经方面的加密货币数据,然后将数据保存到CSV文件中了,当时对数据存储没有做过的介绍。
@@ -77,7 +77,7 @@ pydantic真的非常非常好用,尤其是在python这门动态类型的脚本
如果python是你的主力语言的话, 强力推荐!
-# 学习目标
+## 学习目标
- 设计一个数据存储抽象类
- 将数据存储到CSV文件
- 将数据存储到JSON文件
@@ -86,7 +86,7 @@ pydantic真的非常非常好用,尤其是在python这门动态类型的脚本
- 改造动态数据章节的存储代码,支持不同类型存储
-# 设计原理
+## 设计原理
## 流程设计
![流程图设计](../static/images/1000000013.png)
@@ -104,7 +104,7 @@ pydantic真的非常非常好用,尤其是在python这门动态类型的脚本
![存储层类图设计](../static/images/1000000014.png)
-# 代码实现过程
+## 代码实现过程
> 后面源码都用python的异步编程来写吧,这样可以更好的提高代码的执行效率,提高爬虫的效率。而且我比较擅长异步编程,哈哈哈
## SymbolContent类转换成Pydantic模型类
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/11_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2304_\351\253\230\346\225\210\347\216\207\347\232\204\347\210\254\350\231\253\345\256\236\347\216\260.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/11_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2304_\351\253\230\346\225\210\347\216\207\347\232\204\347\210\254\350\231\253\345\256\236\347\216\260.md"
similarity index 100%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/11_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2304_\351\253\230\346\225\210\347\216\207\347\232\204\347\210\254\350\231\253\345\256\236\347\216\260.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/11_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2304_\351\253\230\346\225\210\347\216\207\347\232\204\347\210\254\350\231\253\345\256\236\347\216\260.md"
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/12_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2305_\347\274\226\345\206\231\346\230\223\344\272\216\347\273\264\346\212\244\347\232\204\347\210\254\350\231\253\344\273\243\347\240\201.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/12_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2305_\347\274\226\345\206\231\346\230\223\344\272\216\347\273\264\346\212\244\347\232\204\347\210\254\350\231\253\344\273\243\347\240\201.md"
similarity index 100%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/12_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2305_\347\274\226\345\206\231\346\230\223\344\272\216\347\273\264\346\212\244\347\232\204\347\210\254\350\231\253\344\273\243\347\240\201.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/12_\347\210\254\350\231\253\345\205\245\351\227\250\345\256\236\346\210\2305_\347\274\226\345\206\231\346\230\223\344\272\216\347\273\264\346\212\244\347\232\204\347\210\254\350\231\253\344\273\243\347\240\201.md"
diff --git "a/\347\210\254\350\231\253\345\205\245\351\227\250/README.md" "b/docs/\347\210\254\350\231\253\345\205\245\351\227\250/README.md"
similarity index 100%
rename from "\347\210\254\350\231\253\345\205\245\351\227\250/README.md"
rename to "docs/\347\210\254\350\231\253\345\205\245\351\227\250/README.md"
diff --git "a/\347\210\254\350\231\253\350\277\233\344\273\267/README.md" "b/docs/\347\210\254\350\231\253\350\277\233\344\273\267/README.md"
similarity index 100%
rename from "\347\210\254\350\231\253\350\277\233\344\273\267/README.md"
rename to "docs/\347\210\254\350\231\253\350\277\233\344\273\267/README.md"
diff --git "a/\351\253\230\347\272\247\347\210\254\350\231\253/README.md" "b/docs/\351\253\230\347\272\247\347\210\254\350\231\253/README.md"
similarity index 100%
rename from "\351\253\230\347\272\247\347\210\254\350\231\253/README.md"
rename to "docs/\351\253\230\347\272\247\347\210\254\350\231\253/README.md"
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..3cfe448
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1884 @@
+{
+ "name": "CrawlerTutorial",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "devDependencies": {
+ "vitepress": "^1.3.4"
+ }
+ },
+ "node_modules/@algolia/autocomplete-core": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz",
+ "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-plugin-algolia-insights": "1.9.3",
+ "@algolia/autocomplete-shared": "1.9.3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz",
+ "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.9.3"
+ },
+ "peerDependencies": {
+ "search-insights": ">= 1 < 3"
+ }
+ },
+ "node_modules/@algolia/autocomplete-preset-algolia": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz",
+ "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-shared": "1.9.3"
+ },
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/autocomplete-shared": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmmirror.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz",
+ "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==",
+ "dev": true,
+ "peerDependencies": {
+ "@algolia/client-search": ">= 4.9.1 < 6",
+ "algoliasearch": ">= 4.9.1 < 6"
+ }
+ },
+ "node_modules/@algolia/cache-browser-local-storage": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz",
+ "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-common": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/cache-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/cache-common/-/cache-common-4.24.0.tgz",
+ "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==",
+ "dev": true
+ },
+ "node_modules/@algolia/cache-in-memory": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz",
+ "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-common": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-account": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-account/-/client-account-4.24.0.tgz",
+ "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.24.0",
+ "@algolia/client-search": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-account/node_modules/@algolia/client-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.24.0.tgz",
+ "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-account/node_modules/@algolia/client-search": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.24.0.tgz",
+ "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-analytics/-/client-analytics-4.24.0.tgz",
+ "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.24.0",
+ "@algolia/client-search": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.24.0.tgz",
+ "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.24.0.tgz",
+ "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-common": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-5.1.1.tgz",
+ "integrity": "sha512-jkQNQbGY+XQB3Eln7wqqdUZKBzG8lETcsaUk5gcMc6iIwyN/qW0v0fhpKPH+Kli+BImLxo0CWk12CvVvx2exWA==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/client-personalization": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-personalization/-/client-personalization-4.24.0.tgz",
+ "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.24.0.tgz",
+ "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/client-search": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-search/-/client-search-5.1.1.tgz",
+ "integrity": "sha512-SFpb3FI/VouGou/vpuS7qeCA5Y/KpV42P6CEA/1MZQtl/xJkl6PVjikb+Q9YadeHi2jtDV/aQ6PyiVDnX4PQcw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@algolia/client-common": "5.1.1",
+ "@algolia/requester-browser-xhr": "5.1.1",
+ "@algolia/requester-node-http": "5.1.1"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/logger-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/logger-common/-/logger-common-4.24.0.tgz",
+ "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==",
+ "dev": true
+ },
+ "node_modules/@algolia/logger-console": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/logger-console/-/logger-console-4.24.0.tgz",
+ "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/logger-common": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/recommend": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/recommend/-/recommend-4.24.0.tgz",
+ "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-browser-local-storage": "4.24.0",
+ "@algolia/cache-common": "4.24.0",
+ "@algolia/cache-in-memory": "4.24.0",
+ "@algolia/client-common": "4.24.0",
+ "@algolia/client-search": "4.24.0",
+ "@algolia/logger-common": "4.24.0",
+ "@algolia/logger-console": "4.24.0",
+ "@algolia/requester-browser-xhr": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/requester-node-http": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/recommend/node_modules/@algolia/client-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.24.0.tgz",
+ "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/recommend/node_modules/@algolia/client-search": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.24.0.tgz",
+ "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz",
+ "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz",
+ "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0"
+ }
+ },
+ "node_modules/@algolia/requester-browser-xhr": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.1.1.tgz",
+ "integrity": "sha512-NXmN1ujJCj5GlJQaMK6DbdiXdcf6nhRef/X40lu9TYi71q9xTo/5RPMI0K2iOp6g07S26BrXFOz6RSV3Ny4LLw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@algolia/client-common": "5.1.1"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/requester-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/requester-common/-/requester-common-4.24.0.tgz",
+ "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==",
+ "dev": true
+ },
+ "node_modules/@algolia/requester-node-http": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-5.1.1.tgz",
+ "integrity": "sha512-xwrgnNTIzgxDEx6zuCKSKTPzQLA8fL/WZiVB6fRpIu5agLMjoAi0cWA5YSDbo+2FFxqVgLqKY/Jz6mKmWtY15Q==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@algolia/client-common": "5.1.1"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@algolia/transporter": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/transporter/-/transporter-4.24.0.tgz",
+ "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-common": "4.24.0",
+ "@algolia/logger-common": "4.24.0",
+ "@algolia/requester-common": "4.24.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+ "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.25.4",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.4.tgz",
+ "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.4"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.25.4",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.4.tgz",
+ "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@docsearch/css": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmmirror.com/@docsearch/css/-/css-3.6.1.tgz",
+ "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==",
+ "dev": true
+ },
+ "node_modules/@docsearch/js": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmmirror.com/@docsearch/js/-/js-3.6.1.tgz",
+ "integrity": "sha512-erI3RRZurDr1xES5hvYJ3Imp7jtrXj6f1xYIzDzxiS7nNBufYWPbJwrmMqWC5g9y165PmxEmN9pklGCdLi0Iqg==",
+ "dev": true,
+ "dependencies": {
+ "@docsearch/react": "3.6.1",
+ "preact": "^10.0.0"
+ }
+ },
+ "node_modules/@docsearch/react": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmmirror.com/@docsearch/react/-/react-3.6.1.tgz",
+ "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/autocomplete-core": "1.9.3",
+ "@algolia/autocomplete-preset-algolia": "1.9.3",
+ "@docsearch/css": "3.6.1",
+ "algoliasearch": "^4.19.1"
+ },
+ "peerDependencies": {
+ "@types/react": ">= 16.8.0 < 19.0.0",
+ "react": ">= 16.8.0 < 19.0.0",
+ "react-dom": ">= 16.8.0 < 19.0.0",
+ "search-insights": ">= 1 < 3"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "search-insights": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.1.tgz",
+ "integrity": "sha512-2thheikVEuU7ZxFXubPDOtspKn1x0yqaYQwvALVtEcvFhMifPADBrgRPyHV0TF3b+9BgvgjgagVyvA/UqPZHmg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.1.tgz",
+ "integrity": "sha512-t1lLYn4V9WgnIFHXy1d2Di/7gyzBWS8G5pQSXdZqfrdCGTwi1VasRMSS81DTYb+avDs/Zz4A6dzERki5oRYz1g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.1.tgz",
+ "integrity": "sha512-AH/wNWSEEHvs6t4iJ3RANxW5ZCK3fUnmf0gyMxWCesY1AlUj8jY7GC+rQE4wd3gwmZ9XDOpL0kcFnCjtN7FXlA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.1.tgz",
+ "integrity": "sha512-dO0BIz/+5ZdkLZrVgQrDdW7m2RkrLwYTh2YMFG9IpBtlC1x1NPNSXkfczhZieOlOLEqgXOFH3wYHB7PmBtf+Bg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.1.tgz",
+ "integrity": "sha512-sWWgdQ1fq+XKrlda8PsMCfut8caFwZBmhYeoehJ05FdI0YZXk6ZyUjWLrIgbR/VgiGycrFKMMgp7eJ69HOF2pQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.1.tgz",
+ "integrity": "sha512-9OIiSuj5EsYQlmwhmFRA0LRO0dRRjdCVZA3hnmZe1rEwRk11Jy3ECGGq3a7RrVEZ0/pCsYWx8jG3IvcrJ6RCew==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.1.tgz",
+ "integrity": "sha512-0kuAkRK4MeIUbzQYu63NrJmfoUVicajoRAL1bpwdYIYRcs57iyIV9NLcuyDyDXE2GiZCL4uhKSYAnyWpjZkWow==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.1.tgz",
+ "integrity": "sha512-/6dYC9fZtfEY0vozpc5bx1RP4VrtEOhNQGb0HwvYNwXD1BBbwQ5cKIbUVVU7G2d5WRE90NfB922elN8ASXAJEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.1.tgz",
+ "integrity": "sha512-ltUWy+sHeAh3YZ91NUsV4Xg3uBXAlscQe8ZOXRCVAKLsivGuJsrkawYPUEyCV3DYa9urgJugMLn8Z3Z/6CeyRQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.1.tgz",
+ "integrity": "sha512-BggMndzI7Tlv4/abrgLwa/dxNEMn2gC61DCLrTzw8LkpSKel4o+O+gtjbnkevZ18SKkeN3ihRGPuBxjaetWzWg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.1.tgz",
+ "integrity": "sha512-z/9rtlGd/OMv+gb1mNSjElasMf9yXusAxnRDrBaYB+eS1shFm6/4/xDH1SAISO5729fFKUkJ88TkGPRUh8WSAA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.1.tgz",
+ "integrity": "sha512-kXQVcWqDcDKw0S2E0TmhlTLlUgAmMVqPrJZR+KpH/1ZaZhLSl23GZpQVmawBQGVhyP5WXIsIQ/zqbDBBYmxm5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.1.tgz",
+ "integrity": "sha512-CbFv/WMQsSdl+bpX6rVbzR4kAjSSBuDgCqb1l4J68UYsQNalz5wOqLGYj4ZI0thGpyX5kc+LLZ9CL+kpqDovZA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.1.tgz",
+ "integrity": "sha512-3Q3brDgA86gHXWHklrwdREKIrIbxC0ZgU8lwpj0eEKGBQH+31uPqr0P2v11pn0tSIxHvcdOWxa4j+YvLNx1i6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.1.tgz",
+ "integrity": "sha512-tNg+jJcKR3Uwe4L0/wY3Ro0H+u3nrb04+tcq1GSYzBEmKLeOQF2emk1whxlzNqb6MMrQ2JOcQEpuuiPLyRcSIw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.1.tgz",
+ "integrity": "sha512-xGiIH95H1zU7naUyTKEyOA/I0aexNMUdO9qRv0bLKN3qu25bBdrxZHqA3PTJ24YNN/GdMzG4xkDcd/GvjuhfLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@shikijs/core": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@shikijs/core/-/core-1.14.1.tgz",
+ "integrity": "sha512-KyHIIpKNaT20FtFPFjCQB5WVSTpLR/n+jQXhWHWVUMm9MaOaG9BGOG0MSyt7yA4+Lm+4c9rTc03tt3nYzeYSfw==",
+ "dev": true,
+ "dependencies": {
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/transformers": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@shikijs/transformers/-/transformers-1.14.1.tgz",
+ "integrity": "sha512-JJqL8QBVCJh3L61jqqEXgFq1cTycwjcGj7aSmqOEsbxnETM9hRlaB74QuXvY/fVJNjbNt8nvWo0VwAXKvMSLRg==",
+ "dev": true,
+ "dependencies": {
+ "shiki": "1.14.1"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dev": true
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
+ "dev": true
+ },
+ "node_modules/@types/markdown-it": {
+ "version": "14.1.2",
+ "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz",
+ "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
+ "dev": true,
+ "dependencies": {
+ "@types/linkify-it": "^5",
+ "@types/mdurl": "^2"
+ }
+ },
+ "node_modules/@types/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/@types/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
+ "dev": true
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.20",
+ "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
+ "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.1.2.tgz",
+ "integrity": "sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.38.tgz",
+ "integrity": "sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.24.7",
+ "@vue/shared": "3.4.38",
+ "entities": "^4.5.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz",
+ "integrity": "sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-core": "3.4.38",
+ "@vue/shared": "3.4.38"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.38.tgz",
+ "integrity": "sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.24.7",
+ "@vue/compiler-core": "3.4.38",
+ "@vue/compiler-dom": "3.4.38",
+ "@vue/compiler-ssr": "3.4.38",
+ "@vue/shared": "3.4.38",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.10",
+ "postcss": "^8.4.40",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.38.tgz",
+ "integrity": "sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.38",
+ "@vue/shared": "3.4.38"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "7.3.9",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.3.9.tgz",
+ "integrity": "sha512-D+GTYtFg68bqSu66EugQUydsOqaDlPLNmYw5oYk8k81uBu9/bVTUrqlAJrAA9Am7MXhKz2gWdDkopY6sOBf/Bg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-kit": "^7.3.9"
+ }
+ },
+ "node_modules/@vue/devtools-kit": {
+ "version": "7.3.9",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.3.9.tgz",
+ "integrity": "sha512-Gr17nA+DaQzqyhNx1DUJr1CJRzTRfbIuuC80ZgU8MD/qNO302tv9la+ROi+Uaw+ULVwU9T71GnwLy4n8m9Lspg==",
+ "dev": true,
+ "dependencies": {
+ "@vue/devtools-shared": "^7.3.9",
+ "birpc": "^0.2.17",
+ "hookable": "^5.5.3",
+ "mitt": "^3.0.1",
+ "perfect-debounce": "^1.0.0",
+ "speakingurl": "^14.0.1",
+ "superjson": "^2.2.1"
+ }
+ },
+ "node_modules/@vue/devtools-shared": {
+ "version": "7.3.9",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.3.9.tgz",
+ "integrity": "sha512-CdfMRZKXyI8vw+hqOcQIiLihB6Hbbi7WNZGp7LsuH1Qe4aYAFmTaKjSciRZ301oTnwmU/knC/s5OGuV6UNiNoA==",
+ "dev": true,
+ "dependencies": {
+ "rfdc": "^1.4.1"
+ }
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.38.tgz",
+ "integrity": "sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/shared": "3.4.38"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.38.tgz",
+ "integrity": "sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/reactivity": "3.4.38",
+ "@vue/shared": "3.4.38"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.38.tgz",
+ "integrity": "sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/reactivity": "3.4.38",
+ "@vue/runtime-core": "3.4.38",
+ "@vue/shared": "3.4.38",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.38.tgz",
+ "integrity": "sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-ssr": "3.4.38",
+ "@vue/shared": "3.4.38"
+ },
+ "peerDependencies": {
+ "vue": "3.4.38"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.38.tgz",
+ "integrity": "sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==",
+ "dev": true
+ },
+ "node_modules/@vueuse/core": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-11.0.3.tgz",
+ "integrity": "sha512-RENlh64+SYA9XMExmmH1a3TPqeIuJBNNB/63GT35MZI+zpru3oMRUA6cEFr9HmGqEgUisurwGwnIieF6qu3aXw==",
+ "dev": true,
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.20",
+ "@vueuse/metadata": "11.0.3",
+ "@vueuse/shared": "11.0.3",
+ "vue-demi": ">=0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/core/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/integrations": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmmirror.com/@vueuse/integrations/-/integrations-11.0.3.tgz",
+ "integrity": "sha512-w6CDisaxs19S5Fd+NPPLFaA3GoX5gxuxrbTTBu0EYap7oH13w75L6C/+7e9mcoF9akhcR6GyYajwVMQEjdapJg==",
+ "dev": true,
+ "dependencies": {
+ "@vueuse/core": "11.0.3",
+ "@vueuse/shared": "11.0.3",
+ "vue-demi": ">=0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "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"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/@vueuse/integrations/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-11.0.3.tgz",
+ "integrity": "sha512-+FtbO4SD5WpsOcQTcC0hAhNlOid6QNLzqedtquTtQ+CRNBoAt9GuV07c6KNHK1wCmlq8DFPwgiLF2rXwgSHX5Q==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-11.0.3.tgz",
+ "integrity": "sha512-0rY2m6HS5t27n/Vp5cTDsKTlNnimCqsbh/fmT2LgE+aaU42EMfXo8+bNX91W9I7DDmxfuACXMmrd7d79JxkqWA==",
+ "dev": true,
+ "dependencies": {
+ "vue-demi": ">=0.14.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared/node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/algoliasearch": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/algoliasearch/-/algoliasearch-4.24.0.tgz",
+ "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/cache-browser-local-storage": "4.24.0",
+ "@algolia/cache-common": "4.24.0",
+ "@algolia/cache-in-memory": "4.24.0",
+ "@algolia/client-account": "4.24.0",
+ "@algolia/client-analytics": "4.24.0",
+ "@algolia/client-common": "4.24.0",
+ "@algolia/client-personalization": "4.24.0",
+ "@algolia/client-search": "4.24.0",
+ "@algolia/logger-common": "4.24.0",
+ "@algolia/logger-console": "4.24.0",
+ "@algolia/recommend": "4.24.0",
+ "@algolia/requester-browser-xhr": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/requester-node-http": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/algoliasearch/node_modules/@algolia/client-common": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-common/-/client-common-4.24.0.tgz",
+ "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/algoliasearch/node_modules/@algolia/client-search": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/client-search/-/client-search-4.24.0.tgz",
+ "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/client-common": "4.24.0",
+ "@algolia/requester-common": "4.24.0",
+ "@algolia/transporter": "4.24.0"
+ }
+ },
+ "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz",
+ "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0"
+ }
+ },
+ "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": {
+ "version": "4.24.0",
+ "resolved": "https://registry.npmmirror.com/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz",
+ "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==",
+ "dev": true,
+ "dependencies": {
+ "@algolia/requester-common": "4.24.0"
+ }
+ },
+ "node_modules/birpc": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmmirror.com/birpc/-/birpc-0.2.17.tgz",
+ "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz",
+ "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
+ "dev": true,
+ "dependencies": {
+ "is-what": "^4.1.8"
+ },
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
+ "dev": true
+ },
+ "node_modules/focus-trap": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmmirror.com/focus-trap/-/focus-trap-7.5.4.tgz",
+ "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==",
+ "dev": true,
+ "dependencies": {
+ "tabbable": "^6.2.0"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/hookable": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz",
+ "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
+ "dev": true
+ },
+ "node_modules/is-what": {
+ "version": "4.1.16",
+ "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz",
+ "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.11",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
+ "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/mark.js": {
+ "version": "8.11.1",
+ "resolved": "https://registry.npmmirror.com/mark.js/-/mark.js-8.11.1.tgz",
+ "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==",
+ "dev": true
+ },
+ "node_modules/minisearch": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/minisearch/-/minisearch-7.1.0.tgz",
+ "integrity": "sha512-tv7c/uefWdEhcu6hvrfTihflgeEi2tN6VV7HJnCjK6VxM75QQJh4t9FwJCsA2EsRS8LCnu3W87CuGPWMocOLCA==",
+ "dev": true
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.1.tgz",
+ "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+ "dev": true
+ },
+ "node_modules/postcss": {
+ "version": "8.4.41",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.41.tgz",
+ "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.1",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/preact": {
+ "version": "10.23.2",
+ "resolved": "https://registry.npmmirror.com/preact/-/preact-10.23.2.tgz",
+ "integrity": "sha512-kKYfePf9rzKnxOAKDpsWhg/ysrHPqT+yQ7UW4JjdnqjFIeNUnNcEJvhuA8fDenxAGWzUqtd51DfVg7xp/8T9NA==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true
+ },
+ "node_modules/rollup": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.21.1.tgz",
+ "integrity": "sha512-ZnYyKvscThhgd3M5+Qt3pmhO4jIRR5RGzaSovB6Q7rGNrK5cUncrtLmcTTJVSdcKXyZjW8X8MB0JMSuH9bcAJg==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.21.1",
+ "@rollup/rollup-android-arm64": "4.21.1",
+ "@rollup/rollup-darwin-arm64": "4.21.1",
+ "@rollup/rollup-darwin-x64": "4.21.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.21.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.21.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.21.1",
+ "@rollup/rollup-linux-arm64-musl": "4.21.1",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.21.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.21.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.21.1",
+ "@rollup/rollup-linux-x64-gnu": "4.21.1",
+ "@rollup/rollup-linux-x64-musl": "4.21.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.21.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.21.1",
+ "@rollup/rollup-win32-x64-msvc": "4.21.1",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/search-insights": {
+ "version": "2.17.0",
+ "resolved": "https://registry.npmmirror.com/search-insights/-/search-insights-2.17.0.tgz",
+ "integrity": "sha512-AskayU3QNsXQzSL6v4LTYST7NNfs2HWyHHB+sdORP9chsytAhro5XRfToAMI/LAVYgNbzowVZTMfBRodgbUHKg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/shiki": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/shiki/-/shiki-1.14.1.tgz",
+ "integrity": "sha512-FujAN40NEejeXdzPt+3sZ3F2dx1U24BY2XTY01+MG8mbxCiA2XukXdcbyMyLAHJ/1AUUnQd1tZlvIjefWWEJeA==",
+ "dev": true,
+ "dependencies": {
+ "@shikijs/core": "1.14.1",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
+ "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/speakingurl": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz",
+ "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/superjson": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.1.tgz",
+ "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==",
+ "dev": true,
+ "dependencies": {
+ "copy-anything": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.2",
+ "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.2.tgz",
+ "integrity": "sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.41",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitepress": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmmirror.com/vitepress/-/vitepress-1.3.4.tgz",
+ "integrity": "sha512-I1/F6OW1xl3kW4PaIMC6snxjWgf3qfziq2aqsDoFc/Gt41WbcRv++z8zjw8qGRIJ+I4bUW7ZcKFDHHN/jkH9DQ==",
+ "dev": true,
+ "dependencies": {
+ "@docsearch/css": "^3.6.1",
+ "@docsearch/js": "^3.6.1",
+ "@shikijs/core": "^1.13.0",
+ "@shikijs/transformers": "^1.13.0",
+ "@types/markdown-it": "^14.1.2",
+ "@vitejs/plugin-vue": "^5.1.2",
+ "@vue/devtools-api": "^7.3.8",
+ "@vue/shared": "^3.4.38",
+ "@vueuse/core": "^11.0.0",
+ "@vueuse/integrations": "^11.0.0",
+ "focus-trap": "^7.5.4",
+ "mark.js": "8.11.1",
+ "minisearch": "^7.1.0",
+ "shiki": "^1.13.0",
+ "vite": "^5.4.1",
+ "vue": "^3.4.38"
+ },
+ "bin": {
+ "vitepress": "bin/vitepress.js"
+ },
+ "peerDependencies": {
+ "markdown-it-mathjax3": "^4",
+ "postcss": "^8"
+ },
+ "peerDependenciesMeta": {
+ "markdown-it-mathjax3": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.38.tgz",
+ "integrity": "sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==",
+ "dev": true,
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.38",
+ "@vue/compiler-sfc": "3.4.38",
+ "@vue/runtime-dom": "3.4.38",
+ "@vue/server-renderer": "3.4.38",
+ "@vue/shared": "3.4.38"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d7e5a5a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,10 @@
+{
+ "scripts": {
+ "docs:dev": "vitepress dev docs",
+ "docs:build": "vitepress build docs",
+ "docs:preview": "vitepress preview docs"
+ },
+ "devDependencies": {
+ "vitepress": "^1.3.4"
+ }
+}