From 83cf39debcb6f8f8c43cd92abdd0e4c2f2118be0 Mon Sep 17 00:00:00 2001
From: 2977094657 <2977094657@qq.com>
Date: Sun, 25 Oct 2026 20:49:58 +0800
Subject: [PATCH 1/2] refactor: focus HistoryHub on history collection
---
.dockerignore | 5 +
.github/workflows/ci.yml | 6 +
.github/workflows/multi-platform-build.yml | 3 -
README.md | 417 +--
app.spec | 174 +-
build.py | 181 +-
config/config.yaml | 146 +-
config/scheduler_config.yaml | 92 -
config/sql_statements_mysql.py | 67 -
config/sql_statements_sqlite.py | 11 -
config/template.html | 27 -
docker/Dockerfile.cpu | 4 -
frontend/Dockerfile | 8 +-
frontend/README.md | 174 +-
frontend/bun.lock | 817 ------
frontend/index.html | 37 +-
frontend/package-lock.json | 1071 +------
frontend/package.json | 24 +-
frontend/public/Comments.png | Bin 200695 -> 0 bytes
frontend/public/Mobile.svg | 1 -
frontend/public/MultipleVideos.png | Bin 1146230 -> 0 bytes
frontend/public/PC.svg | 1 -
frontend/public/Pad.svg | 1 -
frontend/public/QQ20250705-180733.png | Bin 222855 -> 0 bytes
frontend/public/SingleVideo.png | Bin 344597 -> 0 bytes
frontend/public/demo-image.jpg | Bin 18479 -> 0 bytes
frontend/public/download.png | Bin 293828 -> 0 bytes
frontend/public/dynamic.png | Bin 344082 -> 0 bytes
frontend/public/dynamic.svg | 1 -
frontend/public/favorites.png | Bin 274457 -> 0 bytes
frontend/public/home.png | Bin 407553 -> 0 bytes
frontend/public/images.png | Bin 281779 -> 0 bytes
.../public/layout-collage-1751711304790.jpg | Bin 393944 -> 0 bytes
.../public/layout-collage-1751711351462.jpg | Bin 430306 -> 0 bytes
.../public/layout-collage-1751711376523.jpg | Bin 408332 -> 0 bytes
.../public/layout-collage-1751711396674.jpg | Bin 367048 -> 0 bytes
.../public/layout-collage-1751711408262.jpg | Bin 465856 -> 0 bytes
frontend/public/live.svg | 1 -
frontend/public/logo.ico | Bin 72090 -> 0 bytes
frontend/public/logo.png | Bin 327951 -> 0 bytes
frontend/public/scheduler.png | Bin 136097 -> 0 bytes
frontend/public/setting.png | Bin 147611 -> 0 bytes
frontend/src/App.vue | 60 +-
frontend/src/api/api.js | 1673 +----------
frontend/src/components/PrivacyControl.vue | 94 -
.../components/tailwind/ApriseSettings.vue | 134 -
.../tailwind/ArtPlayerWithDanmaku.vue | 393 ---
.../tailwind/BusinessTypeSelector.vue | 170 --
.../components/tailwind/CustomDropdown.vue | 180 --
.../components/tailwind/DataSyncManager.vue | 414 ---
.../components/tailwind/DownloadDialog.vue | 1495 ----------
.../components/tailwind/FavoriteDialog.vue | 290 --
.../components/tailwind/FilterDropdown.vue | 527 ----
.../components/tailwind/HistoryContent.vue | 2035 -------------
.../src/components/tailwind/LoginDialog.vue | 386 +--
frontend/src/components/tailwind/Navbar.vue | 447 ---
.../src/components/tailwind/Pagination.vue | 190 --
.../src/components/tailwind/SearchBar.vue | 220 --
frontend/src/components/tailwind/Settings.vue | 1531 +---------
frontend/src/components/tailwind/Sidebar.vue | 719 +----
.../components/tailwind/SimpleSearchBar.vue | 54 -
.../src/components/tailwind/TaskTreeItem.vue | 244 --
.../src/components/tailwind/UserVideos.vue | 172 --
.../components/tailwind/VideoCategories.vue | 79 -
.../components/tailwind/VideoDetailDialog.vue | 401 ---
.../components/tailwind/VideoPlayerDialog.vue | 244 --
.../src/components/tailwind/VideoRecord.vue | 801 -----
.../analytics/layout/AnalyticsLayout.vue | 41 -
.../analytics/pages/AuthorCompletionPage.vue | 366 ---
.../pages/AuthorPopularAssociationPage.vue | 283 --
.../pages/CategoryPopularDistributionPage.vue | 277 --
.../analytics/pages/DurationAnalysisPage.vue | 161 -
.../pages/DurationPopularDistributionPage.vue | 279 --
.../tailwind/analytics/pages/HeroPage.vue | 45 -
.../tailwind/analytics/pages/MonthlyPage.vue | 128 -
.../analytics/pages/OverallCompletionPage.vue | 321 --
.../tailwind/analytics/pages/OverviewPage.vue | 294 --
.../analytics/pages/PopularHitRatePage.vue | 252 --
.../analytics/pages/PopularPredictionPage.vue | 296 --
.../tailwind/analytics/pages/RewatchPage.vue | 163 --
.../tailwind/analytics/pages/StreakPage.vue | 72 -
.../tailwind/analytics/pages/TagsPage.vue | 219 --
.../analytics/pages/TimeAnalysisPage.vue | 345 ---
.../analytics/pages/TimeDistributionPage.vue | 195 --
.../analytics/pages/TitleAnalysisPage.vue | 263 --
.../pages/TitleInteractionAnalysisPage.vue | 245 --
.../pages/TitleLengthAnalysisPage.vue | 245 --
.../pages/TitleSentimentAnalysisPage.vue | 249 --
.../pages/TitleTrendAnalysisPage.vue | 79 -
.../tailwind/dynamic/DynamicCardNormal.vue | 297 --
.../tailwind/dynamic/DynamicCardVideo.vue | 98 -
.../components/tailwind/layout/MainLayout.vue | 95 +-
.../tailwind/page/AnimatedAnalytics.vue | 758 -----
.../components/tailwind/page/BiliTools.vue | 531 ----
.../tailwind/page/BrowserHistory.vue | 9 +-
.../src/components/tailwind/page/Comments.vue | 383 ---
.../components/tailwind/page/Downloads.vue | 418 ---
.../tailwind/page/DynamicDownloader.vue | 421 ---
.../components/tailwind/page/Favorites.vue | 1115 -------
.../src/components/tailwind/page/History.vue | 339 +--
.../src/components/tailwind/page/Images.vue | 397 ---
.../components/tailwind/page/MediaManager.vue | 197 --
.../src/components/tailwind/page/Remarks.vue | 348 ---
.../tailwind/page/SchedulerTasks.vue | 726 -----
.../src/components/tailwind/page/Search.vue | 238 --
.../components/tailwind/page/VideoActions.vue | 582 ----
.../tailwind/page/VideoDetailsManager.vue | 457 ---
.../tailwind/page/VideoDownloader.vue | 825 ------
.../tailwind/scheduler/SelectDialog.vue | 307 --
.../tailwind/scheduler/TaskDetail.vue | 364 ---
.../tailwind/scheduler/TaskForm.vue | 1104 -------
.../tailwind/scheduler/TaskHistory.vue | 273 --
frontend/src/main.js | 68 +-
frontend/src/router/router.js | 124 +-
frontend/src/style.css | 35 +-
frontend/src/utils/historyRecordStore.js | 25 -
frontend/src/utils/imageProxy.js | 31 -
frontend/src/utils/imageUrl.js | 61 -
frontend/src/utils/openUrl.js | 2 +-
frontend/src/utils/privacyManager.js | 86 -
main.py | 576 +---
mcp_server.py | 802 -----
pyproject.toml | 20 -
requirements.txt | 233 +-
routers/analysis.py | 45 -
routers/apprise_config.py | 140 -
routers/bilibili_history_delete.py | 210 --
routers/categories.py | 177 --
routers/clean_data.py | 8 -
routers/collection_download.py | 422 ---
routers/comment.py | 64 -
routers/daily_count.py | 227 --
routers/data_sync.py | 337 ---
routers/delete_history.py | 135 -
routers/download.py | 1943 -------------
routers/dynamic.py | 1221 --------
routers/email_config.py | 410 ---
routers/export.py | 143 -
routers/favorite.py | 1475 ----------
routers/fetch_bili_history.py | 282 +-
routers/heatmap.py | 8 -
routers/history.py | 774 +----
routers/image_downloader.py | 183 --
routers/import_data_mysql.py | 12 -
routers/import_data_sqlite.py | 7 +-
routers/interaction_records.py | 1227 --------
routers/login.py | 171 +-
routers/popular_analytics.py | 1068 -------
routers/popular_videos.py | 472 ---
routers/scheduler.py | 768 -----
routers/send_log.py | 40 -
routers/title_analytics.py | 698 -----
routers/title_pattern_discovery.py | 724 -----
routers/video_details.py | 2058 -------------
routers/viewing_analytics.py | 2585 -----------------
scripts/analyze_bilibili_history.py | 462 ---
scripts/apprise_notify.py | 136 -
scripts/bilibili_history.py | 1655 +----------
scripts/check_data_integrity.py | 363 ---
scripts/clean_data.py | 57 -
scripts/comment_fetcher.py | 384 ---
scripts/dynamic_db.py | 608 ----
scripts/dynamic_media.py | 339 ---
scripts/export_to_excel.py | 200 --
scripts/heatmap_visualizer.py | 230 --
scripts/image_downloader.py | 1105 -------
scripts/import_database.py | 394 ---
scripts/import_sqlite.py | 63 +-
scripts/init_categories.py | 223 --
scripts/popular_videos.py | 1303 ---------
scripts/scheduler.py | 170 --
scripts/scheduler_db.py | 530 ----
scripts/scheduler_db_enhanced.py | 1718 -----------
scripts/scheduler_manager.py | 1525 ----------
scripts/send_log_email.py | 230 --
scripts/sync_db_json.py | 474 ---
scripts/task_manager.py | 238 --
scripts/utils.py | 67 +-
scripts/wbi_sign.py | 190 --
scripts/yutto_runner.py | 57 -
skills/bilibili-history-mcp/SKILL.md | 27 -
tests/test_send_log_email.py | 81 -
uv.lock | 1960 +------------
183 files changed, 732 insertions(+), 65476 deletions(-)
delete mode 100644 config/scheduler_config.yaml
delete mode 100644 config/sql_statements_mysql.py
delete mode 100644 config/template.html
delete mode 100644 frontend/bun.lock
delete mode 100644 frontend/public/Comments.png
delete mode 100644 frontend/public/Mobile.svg
delete mode 100644 frontend/public/MultipleVideos.png
delete mode 100644 frontend/public/PC.svg
delete mode 100644 frontend/public/Pad.svg
delete mode 100644 frontend/public/QQ20250705-180733.png
delete mode 100644 frontend/public/SingleVideo.png
delete mode 100644 frontend/public/demo-image.jpg
delete mode 100644 frontend/public/download.png
delete mode 100644 frontend/public/dynamic.png
delete mode 100644 frontend/public/dynamic.svg
delete mode 100644 frontend/public/favorites.png
delete mode 100644 frontend/public/home.png
delete mode 100644 frontend/public/images.png
delete mode 100644 frontend/public/layout-collage-1751711304790.jpg
delete mode 100644 frontend/public/layout-collage-1751711351462.jpg
delete mode 100644 frontend/public/layout-collage-1751711376523.jpg
delete mode 100644 frontend/public/layout-collage-1751711396674.jpg
delete mode 100644 frontend/public/layout-collage-1751711408262.jpg
delete mode 100644 frontend/public/live.svg
delete mode 100644 frontend/public/logo.ico
delete mode 100644 frontend/public/logo.png
delete mode 100644 frontend/public/scheduler.png
delete mode 100644 frontend/public/setting.png
delete mode 100644 frontend/src/components/PrivacyControl.vue
delete mode 100644 frontend/src/components/tailwind/ApriseSettings.vue
delete mode 100644 frontend/src/components/tailwind/ArtPlayerWithDanmaku.vue
delete mode 100644 frontend/src/components/tailwind/BusinessTypeSelector.vue
delete mode 100644 frontend/src/components/tailwind/CustomDropdown.vue
delete mode 100644 frontend/src/components/tailwind/DataSyncManager.vue
delete mode 100644 frontend/src/components/tailwind/DownloadDialog.vue
delete mode 100644 frontend/src/components/tailwind/FavoriteDialog.vue
delete mode 100644 frontend/src/components/tailwind/FilterDropdown.vue
delete mode 100644 frontend/src/components/tailwind/HistoryContent.vue
delete mode 100644 frontend/src/components/tailwind/Navbar.vue
delete mode 100644 frontend/src/components/tailwind/Pagination.vue
delete mode 100644 frontend/src/components/tailwind/SearchBar.vue
delete mode 100644 frontend/src/components/tailwind/SimpleSearchBar.vue
delete mode 100644 frontend/src/components/tailwind/TaskTreeItem.vue
delete mode 100644 frontend/src/components/tailwind/UserVideos.vue
delete mode 100644 frontend/src/components/tailwind/VideoCategories.vue
delete mode 100644 frontend/src/components/tailwind/VideoDetailDialog.vue
delete mode 100644 frontend/src/components/tailwind/VideoPlayerDialog.vue
delete mode 100644 frontend/src/components/tailwind/VideoRecord.vue
delete mode 100644 frontend/src/components/tailwind/analytics/layout/AnalyticsLayout.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/AuthorCompletionPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/AuthorPopularAssociationPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/CategoryPopularDistributionPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/DurationAnalysisPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/DurationPopularDistributionPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/HeroPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/MonthlyPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/OverallCompletionPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/OverviewPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/PopularHitRatePage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/PopularPredictionPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/RewatchPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/StreakPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TagsPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TimeAnalysisPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TimeDistributionPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TitleAnalysisPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TitleInteractionAnalysisPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TitleLengthAnalysisPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TitleSentimentAnalysisPage.vue
delete mode 100644 frontend/src/components/tailwind/analytics/pages/TitleTrendAnalysisPage.vue
delete mode 100644 frontend/src/components/tailwind/dynamic/DynamicCardNormal.vue
delete mode 100644 frontend/src/components/tailwind/dynamic/DynamicCardVideo.vue
delete mode 100644 frontend/src/components/tailwind/page/AnimatedAnalytics.vue
delete mode 100644 frontend/src/components/tailwind/page/BiliTools.vue
delete mode 100644 frontend/src/components/tailwind/page/Comments.vue
delete mode 100644 frontend/src/components/tailwind/page/Downloads.vue
delete mode 100644 frontend/src/components/tailwind/page/DynamicDownloader.vue
delete mode 100644 frontend/src/components/tailwind/page/Favorites.vue
delete mode 100644 frontend/src/components/tailwind/page/Images.vue
delete mode 100644 frontend/src/components/tailwind/page/MediaManager.vue
delete mode 100644 frontend/src/components/tailwind/page/Remarks.vue
delete mode 100644 frontend/src/components/tailwind/page/SchedulerTasks.vue
delete mode 100644 frontend/src/components/tailwind/page/Search.vue
delete mode 100644 frontend/src/components/tailwind/page/VideoActions.vue
delete mode 100644 frontend/src/components/tailwind/page/VideoDetailsManager.vue
delete mode 100644 frontend/src/components/tailwind/page/VideoDownloader.vue
delete mode 100644 frontend/src/components/tailwind/scheduler/SelectDialog.vue
delete mode 100644 frontend/src/components/tailwind/scheduler/TaskDetail.vue
delete mode 100644 frontend/src/components/tailwind/scheduler/TaskForm.vue
delete mode 100644 frontend/src/components/tailwind/scheduler/TaskHistory.vue
delete mode 100644 frontend/src/utils/historyRecordStore.js
delete mode 100644 frontend/src/utils/imageProxy.js
delete mode 100644 frontend/src/utils/imageUrl.js
delete mode 100644 frontend/src/utils/privacyManager.js
delete mode 100644 mcp_server.py
delete mode 100644 routers/analysis.py
delete mode 100644 routers/apprise_config.py
delete mode 100644 routers/bilibili_history_delete.py
delete mode 100644 routers/categories.py
delete mode 100644 routers/clean_data.py
delete mode 100644 routers/collection_download.py
delete mode 100644 routers/comment.py
delete mode 100644 routers/daily_count.py
delete mode 100644 routers/data_sync.py
delete mode 100644 routers/delete_history.py
delete mode 100644 routers/download.py
delete mode 100644 routers/dynamic.py
delete mode 100644 routers/email_config.py
delete mode 100644 routers/export.py
delete mode 100644 routers/favorite.py
delete mode 100644 routers/heatmap.py
delete mode 100644 routers/image_downloader.py
delete mode 100644 routers/import_data_mysql.py
delete mode 100644 routers/interaction_records.py
delete mode 100644 routers/popular_analytics.py
delete mode 100644 routers/popular_videos.py
delete mode 100644 routers/scheduler.py
delete mode 100644 routers/send_log.py
delete mode 100644 routers/title_analytics.py
delete mode 100644 routers/title_pattern_discovery.py
delete mode 100644 routers/video_details.py
delete mode 100644 routers/viewing_analytics.py
delete mode 100644 scripts/analyze_bilibili_history.py
delete mode 100644 scripts/apprise_notify.py
delete mode 100644 scripts/check_data_integrity.py
delete mode 100644 scripts/clean_data.py
delete mode 100644 scripts/comment_fetcher.py
delete mode 100644 scripts/dynamic_db.py
delete mode 100644 scripts/dynamic_media.py
delete mode 100644 scripts/export_to_excel.py
delete mode 100644 scripts/heatmap_visualizer.py
delete mode 100644 scripts/image_downloader.py
delete mode 100644 scripts/import_database.py
delete mode 100644 scripts/init_categories.py
delete mode 100644 scripts/popular_videos.py
delete mode 100644 scripts/scheduler.py
delete mode 100644 scripts/scheduler_db.py
delete mode 100644 scripts/scheduler_db_enhanced.py
delete mode 100644 scripts/scheduler_manager.py
delete mode 100644 scripts/send_log_email.py
delete mode 100644 scripts/sync_db_json.py
delete mode 100644 scripts/task_manager.py
delete mode 100644 scripts/wbi_sign.py
delete mode 100644 scripts/yutto_runner.py
delete mode 100644 skills/bilibili-history-mcp/SKILL.md
delete mode 100644 tests/test_send_log_email.py
diff --git a/.dockerignore b/.dockerignore
index 4d760b3..c331a40 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -6,3 +6,8 @@ __pycache__
Dockerfile
cache
frontend
+output
+build
+dist
+config_clean
+config/config_temp.yaml
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 1319cda..e5c853e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -38,6 +38,12 @@ jobs:
json.loads(path.read_text(encoding='utf-8-sig'))
PY
+ - name: Install backend dependencies
+ run: python -m pip install -r requirements.txt
+
+ - name: Check backend imports
+ run: python -c "import main"
+
- name: Setup Node
uses: actions/setup-node@v4
with:
diff --git a/.github/workflows/multi-platform-build.yml b/.github/workflows/multi-platform-build.yml
index a1041bc..b12bafe 100644
--- a/.github/workflows/multi-platform-build.yml
+++ b/.github/workflows/multi-platform-build.yml
@@ -40,7 +40,6 @@ jobs:
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pyinstaller
- pip install yutto
- name: 创建logo文件
run: |
@@ -57,7 +56,6 @@ jobs:
python -m venv .venv
.\.venv\Scripts\pip install -r requirements.txt
.\.venv\Scripts\pip install pyinstaller
- .\.venv\Scripts\pip install yutto
shell: cmd
- name: 创建虚拟环境 (Unix)
@@ -67,7 +65,6 @@ jobs:
source .venv/bin/activate
pip install -r requirements.txt
pip install pyinstaller
- pip install yutto
shell: bash
- name: 使用build.py构建应用 (Windows)
diff --git a/README.md b/README.md
index 038c990..1eee29d 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,14 @@
-
-
-
-
-
-
HistoryHub
-

-

-

-

-

-

-

-

-
-
-
-## 介绍
-HistoryHub 将 Chrome 网页访问记录与 B 站观看历史保存在本地或自托管服务中,提供历史搜索、滚动浏览、观看分析和自动同步。浏览器记录包含网址、标题和访问时间;B 站功能包括观看历史、收藏、互动记录和媒体下载。
+# HistoryHub
+
+个人历史记录中心。获取 B 站观看历史,通过 Chrome 扩展同步网页访问记录,在本地或自托管服务中保存、搜索和查看。
+
+## 功能
+
+- **B 站历史**:扫码登录、获取历史记录、同步新增记录,保存为 SQLite 数据和按日期归档的 JSON。
+- **网页历史**:通过 Chrome 扩展导入浏览器当前保留的访问记录,并持续同步新增访问。
+- **历史查询**:搜索历史记录、按时间查看、滚动加载、打开原始链接。
+
+网页访问记录包含网址、标题和访问时间,不代表视频播放完成或文章阅读完成。手机 App 内的历史需要该平台单独提供,不能由 Chrome 历史接口读取。
## 项目结构
@@ -25,11 +17,13 @@ main.py / routers/ / scripts/ Python 后端
frontend/ Vue 网页与 Tauri 桌面端
extension/ Chrome 扩展
config/ 服务配置
-output/ 本地数据
+output/ 历史数据
```
## 本地运行
+需要 Python 3.10+、Node.js 20+ 和 npm。下面使用 uv 管理 Python 依赖。
+
```bash
git clone https://github.com/LifeArchiveProject/HistoryHub.git
cd HistoryHub
@@ -37,375 +31,88 @@ uv sync
uv run main.py
```
-在另一个终端启动管理页面:
+在另一个终端启动前端:
```bash
-cd frontend
+cd HistoryHub/frontend
npm ci
npm run dev
```
-访问 `http://localhost:5173`,在设置中连接后端 `http://127.0.0.1:8899`。
-
-## 网页历史
-
-1. 在服务端 `config/config.yaml` 设置一个自己生成的连接密钥,然后重启后端:
-
- ```yaml
- browser_history:
- sync_token: "替换为你自己生成的随机密钥"
- ```
-
- 也可通过服务进程的 `HISTORYHUB_SYNC_TOKEN` 环境变量提供密钥。环境变量优先;未设置密钥时网页历史接口关闭。
-
-2. 打开 Chrome 的 `chrome://extensions`,开启开发者模式,点击“加载已解压的扩展程序”,选择本仓库的 `extension/` 目录。
-3. 打开 HistoryHub 扩展设置,填写本地或自托管后端地址和同一连接密钥,授权访问该服务地址并开启同步。
-4. 在管理页面打开“网页历史”,输入同一连接密钥即可搜索和滚动查看记录;此页面无需登录 B 站。
-
-扩展会回填 Chrome 当前仍保留的 HTTP/HTTPS 访问记录,并继续同步新增访问。不同访问分别保存,重复同步不会增加重复记录。网页访问不代表视频播放完成或文章阅读完成,手机 App 内的历史不由浏览器接口提供。
-
-扩展目录可直接加载;商店安装需要单独发布 Chrome Web Store 版本。扩展仅向配置并授权的后端发送访问记录,不上传 Cookie。
-
-接口:
-
-- `POST /browser-history/sync`:接收扩展访问记录。
-- `GET /browser-history/records`:按关键词、域名和游标分页查询。
-- 两个接口均使用 `Authorization: Bearer <连接密钥>`。
-- 浏览器记录存储于 `output/browser_history.sqlite3`,B 站数据仍使用 `config.db_file` 指定的数据库。
-
-## B 站功能
-
-- [x] 获取历史记录
-- [x] 年度总结
-- [x] 视频和图片下载
- - [x] 一键下载用户所有投稿视频
-- [x] 用户动态下载
-- [x] 自动化任务
-- [x] 获取用户评论
-- [x] 获取收藏夹
- - [x] 批量收藏
- - [x] 一键下载收藏夹所有视频
-- [x] 获取互动记录
- - [x] 获取历史记录时自动同步收藏/点赞/投币记录
- - [x] 将互动数据补充到年度总结分析
-- [x] 最多找回14天内b站所有在屏幕上显示过的图片
-
-## 后续开发计划
-
-项目正在积极开发中,您可以在我们的 [GitHub 项目计划页面](https://github.com/users/2977094657/projects/2) 查看最新的开发路线图和即将实现的功能。
-
-## 交流群
-
-如果您在使用过程中有任何问题或想与其他用户交流使用心得,欢迎加入我们的QQ交流群[1030089634](https://qm.qq.com/q/k6MZXcofLy):
-
-
-
-
-
-## 系统要求
+访问 `http://localhost:5173`。在设置中填写后端地址,默认是 `http://127.0.0.1:8899`。
-- Python 3.10+
-- SQLite 3
-- FFmpeg(用于视频下载)
-- 必要的 Python 包(见 requirements.txt)
+## B 站历史
-## 快速开始
+打开 B 站历史页面,登录后同步记录。首次同步获取平台当前可返回的历史,后续同步保存新增记录。本地已经保存的记录可直接查看,无需保持 B 站登录。
-#### 使用 Docker 安装
-
-运行仓库当前代码时,在项目根目录执行 `docker compose up -d --build`,配置与数据分别挂载到 `config/` 和 `output/`。预构建镜像随版本标签发布,功能范围以该版本代码为准。
-
-由 [@eli-yip](https://github.com/eli-yip) 实现 ([#30](https://github.com/LifeArchiveProject/HistoryHub/pull/30))
-1. 安装 [Docker](https://docs.docker.com/get-started/get-docker/)
-2. 使用已发布的预构建镜像:
- ```bash
- # CPU 基础版
- docker pull ghcr.io/lifearchiveproject/bili-history-fetcher:latest
- docker run -d -v ./config:/app/config -v ./output:/app/output -p 8899:8899 --name bilibili-api ghcr.io/lifearchiveproject/bili-history-fetcher:latest
- ```
-
- 后端镜像地址:`ghcr.io/lifearchiveproject/bili-history-fetcher`。
-
- 如果拉取 `ghcr.io/lifearchiveproject/...` 提示 `denied` 或 `unauthorized`,请在 GitHub Packages 中将对应容器包的 visibility 调整为 Public。GHCR 新发布的容器包默认可能是 Private,公开后才能匿名拉取。
-
- 标签说明:
- - CPU:`latest` 或 `vX.Y.Z`
- - 平台:目前仅提供 `linux/amd64`
-
-3. 从源码构建镜像(可选):
- ```bash
- # 使用 CPU
- docker build -t bilibili-api:dev -f docker/Dockerfile.cpu .
- ```
-4. 创建 Docker 容器(源码构建后的镜像):
- ```bash
- # 使用 CPU
- docker run -d -v ./config:/app/config -v ./output:/app/output -p 8899:8899 --name bilibili-api bilibili-api:dev
- ```
-
- 挂载目录说明:
- - `./config:/app/config`:配置文件目录,用于存储 SESSDATA 和其他配置
- - `./output:/app/output`:输出目录,用于存储下载的视频、图片和生成的数据
-
-#### 使用 Docker Compose 部署
-
-本项目提供了 Docker Compose 配置,实现一键部署前后端服务。
-
-1. 确保已安装 [Docker](https://docs.docker.com/get-started/get-docker/) 和 [Docker Compose](https://docs.docker.com/compose/install/)
-
-2. 获取本仓库源码及 `config/`、`frontend/` 目录。Compose 文件位于仓库根目录:
- - 直接从[这里](https://raw.githubusercontent.com/LifeArchiveProject/HistoryHub/master/docker-compose.yml)下载
- - 或使用以下命令下载:
- ```bash
- curl -O https://raw.githubusercontent.com/LifeArchiveProject/HistoryHub/master/docker-compose.yml
- # 或
- wget https://raw.githubusercontent.com/LifeArchiveProject/HistoryHub/master/docker-compose.yml
- ```
-
-3. 使用 Docker Compose 启动服务:
- ```bash
- # CPU 基础版
- docker compose up -d --build
- ```
-
-4. 服务启动后访问:
- - 前端界面:http://localhost:5173
- - 后端API:http://localhost:8899
- - API文档:http://localhost:8899/docs
-
-#### [通过 1Panel 部署](https://github.com/LifeArchiveProject/HistoryHub/discussions/65)
-由社区贡献者 [@QYG2297248353](https://github.com/QYG2297248353) 实现 ([#66](https://github.com/LifeArchiveProject/HistoryHub/pull/66))
-
-#### 使用 uv 安装
-由社区贡献者 [@eli-yip](https://github.com/eli-yip) 实现 ([#30](https://github.com/LifeArchiveProject/HistoryHub/pull/30))
-
-1. 安装 [uv](https://docs.astral.sh/uv/getting-started/installation/)
-2. 在项目根目录运行:
- ```bash
- # 安装依赖
- uv sync
- ```
-
- ```bash
- # 运行程序
- uv run main.py
- ```
-
-#### 使用传统 pip 方式安装
-
-如果您更喜欢使用传统的 pip 作为包管理器,可以按照以下步骤操作:
-
-1. **安装依赖**
-
-```bash
-pip install -r requirements.txt
-```
+登录状态保存在服务端配置中。浏览器扩展的连接密钥与 B 站登录凭据相互独立。
-2. **运行程序**
-```bash
-python main.py
-```
-
-## API 接口
-
-基础 URL: `http://localhost:8899`
-
-完整 API 文档访问:`http://localhost:8899/docs`
-
-## 通知配置
-
-- 设置页支持邮件配置和 Apprise 推送配置
-- `config/config.yaml` 的 `apprise.urls` 支持多个 URL,每行一个。
-- 计划任务出错和 SESSDATA 失效时会同时触发邮件和 Apprise 推送。
-
-## MCP 局域网只读服务
-
-项目内置一个只读 MCP 服务,方便局域网内的其他 AI 客户端读取本地 B 站历史记录、统计分析、视频详情和任务状态。MCP 默认复用现有 FastAPI 服务,地址为:
+## 网页历史
-```text
-http://<服务所在机器IP>:8899/mcp/
-```
+### 配置后端
-配置位于 `config/config.yaml` 的 `server.mcp`:
+在 `config/config.yaml` 中设置自己生成的随机连接密钥,然后重启后端:
```yaml
-server:
- mcp:
- enabled: true
- path: "/mcp"
- auth_enabled: true
- token: "替换为你的随机token"
- max_page_size: 100
+browser_history:
+ sync_token: "替换为你自己生成的随机密钥"
```
-客户端需要携带请求头:
-
-```text
-Authorization: Bearer
-```
-
-也可以通过环境变量 `BHF_MCP_TOKEN` 覆盖配置文件中的 token,适合不想把 token 写入配置文件的部署方式。
-
-MCP v1 只开放读取能力,包括项目状态、可用年份、历史记录分页查询、历史搜索、年度总结、观看行为分析、标题分析、互动记录、视频详情、计划任务状态和数据健康报告。同步、下载、删除、登录、重置数据库、配置修改等有副作用的能力不会通过 MCP 暴露。
-
-内置 Resources:
-- `bili://project/overview`:项目能力概览。
-- `bili://project/tool-guide`:MCP 工具使用指南。
-- `bili://project/data-status`:当前数据目录和可用年份状态。
-- `bili://project/privacy-policy`:隐私、脱敏和禁止操作说明。
-
-常用 Tools:
-- `get_project_status`、`list_available_years`
-- `query_history_records`、`search_history_records`、`get_history_by_cid`
-- `get_daily_count`、`get_annual_summary`、`get_viewing_analytics`、`get_title_analytics`
-- `get_interaction_summary`、`query_interaction_records`、`get_interaction_status`
-- `get_video_detail`、`search_video_details`、`get_video_detail_stats`
-- `get_scheduler_tasks`、`get_scheduler_history`
-- `get_data_integrity_report`、`get_sync_result`、`get_local_data_inventory`
-
-### 互动记录补充
-
-获取历史记录时会自动补充同步收藏、点赞、投币记录,用于缓解 B 站观看历史仅保留近三个月的问题,并将可用互动数据加入年度总结分析。补充记录会在 SQLite 历史记录导入完成后一次性写入主历史库,前端历史记录页可以看到,标记为“互动补充”,备注会注明来源是收藏、点赞或投币。
-
-计划任务调用现有的历史记录获取/导入链路,因此也会触发互动记录补充。系统会检测主历史库中是否已存在“互动补充”记录,并记录导入状态;一旦导入过,后续同步和计划任务都会跳过,不会重复写入。
-
-说明:收藏夹内容接口支持分页并返回 `fav_time`,系统会不限年份同步所有可访问收藏内容;投币 Web 接口会返回已返回记录的投币时间;点赞 Web 接口主要是最近点赞视频列表,当前未发现可靠的全量历史分页和点赞时间字段。B 站用户信息接口中的注册时间字段当前文档说明通常返回 `0`,因此无法可靠按账号注册时间作为全量起点。
+也可使用服务进程的 `HISTORYHUB_SYNC_TOKEN` 环境变量。环境变量优先;未配置密钥时网页历史接口关闭。
-## 数据迁移指南
+### 配置 Chrome 扩展
-**核心结论:迁移时只需要拷贝整个 `output` 目录到新环境即可。**
+1. 打开 `chrome://extensions` 并开启开发者模式。
+2. 点击“加载已解压的扩展程序”,选择本仓库的 `extension/` 目录。
+3. 打开 HistoryHub 扩展设置,填写后端地址和连接密钥,授权访问该地址并开启同步。
+4. 在网页端打开“网页历史”,输入同一连接密钥,即可搜索和滚动查看。
-适用场景:同机路径迁移、跨机器迁移、Docker/Compose 部署、打包版/本地运行。
+扩展仅向配置并授权的后端发送 HTTP/HTTPS 访问记录,不上传 Cookie。首次导入覆盖 Chrome 当前仍保留且接口可见的历史;后续同步会保留同一网址的多次访问,重复同步不会生成重复记录。标题采用浏览器为该网址保存的标题。
-步骤:
-- 停止正在运行的服务(本地进程或容器)。
-- 备份 `output` 整个文件夹(直接拷贝或压缩打包)。
-- 在新环境放置/挂载:
- - 本地运行(uv/pip):将 `output` 放到项目根目录下,使路径为 `./output`。
- - Docker 运行:使用 `-v <本地output路径>:/app/output` 挂载;或在 `docker-compose.yml` 中将本地 `output` 目录映射到容器 `/app/output`。
- - 打包版运行:将 `output` 放置在可执行文件同级目录的 `output` 文件夹中。
-- 启动服务并验证数据是否就绪(历史记录、统计与可视化应能正常展示)。
+## Docker 部署
-注意:
-- 认证信息与运行配置位于 `config/`,不属于数据迁移范畴;新环境需按需填写 `config/config.yaml`(如 `SESSDATA` 等)。
-- Linux 环境请确保对 `output` 目录有读写权限(Docker 场景关注宿主机目录权限/属主)。
-
-## output 目录说明
-
-`output` 目录包含所有持久化数据与可再生成数据,迁移只需拷贝此目录:
-
-- `bilibili_history.db`:B 站历史记录数据库。
-- `browser_history.sqlite3`:浏览器访问记录数据库。
-- `video_details.db`:视频详情数据库。
-- `image_downloads.db`:图片下载记录数据库。
-- `database/`:业务分库集合(如 `bilibili_comments.db`、`bilibili_dynamic.db`、`bilibili_favorites.db`、`bilibili_interactions.db`、`bilibili_popular_2025.db`、`bilibili_video_details.db`、`scheduler.db`)。
-- `history_by_date/YYYY/MM/DD.json`:按日期归档的观看历史快照。
-- `api_responses/`:原始 API 响应缓存(便于重放/排错)。
-- `analytics/` 与根目录下的 `daily_count_*.json`、`monthly_count_*.json`:统计汇总结果。
-- `download_video/`:已下载的视频内容及相关封面/海报等资源。
-- `images/`:用户头像、封面及孤立资源缓存。
-- `cache/image_proxy/`:图片代理缓存(可再生成)。
-- `comment/`:用户评论原始数据。
-- `dynamic/`:动态相关原始数据/缓存。
-- `logs/YYYY/MM/`:运行日志,便于排错与审计。
-- `state/sessdata_monitor.json`:会话状态监控信息(非敏感数据)。
-- `last_import.json`:最近一次导入/同步状态记录。
-- `heatmap_comparison.html`:热力图对比可视化产物。
-- `temp/`、`tmp_video/`:运行期临时文件(可清理)。
-
-## 应用打包
-
-本项目提供了自动化打包脚本,可以将应用打包成独立的可执行文件,便于分发和部署。打包过程会自动处理依赖并清理敏感信息。
-
-**打包前准备**
-
-确保已经安装了 PyInstaller:
-
-```bash
-pip install pyinstaller
-```
-
-**打包命令**
-
-使用以下命令进行打包:
+在仓库根目录配置 `config/config.yaml`,然后执行:
```bash
-python build.py
+docker compose up -d --build
```
-**打包完成后**
-
-- 输出目录:`dist/HistoryHubBackend/`
-
-**敏感信息处理**
-
-打包过程会自动处理配置文件中的敏感信息:
-
-- 创建临时清理过的配置文件,替换以下敏感字段为示例值:
- - `SESSDATA`:替换为"你的 SESSDATA"
- - `email`:邮箱相关信息替换为示例邮箱地址和说明
- - `ssl_certfile`/`ssl_keyfile`:替换为示例路径
- - `api_key`:替换为"你的 API 密钥"
-
-- 打包完成后,临时文件会被自动删除
-- 打包版本中的配置文件包含原始结构但敏感字段被替换为示例值,用户需要首次运行时填写实际信息
-
-**运行打包后的应用**
-
-在目标系统上直接运行可执行文件:
-
-```
-# Windows系统
-HistoryHubBackend.exe
-```
+- 管理页面:`http://localhost:5173`
+- 后端:`http://localhost:8899`
+- API 文档:`http://localhost:8899/docs`
-## 缓存图片找回(近 14 天)
+Chrome 扩展中的地址必须是浏览器能够访问的后端地址。自托管时填写对应服务的地址。
-适用范围:找回 B 站 App 在过去最多 14 天内曾在屏幕上显示过的图片,包含但不限于:
-- 视频封面
-- UP 主头像
-- 推荐页视频封面(含未点开)
-- 评论区图片
-- 动态图片
-- 表情包
-- 广告图片
+## 数据保存
-手机端准备(MT 管理器):
-- 打开 MT 管理器,前往 `/storage/emulated/0/Android/data/tv.danmaku.bili/cache`
-- 长按 `cache` 文件夹,选择“压缩”,生成一个 zip 压缩包
+- `output/bilibili_history.db`:B 站历史数据库,文件名由 `config/config.yaml` 的 `db_file` 指定。
+- `output/history_by_date/`:按日期归档的 B 站历史 JSON。
+- `output/browser_history.sqlite3`:浏览器访问记录数据库。
+- `config/`:服务配置、B 站登录信息和连接密钥。
-电脑端操作:
-- 下载可执行文件 `BiliImagePipeline.exe`(Windows):https://github.com/LifeArchiveProject/HistoryHub/releases/download/v1.6.5/BiliImagePipeline.exe
-- 将手机导出的 `cache` 压缩包放到可执行文件所在目录(与 `.exe` 同级)
-- 运行可执行文件,等待自动处理
-- 处理完成后,在 `cache/ImagePipeLine/v2.ols100.1/by_date` 查看图片
+迁移或备份时,停止服务后复制 `output/` 和 `config/`,在新环境恢复到相同目录或挂载位置。不要将包含真实凭据的配置提交到仓库。
-查看与定位:
-- 图片已按分辨率分组,视频封面通常集中在高分辨率文件夹,便于快速浏览
-- 可按日期结构快速定位最近内容
+## API
-已知问题:
-- 小分辨率图片在资源管理器里可能无法预览(多见于表情、头像),使用浏览器打开可正常显示
-- 14 天为缓存可取回的上限,超过时间窗口的内容通常已被系统清理,无法恢复
-- 若无法直接从手机导出上述路径,请先在手机端完成压缩再拷贝 zip
+完整接口见运行中的 `/docs`。
-## 贡献指南
+| 接口 | 用途 |
+| --- | --- |
+| `GET /health` | 服务状态 |
+| `/login/*` | B 站登录 |
+| `GET /fetch/bili-history` | 获取并保存 B 站历史 |
+| `GET /fetch/bili-history-realtime` | 同步 B 站新增历史 |
+| `GET /history/all` | 分页查看 B 站历史 |
+| `GET /history/search` | 搜索 B 站历史 |
+| `POST /browser-history/sync` | 接收 Chrome 访问记录 |
+| `GET /browser-history/records` | 游标分页查询网页历史 |
-1. Fork 项目
-2. 创建特性分支
-3. 提交更改
-4. 发起 Pull Request
+网页历史两个接口都需要 `Authorization: Bearer <连接密钥>`。
-## 致谢
+## 构建
-- [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) - 哔哩哔哩-API 收集整理,本项目使用其 API 接口获取 B 站用户数据
-- [Yutto](https://yutto.nyakku.moe/) - 可爱的 B 站视频下载工具,本项目使用其进行视频下载功能
-- [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) - 强大且灵活的 HTML5 视频播放器
-- [aicu.cc](https://www.aicu.cc/) - 第三方 B 站用户评论 API
-- 所有贡献者,特别感谢:
- - [@eli-yip](https://github.com/eli-yip) 对 Docker 部署的贡献
- - [@QYG2297248353](https://github.com/QYG2297248353) 对 1Panel 部署的贡献
+网页构建:在 `frontend/` 运行 `npm run build`。桌面端使用同目录下的 `npm run tauri:build`,需要对应平台的 Tauri 构建环境。后端可通过项目根目录的 `python build.py` 打包。
-## Star History
+## 许可证
-[](https://star-history.com/#LifeArchiveProject/HistoryHub&Date)
+[MIT](LICENSE.md)
diff --git a/app.spec b/app.spec
index 4d404d5..f3b57c0 100644
--- a/app.spec
+++ b/app.spec
@@ -1,191 +1,32 @@
# -*- mode: python ; coding: utf-8 -*-
-block_cipher = None
-
-import os
-import sys
-
-# 获取虚拟环境的site-packages路径
-if sys.platform.startswith('win'):
- venv_site_packages = '.venv/Lib/site-packages'
- yutto_exe = os.path.join(os.getcwd(), '.venv', 'Scripts', 'yutto.exe')
-else: # Linux/macOS
- python_version = f"python{sys.version_info.major}.{sys.version_info.minor}"
- venv_site_packages = f'.venv/lib/{python_version}/site-packages'
- yutto_exe = os.path.join(os.getcwd(), '.venv', 'bin', 'yutto')
-
-# 检查yutto可执行文件
-if not os.path.exists(yutto_exe):
- print(f"警告: 找不到 yutto: {yutto_exe}")
- if os.name == 'nt': # Windows
- # 尝试查找yutto.exe
- import glob
- yutto_candidates = glob.glob(os.path.join('.venv', '**', 'yutto.exe'), recursive=True)
- if yutto_candidates:
- yutto_exe = yutto_candidates[0]
- print(f"找到替代的yutto.exe: {yutto_exe}")
- else: # Linux/macOS
- # 尝试查找yutto
- import glob
- yutto_candidates = glob.glob(os.path.join('.venv', '**', 'yutto'), recursive=True)
- if yutto_candidates:
- yutto_exe = yutto_candidates[0]
- print(f"找到替代的yutto: {yutto_exe}")
-
-# 设置平台相关的路径分隔符
-path_sep = ';' if sys.platform.startswith('win') else ':'
-
a = Analysis(
['app_launcher.py'],
pathex=[],
- binaries=[
- (yutto_exe, '.'),
- ],
+ binaries=[],
datas=[
('config/*', 'config'),
('scripts', 'scripts'),
('routers', 'routers'),
('main.py', '.'),
- (os.path.join(venv_site_packages, 'pyecharts/datasets'), 'pyecharts/datasets'),
- (os.path.join(venv_site_packages, 'pyecharts/render/templates'), 'pyecharts/render/templates'),
- (os.path.join(venv_site_packages, 'yutto'), 'yutto'),
- # 添加requirements.txt中所有依赖的相关模块
- (os.path.join(venv_site_packages, 'uvicorn'), 'uvicorn'),
- (os.path.join(venv_site_packages, 'fastapi'), 'fastapi'),
- (os.path.join(venv_site_packages, 'qrcode'), 'qrcode'),
- (os.path.join(venv_site_packages, 'requests'), 'requests'),
- (os.path.join(venv_site_packages, 'jieba'), 'jieba'),
- (os.path.join(venv_site_packages, 'pydantic'), 'pydantic'),
- (os.path.join(venv_site_packages, 'numpy'), 'numpy'),
- (os.path.join(venv_site_packages, 'sklearn'), 'sklearn'),
- (os.path.join(venv_site_packages, 'scikit_learn-1.5.2.dist-info'), 'scikit_learn-1.5.2.dist-info'),
- (os.path.join(venv_site_packages, 'snownlp'), 'snownlp'),
- (os.path.join(venv_site_packages, 'yaml'), 'yaml'),
- (os.path.join(venv_site_packages, 'schedule'), 'schedule'),
- (os.path.join(venv_site_packages, 'pandas'), 'pandas'),
- (os.path.join(venv_site_packages, 'openpyxl'), 'openpyxl'),
- (os.path.join(venv_site_packages, 'pymysql'), 'pymysql'),
- (os.path.join(venv_site_packages, 'urllib3'), 'urllib3'),
- (os.path.join(venv_site_packages, 'httpx'), 'httpx'),
- (os.path.join(venv_site_packages, 'aiohttp'), 'aiohttp'),
- (os.path.join(venv_site_packages, 'jinja2'), 'jinja2'),
- (os.path.join(venv_site_packages, 'pyecharts'), 'pyecharts'),
- (os.path.join(venv_site_packages, 'PIL'), 'PIL'),
- (os.path.join(venv_site_packages, 'yutto'), 'yutto'),
- (os.path.join(venv_site_packages, 'dateutil'), 'dateutil'),
- (os.path.join(venv_site_packages, 'psutil'), 'psutil'),
- (os.path.join(venv_site_packages, 'tqdm'), 'tqdm'),
- (os.path.join(venv_site_packages, 'email_validator'), 'email_validator'),
- (os.path.join(venv_site_packages, 'loguru'), 'loguru'),
],
hiddenimports=[
- 'fastapi',
- 'fastapi.middleware',
- 'fastapi.middleware.cors',
- 'uvicorn',
+ 'main',
'uvicorn.logging',
- 'uvicorn.protocols',
- 'uvicorn.protocols.http',
+ 'uvicorn.loops.auto',
+ 'uvicorn.loops.asyncio',
'uvicorn.protocols.http.auto',
- 'uvicorn.protocols.websockets',
+ 'uvicorn.protocols.http.h11_impl',
'uvicorn.protocols.websockets.auto',
- 'uvicorn.lifespan',
'uvicorn.lifespan.on',
- 'pydantic',
- 'scripts',
- 'routers',
- 'numpy',
- 'pandas',
- 'PIL',
- 'jieba',
- 'main',
- 'asyncio',
- 'starlette',
- 'starlette.middleware',
- 'starlette.middleware.cors',
- 'jinja2.ext',
- 'scipy',
- 'pyecharts',
- 'pyecharts.charts',
- 'pyecharts.components',
- 'pyecharts.options',
- 'pyecharts.globals',
- 'pyecharts.commons.utils',
- 'pyecharts.charts.basic_charts.bar',
- 'pyecharts.charts.basic_charts.pie',
- 'pyecharts.charts.basic_charts.line',
- 'pyecharts.charts.basic_charts.scatter',
- 'pyecharts.charts.basic_charts.heatmap',
- 'pyecharts.charts.basic_charts.funnel',
- 'pyecharts.charts.basic_charts.effectscatter',
- 'pyecharts.charts.composite_charts.page',
- 'pyecharts.charts.composite_charts.timeline',
- 'pyecharts.charts.composite_charts.grid',
- 'starlette.middleware',
- 'starlette.middleware.cors',
- 'starlette.types',
- 'starlette.routing',
- 'starlette.websockets',
- 'scipy.special.cython_special',
- 'scipy.sparse.csgraph._validation',
- # requirements.txt中所有依赖
- 'qrcode',
- 'requests',
- 'jieba',
- 'pydantic',
- 'numpy',
- 'sklearn',
- 'sklearn.cluster',
- 'sklearn.cluster.k_means_',
- 'sklearn.utils',
- 'sklearn.utils.extmath',
- 'sklearn.preprocessing',
- 'sklearn.metrics',
- 'snownlp',
- 'yaml',
- 'schedule',
- 'pandas',
- 'openpyxl',
- 'pymysql',
- 'urllib3',
- 'httpx',
- 'aiohttp',
- 'jinja2',
- 'pyecharts',
- 'PIL',
- 'yutto',
- 'dateutil',
- 'psutil',
- 'tqdm',
- 'email_validator',
- 'loguru',
- # 以下是fastapi和其他库的子模块
- 'fastapi.applications',
- 'fastapi.routing',
- 'fastapi.responses',
- 'fastapi.exceptions',
- 'fastapi.encoders',
- 'fastapi.utils',
- 'fastapi.openapi',
- 'fastapi.staticfiles',
- 'fastapi.websockets',
- 'fastapi.background',
- 'fastapi.concurrency',
- 'fastapi.security',
- 'fastapi.dependency',
- 'fastapi.params',
- 'python-dateutil',
],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
noarchive=False,
)
-pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+pyz = PYZ(a.pure)
exe = EXE(
pyz,
@@ -207,10 +48,9 @@ exe = EXE(
coll = COLLECT(
exe,
a.binaries,
- a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='HistoryHubBackend',
-)
\ No newline at end of file
+)
diff --git a/build.py b/build.py
index bfb3e4a..7c13044 100644
--- a/build.py
+++ b/build.py
@@ -72,18 +72,6 @@ def build(build_type):
else:
print(f"{file}: {'存在' if exists else '不存在'}")
- # 确保 yutto.exe 存在
- if os.name == 'nt': # Windows
- yutto_exe = os.path.join('.venv', 'Scripts', 'yutto.exe')
- if not os.path.exists(yutto_exe):
- raise FileNotFoundError(f"找不到 yutto.exe: {yutto_exe}")
- print(f"\n找到 yutto.exe: {yutto_exe}")
- else: # Linux/macOS
- yutto_exe = os.path.join('.venv', 'bin', 'yutto')
- if not os.path.exists(yutto_exe):
- raise FileNotFoundError(f"找不到 yutto: {yutto_exe}")
- print(f"\n找到 yutto: {yutto_exe}")
-
# 确定包管理工具 (uv或pip)
use_uv = False
uv_path = os.path.join('.venv', 'Scripts', 'uv.exe') if os.name == 'nt' else os.path.join('.venv', 'bin', 'uv')
@@ -112,33 +100,6 @@ def build(build_type):
subprocess.run([python_exe, '-m', 'pip', 'install', 'pyinstaller'])
print("\n已安装 PyInstaller")
- # 确保psutil版本一致 - 尝试安装与应用要求相同的版本
- print("\n检查psutil版本...")
- try:
- # 检查代码中需要的psutil版本
- with open('requirements.txt', 'r') as f:
- requirements = f.read()
-
- # 查找psutil版本要求
- psutil_req = None
- for line in requirements.splitlines():
- if line.strip().startswith('psutil'):
- psutil_req = line.strip()
- break
-
- if psutil_req:
- print(f"应用需要的psutil版本: {psutil_req}")
- # 根据包管理工具安装指定版本的psutil
- if use_uv:
- subprocess.run([uv_path, 'pip', 'install', psutil_req, '--force'])
- else:
- subprocess.run([python_exe, '-m', 'pip', 'install', psutil_req, '--force-reinstall'])
- print(f"已安装psutil: {psutil_req}")
- else:
- print("在requirements.txt中未找到psutil版本要求")
- except Exception as e:
- print(f"检查/安装psutil过程中出错: {str(e)}")
-
# 确保 app.spec 存在
if not os.path.exists('app.spec'):
# 创建基本的spec文件
@@ -151,7 +112,6 @@ def build(build_type):
makespec_cmd = [
python_exe, '-m', 'PyInstaller',
'--name=HistoryHubBackend',
- '--add-binary', f"{yutto_exe}{path_sep}.",
'--add-data', f"config/*{path_sep}config",
'--add-data', f"scripts{path_sep}scripts",
'--add-data', f"routers{path_sep}routers",
@@ -189,16 +149,11 @@ def build(build_type):
# 创建临时配置目录
os.makedirs(clean_config_dir)
- # 1. 复制所有非敏感配置文件到临时目录
- import glob
+ # 1. 复制历史记录功能使用的配置文件
import shutil # 确保在这里导入shutil
- for config_file in glob.glob(os.path.join(original_config_dir, '*')):
- file_name = os.path.basename(config_file)
- # 跳过敏感文件和备份文件
- if file_name.endswith('.bak') or file_name == 'config.yaml':
- continue
- if os.path.isfile(config_file):
- shutil.copy2(config_file, os.path.join(clean_config_dir, file_name))
+ for file_name in ('categories.json', 'sql_statements_sqlite.py'):
+ config_file = os.path.join(original_config_dir, file_name)
+ shutil.copy2(config_file, os.path.join(clean_config_dir, file_name))
# 2. 创建清理过敏感信息的配置文件
clean_config_file = cleanup_sensitive_config()
@@ -235,16 +190,7 @@ def build(build_type):
print("\n打包失败!")
return False
- # 复制 yutto.exe 到输出目录
dist_dir = os.path.join('dist', 'HistoryHubBackend')
- if os.path.exists(yutto_exe) and os.path.exists(dist_dir):
- try:
- shutil.copy2(yutto_exe, dist_dir)
- print(f"\n已复制 yutto.exe 到 {dist_dir}")
- except Exception as e:
- print(f"\n复制 yutto.exe 时出错: {e}")
- else:
- print(f"\n警告: 无法复制yutto.exe - 目标目录 {dist_dir} 不存在")
# 复制配置文件到应用根目录
if os.path.exists(dist_dir):
@@ -295,22 +241,6 @@ def create_spec(source_spec, target_spec, venv_site_packages=None):
content = content.replace('routers;routers', 'routers:routers')
content = content.replace('main.py;.', 'main.py:.')
- # 处理yutto.exe的路径
- content = content.replace('yutto.exe;.', 'yutto:.')
-
- # 特别针对yutto_exe路径进行处理,确保在非Windows平台上正确
- if sys.platform.startswith('darwin'): # macOS
- yutto_dir = os.path.join(os.getcwd(), '.venv', 'bin')
- content = content.replace(
- "yutto_exe = os.path.join(os.getcwd(), '.venv', 'Scripts', 'yutto.exe')",
- f"yutto_exe = os.path.join(os.getcwd(), '.venv', 'bin', 'yutto')"
- )
- elif sys.platform.startswith('linux'):
- yutto_dir = os.path.join(os.getcwd(), '.venv', 'bin')
- content = content.replace(
- "yutto_exe = os.path.join(os.getcwd(), '.venv', 'Scripts', 'yutto.exe')",
- f"yutto_exe = os.path.join(os.getcwd(), '.venv', 'bin', 'yutto')"
- )
# 添加虚拟环境路径到pathex
if venv_site_packages and os.path.exists(venv_site_packages):
@@ -454,96 +384,38 @@ def print_usage():
print(" 将打包应用程序")
def cleanup_sensitive_config():
- """清理config.yaml文件中的敏感信息,返回临时文件路径"""
+ """创建只含历史记录功能配置且不含凭据的临时文件。"""
config_path = os.path.join('config', 'config.yaml')
temp_config_path = os.path.join('config', 'config_temp.yaml')
-
+
if not os.path.exists(config_path):
print(f"\n警告: 找不到配置文件 {config_path}")
return None
-
+
try:
- # 行处理方式 - 保留原始格式和注释
- with open(config_path, 'r', encoding='utf-8') as f:
- lines = f.readlines()
-
- # 先读取YAML获取结构信息,用于识别敏感字段
with open(config_path, 'r', encoding='utf-8') as f:
config = yaml.safe_load(f)
-
- # 敏感字段路径列表和对应的示例值
- sensitive_fields = {
- "SESSDATA": "你的SESSDATA",
- "bili_jct": "你的bili_jct",
- "DedeUserID": "你的DedeUserID",
- "DedeUserID__ckMd5": "你的DedeUserID__ckMd5",
- "email.password": "你的邮箱授权码",
- "email.sender": "example@example.com",
- "email.auth_username": "example@example.com",
- "email.receiver": "example@example.com",
- "server.ssl_certfile": "path/to/cert.pem",
- "server.ssl_keyfile": "path/to/key.pem",
- "browser_history.sync_token": ""
+
+ server = config.get('server', {})
+ clean_config = {
+ 'SESSDATA': '',
+ 'bili_jct': '',
+ 'DedeUserID': '',
+ 'DedeUserID__ckMd5': '',
+ 'db_file': config['db_file'],
+ 'browser_history': {'sync_token': ''},
+ 'server': {
+ key: server[key]
+ for key in ('host', 'port', 'ssl_enabled')
+ if key in server
+ },
}
-
- # 将一些独立的顶级字段也加入检查
- for field in ['SESSDATA', 'bili_jct', 'DedeUserID', 'DedeUserID__ckMd5', 'email', 'ssl_certfile', 'ssl_keyfile', 'api_key']:
- if field in config and not isinstance(config[field], dict) and field not in sensitive_fields:
- sensitive_fields[field] = f"你的{field}"
-
- # 处理每一行,根据冒号和缩进识别敏感字段
- new_lines = []
- for line in lines:
- # 跳过注释和空行
- if line.strip().startswith('#') or not line.strip():
- new_lines.append(line)
- continue
-
- # 检查当前行是否包含敏感字段
- matching_sensitive_field = None
-
- # 计算当前行的缩进级别
- indent_level = len(line) - len(line.lstrip())
- field_line = line.strip()
-
- # 如果行包含冒号,可能是一个字段定义
- if ':' in field_line:
- field_name = field_line.split(':', 1)[0].strip()
-
- # 构建完整路径来检查是否匹配敏感字段
- for sensitive_path, example_value in sensitive_fields.items():
- # 检查是否是叶子节点或完整匹配
- path_parts = sensitive_path.split('.')
- if field_name == path_parts[-1]:
- # 潜在匹配,保存找到的敏感字段
- matching_sensitive_field = sensitive_path
- break
-
- if matching_sensitive_field and ':' in line:
- # 获取示例值
- example_value = sensitive_fields.get(matching_sensitive_field, "示例值")
-
- # 保持原始缩进和键名,但将值替换为示例值
- key_part = line.split(':', 1)[0] + ': '
- remainder = line.split(':', 1)[1]
-
- # 如果值部分只包含简单值,则替换为示例值
- if not remainder.strip().startswith('{') and not remainder.strip().startswith('['):
- new_line = key_part + f'"{example_value}"' + '\n'
- new_lines.append(new_line)
- else:
- # 对于复杂结构,保持不变
- new_lines.append(line)
- else:
- new_lines.append(line)
-
- # 始终写入临时文件,无论是否修改
- print("\n清理配置文件中的敏感信息...")
+ clean_config['server'].update(ssl_certfile='', ssl_keyfile='')
+
with open(temp_config_path, 'w', encoding='utf-8') as f:
- f.writelines(new_lines)
- print("临时配置文件已创建,敏感信息已替换为示例值")
+ yaml.safe_dump(clean_config, f, allow_unicode=True, sort_keys=False)
+ print("临时配置文件已创建,认证信息已清空")
return temp_config_path
-
except Exception as e:
print(f"\n清理配置文件时出错: {e}")
import traceback
@@ -600,8 +472,7 @@ def post_build_copy(dist_dir):
f.write("配置文件说明\n")
f.write("===========\n\n")
f.write("所有配置文件位于 _internal/config 目录中\n")
- f.write("- config.yaml: 主配置文件,包含B站认证、邮件、API等配置\n")
- f.write("- scheduler_config.yaml: 计划任务配置文件\n")
+ f.write("- config.yaml: 主配置文件,包含B站认证、浏览器同步与服务配置\n")
print(f"已创建配置说明文件: {readme_path}")
return True
diff --git a/config/config.yaml b/config/config.yaml
index 0515694..4255422 100644
--- a/config/config.yaml
+++ b/config/config.yaml
@@ -1,139 +1,13 @@
-# B站用户的SESSDATA,用于API认证
-SESSDATA: "Cookie里的SESSDATA字段值"
-
-# 原始历史记录数据的输入文件夹
-input_folder: "history_by_date"
-
-# 清理后的历史记录数据的输出文件夹
-output_folder: "output"
-
-# SQLite数据库文件名
-db_file: "bilibili_history.db"
-
-# Chrome 扩展与网页历史页面使用同一连接密钥,也可设置 HISTORYHUB_SYNC_TOKEN 环境变量。
+SESSDATA: Cookie里的SESSDATA字段值
+bili_jct: 你的bili_jct
+DedeUserID: 你的DedeUserID
+DedeUserID__ckMd5: 你的DedeUserID__ckMd5
+db_file: bilibili_history.db
browser_history:
- sync_token: ""
-
-# 导入日志文件名,用于记录上次导入的位置
-log_file: "last_import_log.json"
-
-# 分类配置文件名
-categories_file: "categories.json"
-
-# 每日观看数量统计文件夹
-daily_count_folder: "daily_count"
-
-# 热力图模板文件名
-heatmap_template: "template.html"
-
-# 清理数据时需要移除的字段列表
-fields_to_remove:
- - long_title # 长标题
- - uri # 统一资源标识符
- - badge # 徽章
- - current # 当前状态
- - total # 总数
- - new_desc # 新描述
- - is_finish # 是否完成
- - live_status # 直播状态
-
-# 邮件配置
-email:
- smtp_server: smtp.qq.com
- smtp_port: 587
- sender: "xxxx@qq.com"
- password: "xxxx" # QQ邮箱授权码
- receiver: "xxxx@qq.com"
-
-# Apprise推送配置
-apprise:
- enabled: false
- urls:
-
-# 日志文件夹
-log_folder: "/www/wwwroot/python/logs"
-
-# yutto 下载器配置
-yutto:
- basic:
- # 设置下载目录
- dir: "./output/download_video"
- # 设置临时文件目录
- tmp_dir: "./output/tmp_video"
- # 设置大会员严格校验
- vip_strict: false
- # 设置登录严格校验
- login_strict: false
-
- resource:
- # 下载字幕
- require_subtitle: true
- # 默认是否仅下载音频
- only_audio: false
-
- danmaku:
- # 设置弹幕字体大小
- font_size: 30
- # 设置弹幕屏蔽关键词
- block_keyword_patterns: []
-
- batch:
- # 下载额外剧集
- with_section: true
-
-# 服务器配置
+ sync_token: ''
server:
- # 说明:0.0.0.0/:: 为“监听所有网卡”的绑定地址,客户端访问请使用 localhost/127.0.0.1。
- # 计划任务(调度器)的内部API调用会在检测到 host=0.0.0.0/:: 时自动使用 127.0.0.1。
- host: "0.0.0.0" # 允许从任何IP访问
- port: 8899 # 设置你想要的端口号
- # HTTPS配置
+ host: 0.0.0.0
+ port: 8899
ssl_enabled: false
- ssl_certfile: "你的fullchain.pem"
- ssl_keyfile: "你的privkey.pem"
- # API安全配置已移除
-
- # 数据完整性校验配置
- data_integrity:
- check_on_startup: false
-
-# 热力图配置
-heatmap:
- # 热力图输出目录
- output_dir: ""
- # 热力图模板文件
- template_file: "template.html"
- # 热力图标题
- title: "Bilibili 每年每日视频观看热力图"
- # 图表尺寸配置
- chart:
- width: "1000px"
- height: "200px"
- # 热力图颜色配置
- colors:
- pieces:
- - min: 1
- max: 10
- color: "#FFECF1"
- - min: 11
- max: 50
- color: "#FFB3CA"
- - min: 51
- max: 100
- color: "#FF8CB0"
- - min: 101
- max: 200
- color: "#FF6699"
- - min: 201
- max: 9999
- color: "#E84B85"
-
-# 在配置文件中添加任务超时设置
-scheduler:
- task_timeout: 600 # 任务超时时间(秒)
- retry_delay: 300 # 重试延迟时间(秒)
- max_retries: 3 # 最大重试次数
-
-bili_jct: "你的bili_jct"
-DedeUserID: "你的DedeUserID"
-DedeUserID__ckMd5: "你的DedeUserID__ckMd5"
+ ssl_certfile: 你的fullchain.pem
+ ssl_keyfile: 你的privkey.pem
diff --git a/config/scheduler_config.yaml b/config/scheduler_config.yaml
deleted file mode 100644
index a843660..0000000
--- a/config/scheduler_config.yaml
+++ /dev/null
@@ -1,92 +0,0 @@
-base_url: http://localhost:8899
-error_handling:
- notify_on_failure: true
- stop_on_failure: true
-scheduler:
- log_level: INFO
- retry:
- delay: 60
- max_attempts: 3
-tasks:
- # 每10分钟抓取B站热门视频
- fetch_popular_videos:
- endpoint: /bilibili/popular/all
- method: GET
- name: 获取B站热门视频
- params:
- size: 20
- max_pages: 100
- save_to_db: true
- include_videos: false
- requires: []
- schedule:
- type: interval
- interval_value: 10
- interval_unit: minutes
-
- # 每10分钟校验SESSDATA并在失效时发送邮件
- sessdata_health_check:
- endpoint: /login/check-and-notify
- method: GET
- name: SESSDATA健康检查
- params: {}
- requires: []
- schedule:
- type: interval
- interval_value: 10
- interval_unit: minutes
-
- # 1. 无依赖的基础任务
- fetch_history:
- endpoint: /fetch/bili-history
- method: GET
- name: 获取B站历史记录
- params: {}
- requires: []
- schedule:
- time: 00:00
- type: daily
-
- # 2. 依赖 fetch_history
- import_data:
- endpoint: /importSqlite/import_data_sqlite
- method: POST
- name: 导入数据到数据库
- requires:
- - fetch_history
- schedule:
- type: chain
-
- # 3. 依赖 import_data
- analyze_data:
- endpoint: /analysis/analyze
- method: POST
- name: 分析历史数据
- requires:
- - import_data
- schedule:
- type: chain
-
- # 4. 依赖 analyze_data
- generate_heatmap:
- endpoint: /heatmap/generate_heatmap
- method: POST
- name: 生成观看热力图
- requires:
- - analyze_data
- schedule:
- type: chain
-
- # 5. 依赖 generate_heatmap
- send_daily_report:
- endpoint: /log/send-email
- method: POST
- name: 发送每日报告
- params:
- content: null
- mode: simple
- subject: B站历史记录日报 - {current_time}
- requires:
- - generate_heatmap
- schedule:
- type: chain
diff --git a/config/sql_statements_mysql.py b/config/sql_statements_mysql.py
deleted file mode 100644
index 7da3b9e..0000000
--- a/config/sql_statements_mysql.py
+++ /dev/null
@@ -1,67 +0,0 @@
-SHOW_DATABASES = "SHOW DATABASES LIKE %s"
-CREATE_DATABASE = "CREATE DATABASE `{db_name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"
-SHOW_TABLES = """
- SELECT COUNT(*)
- FROM information_schema.tables
- WHERE table_schema = %s
- AND table_name = %s
-"""
-CREATE_TABLE_DEFAULT = """
- CREATE TABLE {table} (
- id BIGINT PRIMARY KEY COMMENT '主键,使用雪花算法等库生成的唯一ID',
- title VARCHAR(255) NOT NULL COMMENT '条目标题,字符串,最大255字符',
- long_title VARCHAR(255) COMMENT '条目副标题(有时为空),最大255字符',
- cover VARCHAR(255) COMMENT '条目封面图url,用于专栏以外的条目',
- covers JSON COMMENT '条目封面图组,有效时array无效时null,仅用于专栏',
- uri VARCHAR(255) COMMENT '重定向url仅用于剧集和直播',
- oid BIGINT NOT NULL COMMENT '目标id稿件视频&剧集(当business=archive或business=pgc时):稿件avid直播(当business=live时):直播间id文章(当business=article时):文章cvid文集(当business=article-list时):文集rlid',
- epid BIGINT DEFAULT 0 COMMENT '剧集epid 仅用于剧集',
- bvid VARCHAR(50) NOT NULL COMMENT '稿件bvid 仅用于稿件视频',
- page INT DEFAULT 1 COMMENT '观看到的视频分P数 仅用于稿件视频',
- cid BIGINT COMMENT '观看到的对象id 稿件视频&剧集(当business=archive或business=pgc时):视频cid文集(当business=article-list时):文章cvid',
- part VARCHAR(255) COMMENT '观看到的视频分 P 标题 仅用于稿件视频',
- business VARCHAR(50) COMMENT '视频业务类型(如archive代表普通视频),最大50字符',
- dt INT NOT NULL COMMENT '记录查看的平台代码 1 3 5 7 手机端,2 web端,4 6 pad端,33TV端,0其他',
- videos INT DEFAULT 1 COMMENT '视频分 P 数目 仅用于稿件视频,整数型,默认为1',
- author_name VARCHAR(100) NOT NULL COMMENT 'UP 主昵称',
- author_face VARCHAR(255) COMMENT 'UP 主头像 url',
- author_mid BIGINT NOT NULL COMMENT 'UP 主 mid',
- view_at BIGINT NOT NULL COMMENT '查看时间 时间戳',
- progress INT DEFAULT 0 COMMENT '视频观看进度,单位为秒,用于稿件视频或剧集',
- badge VARCHAR(50) COMMENT '角标文案 稿件视频 / 剧集 / 笔记',
- show_title VARCHAR(255) COMMENT '分 P 标题 用于稿件视频或剧集',
- duration INT NOT NULL COMMENT '视频总时长 用于稿件视频或剧集',
- current VARCHAR(255) COMMENT '未知字段',
- total INT DEFAULT 0 COMMENT '总计分集数 仅用于剧集',
- new_desc VARCHAR(255) COMMENT '最新一话 / 最新一 P 标识 用于稿件视频或剧集',
- is_finish TINYINT(1) DEFAULT 0 COMMENT '是否观看完,布尔值,0为否,1为是',
- is_fav TINYINT(1) DEFAULT 0 COMMENT '是否收藏,布尔值,0为否,1为是',
- kid BIGINT COMMENT '条目目标 id',
- tag_name VARCHAR(100) COMMENT '子分区名 用于稿件视频和直播',
- live_status TINYINT(1) DEFAULT 0 COMMENT '直播状态 仅用于直播0未开播1已开播',
- main_category VARCHAR(100) COMMENT '主分区名称',
- remark TEXT COMMENT '用户添加的备注信息',
- remark_time BIGINT DEFAULT 0 COMMENT '备注添加时间的时间戳',
- INDEX (author_mid) COMMENT '建立作者MID的索引,用于快速查询',
- INDEX (view_at) COMMENT '建立观看时间的索引',
- INDEX (remark_time) COMMENT '建立备注时间的索引'
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-"""
-CREATE_TABLE_LIKE = "CREATE TABLE {new_table} LIKE {reference_table};"
-SELECT_DATABASE = "SELECT DATABASE() AS current_db;"
-
-INSERT_DATA = """
- INSERT INTO {table} (
- id, title, long_title, cover, covers, uri, oid, epid, bvid, page, cid, part,
- business, dt, videos, author_name, author_face, author_mid, view_at, progress,
- badge, show_title, duration, current, total, new_desc, is_finish, is_fav, kid,
- tag_name, live_status, main_category, remark, remark_time
- ) VALUES (
- %(id)s, %(title)s, %(long_title)s, %(cover)s, %(covers)s, %(uri)s, %(oid)s,
- %(epid)s, %(bvid)s, %(page)s, %(cid)s, %(part)s, %(business)s, %(dt)s,
- %(videos)s, %(author_name)s, %(author_face)s, %(author_mid)s, %(view_at)s,
- %(progress)s, %(badge)s, %(show_title)s, %(duration)s, %(current)s, %(total)s,
- %(new_desc)s, %(is_finish)s, %(is_fav)s, %(kid)s, %(tag_name)s, %(live_status)s,
- %(main_category)s, %(remark)s, %(remark_time)s
- )
-"""
diff --git a/config/sql_statements_sqlite.py b/config/sql_statements_sqlite.py
index dff4bc9..d404563 100644
--- a/config/sql_statements_sqlite.py
+++ b/config/sql_statements_sqlite.py
@@ -37,17 +37,6 @@
);
"""
-# 删除记录表创建语句
-CREATE_TABLE_DELETED_HISTORY = """
-CREATE TABLE IF NOT EXISTS deleted_history (
- id INTEGER PRIMARY KEY,
- bvid TEXT NOT NULL,
- view_at INTEGER NOT NULL,
- delete_time INTEGER NOT NULL,
- UNIQUE(bvid, view_at)
-);
-"""
-
CREATE_INDEXES = [
"CREATE INDEX IF NOT EXISTS idx_{table}_author_mid ON {table} (author_mid);",
"CREATE INDEX IF NOT EXISTS idx_{table}_view_at ON {table} (view_at);",
diff --git a/config/template.html b/config/template.html
deleted file mode 100644
index c261140..0000000
--- a/config/template.html
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- {{ title }}
-
-
-
-
-
- {{ title }}
- {% for chart in charts %}
-
-
{{ chart.year }} 年
-
- {{ chart.chart_html | safe }}
-
-
- {% endfor %}
-
-
diff --git a/docker/Dockerfile.cpu b/docker/Dockerfile.cpu
index 93471d0..ef71b17 100644
--- a/docker/Dockerfile.cpu
+++ b/docker/Dockerfile.cpu
@@ -7,10 +7,6 @@ ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
ENV DEBIAN_FRONTEND=noninteractive
-RUN apt-get update && \
- apt-get install -y ffmpeg && \
- apt-get clean && \
- rm -rf /var/lib/apt/lists/*
ENV UV_LINK_MODE=copy
COPY --from=ghcr.io/astral-sh/uv:0.6.12 /uv /uvx /bin/
diff --git a/frontend/Dockerfile b/frontend/Dockerfile
index d7f5b35..b147678 100644
--- a/frontend/Dockerfile
+++ b/frontend/Dockerfile
@@ -1,16 +1,16 @@
-FROM oven/bun:1 AS base
+FROM node:20-alpine AS base
WORKDIR /app
FROM base AS install
-COPY package.json bun.lock .
-RUN bun install
+COPY package.json package-lock.json ./
+RUN npm ci --include=optional --no-fund --no-audit
FROM base AS build
ARG BACKEND_URL_ARG=http://localhost:8899
ENV VITE_DEFAULT_BACKEND_URL=${BACKEND_URL_ARG}
COPY . .
COPY --from=install /app/node_modules node_modules
-RUN bun run build
+RUN npm run build
FROM caddy:2-alpine AS release
COPY --from=build /app/dist /app
diff --git a/frontend/README.md b/frontend/README.md
index 2537928..e3d5b03 100644
--- a/frontend/README.md
+++ b/frontend/README.md
@@ -1,178 +1,26 @@
# HistoryHub 前端
-基于 Vue 3 的网页与 B 站历史记录管理界面,支持浏览器历史搜索、隐私显示、B 站观看历史分析与媒体管理。
+基于 Vue 3 的 B站与网页历史记录界面,提供历史同步、搜索和原链接访问。列表使用后端分页,滚动加载后续记录。
-前端位于 [HistoryHub/frontend](https://github.com/LifeArchiveProject/HistoryHub/tree/master/frontend),与同一仓库的 [HistoryHub 后端](https://github.com/LifeArchiveProject/HistoryHub) 配合使用。
+## 启动
-## 快速开始
+在仓库根目录配置并启动后端,然后在此目录执行:
-### 从源码启动前后端
-
-安装 [Docker](https://docs.docker.com/get-started/get-docker/),然后克隆仓库:
-
-```bash
-git clone https://github.com/LifeArchiveProject/HistoryHub.git
-cd HistoryHub
-```
-
-在仓库根目录的 `config/config.yaml` 中填写 `browser_history.sync_token`,然后构建并启动:
-
-```bash
-docker compose up -d --build
-```
-
-打开 `http://localhost:5173`。默认后端地址为 `http://localhost:8899`,自托管时可在前端设置中修改。
-
-### 仅构建前端镜像
-
-在 `frontend/` 目录执行:
-
-```bash
-docker build -t historyhub-frontend:local .
-docker run --name historyhub-frontend-web -p 5173:80 -d historyhub-frontend:local
-```
-
-### [通过 1Panel 部署](https://github.com/LifeArchiveProject/HistoryHub/discussions/65)
-由社区贡献者 [@QYG2297248353](https://github.com/QYG2297248353) 实现 ([#66](https://github.com/LifeArchiveProject/HistoryHub/pull/66))
-### 使用源码安装
-
-1. 克隆项目
```bash
-git clone https://github.com/LifeArchiveProject/HistoryHub.git
-cd HistoryHub/frontend
-```
-
-2. 安装依赖
-```bash
-npm install
-```
-
-3. 启动开发服务器
-```bash
-# 网页版开发
+npm ci
npm run dev
```
-## 首次使用指南
-
-### 网页历史
-
-1. 在后端配置 `HISTORYHUB_SYNC_TOKEN`,或在 `config/config.yaml` 中配置 `browser_history.sync_token`。
-2. 将 Chrome 扩展连接到同一个本地或自托管后端,并填写相同密钥,详见[网页历史连接说明](https://github.com/LifeArchiveProject/HistoryHub#网页历史)。
-3. 打开侧边栏的“网页历史”,输入连接密钥并点击“保存并连接”。密钥只保存在当前浏览器,并仅随网页历史请求发送。
-4. 输入标题或网址进行搜索,滚动到底部加载下一页,每页 50 条;隐私模式会遮蔽标题、域名和访问时间。
-
-网页历史无需登录 B 站。服务器地址在设置页面统一配置。
-
-### B 站历史
-
-1. **登录账号**
- - 点击侧边栏的设置,然后配置你的服务器地址
- - 然后点击侧边栏中的"未登录"状态
- - 使用 B 站手机 APP 扫描二维码进行登录
- - 登录成功后会显示你的用户名
-
-2. **获取历史记录**
- - 登录成功后,点击导航栏中的"实时更新"按钮
- - 首次使用时会自动获取你的全部历史记录,这可能需要一些时间
- - 获取完成后数据会自动导入到本地数据库
- - 页面会自动刷新并显示你的观看历史
-
-3. **后续使用**
- - 默认的计划任务会在每天 0 点自动获取历史记录
- - 可去设置里配置邮箱进行通知,不配置不影响自动获取,只是无法收到通知
- - 每次打开页面时,建议点击"实时更新"以获取最新记录
- - 实时更新只会获取新增的记录,速度很快
-
-## 页面介绍
-
-**1. 年度总结页面**
-
-
-
-
-
-
-
-**2. 主页** 支持列表/网格切换与日期、分区筛选,一键实时更新,支持隐私模式。
-
-
-**3. 评论** 登录后查看我的评论,支持关键词与类型筛选,并可跳转原文。
-
-
-**4. 我的收藏** 支持查看我创建/收藏及本地收藏夹,可同步到本地并下载收藏内容。
-
-
-**5. 媒体管理** 集中管理已下载视频与图片,查看/编辑备注与评论,并可批量补全视频详情。
-
-
-**6. 计划任务** 统一管理定时与链式任务,支持新建/编辑/执行/启用或禁用,并查看历史与成功率。
-
-
-**7. 设置** 配置服务器、隐私与布局、数据导出,也可以启用/关闭后端 MCP 只读服务并复制 AI 连接提示词。
-
-
-**8. 视频下载功能** 输入 BV/链接或 UP UID 下载单个/合集/投稿,过程实时反馈。
-
-
-
-
-
-**9. 动态下载** 输入用户MID下载B站动态内容,实时显示下载进度
-
-
-
-## 使用 Tauri 构建桌面应用
-
-### GitHub Actions 自动构建(多平台包体)
-
-推送 tag(例如 `v1.0.0`)后,会自动在 GitHub Releases 里生成 Windows/macOS/Linux 的安装包与产物。
-
-**环境准备**
-
-1. 安装 Rust 开发环境
- - 按照 [Rust 官方指南](https://www.rust-lang.org/tools/install) 安装 Rust
- - Windows 用户还需安装 [Visual Studio C++ 构建工具](https://visualstudio.microsoft.com/visual-cpp-build-tools/)
-
-2. 安装 Node.js 依赖
- ```bash
- npm install
- ```
-
-**开发与构建**
-
-1. 开发模式
- ```bash
- npm run tauri:dev
- ```
- 这将启动一个开发服务器,并自动打开应用窗口,支持热重载。
-
-2. 构建可执行文件
- ```bash
- npm run tauri:build:exe
- ```
- 构建完成后,将在 `frontend/` 目录生成 `HistoryHub.exe` 可执行文件。
-
-3. 清理构建文件
- ```bash
- npm run tauri:clean
- ```
- 清理 `src-tauri/target` 目录中的构建产物,释放磁盘空间。
+前端默认连接 `http://localhost:8899`,可在“设置”中修改后端地址。
-## 贡献指南
+## B站历史
-欢迎提交 Issue 和 Pull Request 来帮助改进这个项目。
+在“设置”中扫码登录 B站,也可在后端 `config/config.yaml` 中配置 `SESSDATA`。点击“同步历史”获取观看记录;首次同步回填历史,之后续取新记录。已有本地历史无需当前登录即可查看和搜索,点击记录标题打开原链接。
-## 致谢
+## 网页历史
-- [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) - 没有它就没有这个项目
-- [Yutto](https://yutto.nyakku.moe/) - 可爱的 B 站视频下载工具
-- [ArtPlayer](https://github.com/zhw2590582/ArtPlayer) - 强大且灵活的 HTML5 视频播放器
-- [aicu.cc](https://www.aicu.cc/) - 第三方 B 站用户评论 API
-- 所有贡献者,特别感谢:
- - [@eli-yip](https://github.com/eli-yip) 对 Docker 部署的贡献
- - [@QYG2297248353](https://github.com/QYG2297248353) 对 1Panel 部署的贡献
+在后端配置 `HISTORYHUB_SYNC_TOKEN`,或在 `config/config.yaml` 中设置 `browser_history.sync_token`。将 Chrome 扩展连接到同一后端并使用相同密钥,在“网页历史”输入密钥并保存连接。可按标题或网址搜索,点击标题打开原链接。
-## Star History
+网页历史无需 B站登录。连接密钥仅保存在当前浏览器,按后端地址隔离,仅随网页历史请求发送。浏览器扩展位于仓库的 [extension](../extension/) 目录。
-[](https://star-history.com/#LifeArchiveProject/HistoryHub&Date)
+设置中可切换深色模式和隐私模式。
diff --git a/frontend/bun.lock b/frontend/bun.lock
deleted file mode 100644
index 386a272..0000000
--- a/frontend/bun.lock
+++ /dev/null
@@ -1,817 +0,0 @@
-{
- "lockfileVersion": 1,
- "workspaces": {
- "": {
- "name": "historyhub-frontend",
- "dependencies": {
- "@headlessui/vue": "^1.7.23",
- "@heroicons/vue": "^2.1.5",
- "@tailwindcss/forms": "^0.5.9",
- "@vant/touch-emulator": "^1.4.0",
- "@vueuse/components": "^12.3.0",
- "@vueuse/core": "^12.3.0",
- "@vueuse/motion": "^2.2.6",
- "animate.css": "^4.1.1",
- "aos": "^2.3.4",
- "artplayer": "^5.2.2",
- "artplayer-plugin-danmuku": "^5.1.5",
- "axios": "^1.7.7",
- "crypto-js": "^4.2.0",
- "echarts": "^5.6.0",
- "echarts-wordcloud": "^2.1.0",
- "gsap": "^3.12.5",
- "jsencrypt": "^3.3.2",
- "lottie-web": "^5.12.2",
- "typeit": "^8.8.7",
- "vant": "^4.9.15",
- "vue": "^3.5.11",
- "vue-countup-v3": "^1.4.2",
- "vue-echarts": "^7.0.3",
- "vue-router": "^4.4.5",
- "vue3-lottie": "^3.3.1",
- },
- "devDependencies": {
- "@tauri-apps/api": "^2.4.0",
- "@tauri-apps/cli": "^2.4.0",
- "@types/node": "^20.17.6",
- "@vitejs/plugin-vue": "^5.1.4",
- "@vue/runtime-core": "^3.5.13",
- "autoprefixer": "^10.4.20",
- "cross-env": "^7.0.3",
- "postcss": "^8.4.47",
- "prettier": "^3.3.3",
- "prettier-plugin-tailwindcss": "^0.6.8",
- "tailwindcss": "^3.4.13",
- "vite": "^5.4.8",
- "vite-plugin-vue-inspector": "^5.3.1",
- },
- },
- },
- "packages": {
- "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
-
- "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
-
- "@babel/code-frame": ["@babel/code-frame@7.26.2", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ=="],
-
- "@babel/compat-data": ["@babel/compat-data@7.26.8", "", {}, "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ=="],
-
- "@babel/core": ["@babel/core@7.26.10", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.10", "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.10", "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ=="],
-
- "@babel/generator": ["@babel/generator@7.27.0", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw=="],
-
- "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g=="],
-
- "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.0", "", { "dependencies": { "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA=="],
-
- "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.27.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/helper-replace-supers": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/traverse": "^7.27.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg=="],
-
- "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ=="],
-
- "@babel/helper-module-imports": ["@babel/helper-module-imports@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw=="],
-
- "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.26.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw=="],
-
- "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.25.9", "", { "dependencies": { "@babel/types": "^7.25.9" } }, "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ=="],
-
- "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.26.5", "", {}, "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg=="],
-
- "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.26.5", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", "@babel/traverse": "^7.26.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg=="],
-
- "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.25.9", "", { "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA=="],
-
- "@babel/helper-string-parser": ["@babel/helper-string-parser@7.25.9", "", {}, "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA=="],
-
- "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="],
-
- "@babel/helper-validator-option": ["@babel/helper-validator-option@7.25.9", "", {}, "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw=="],
-
- "@babel/helpers": ["@babel/helpers@7.27.0", "", { "dependencies": { "@babel/template": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg=="],
-
- "@babel/parser": ["@babel/parser@7.27.0", "", { "dependencies": { "@babel/types": "^7.27.0" }, "bin": "./bin/babel-parser.js" }, "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg=="],
-
- "@babel/plugin-proposal-decorators": ["@babel/plugin-proposal-decorators@7.25.9", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.25.9", "@babel/helper-plugin-utils": "^7.25.9", "@babel/plugin-syntax-decorators": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g=="],
-
- "@babel/plugin-syntax-decorators": ["@babel/plugin-syntax-decorators@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg=="],
-
- "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.26.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A=="],
-
- "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="],
-
- "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA=="],
-
- "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.25.9", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ=="],
-
- "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.27.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.27.0", "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg=="],
-
- "@babel/template": ["@babel/template@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.27.0", "@babel/types": "^7.27.0" } }, "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA=="],
-
- "@babel/traverse": ["@babel/traverse@7.27.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.27.0", "@babel/parser": "^7.27.0", "@babel/template": "^7.27.0", "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA=="],
-
- "@babel/types": ["@babel/types@7.27.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg=="],
-
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="],
-
- "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="],
-
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="],
-
- "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="],
-
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="],
-
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="],
-
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="],
-
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="],
-
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="],
-
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="],
-
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="],
-
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="],
-
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="],
-
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="],
-
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="],
-
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="],
-
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="],
-
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="],
-
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="],
-
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="],
-
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="],
-
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="],
-
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="],
-
- "@headlessui/vue": ["@headlessui/vue@1.7.23", "", { "dependencies": { "@tanstack/vue-virtual": "^3.0.0-beta.60" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg=="],
-
- "@heroicons/vue": ["@heroicons/vue@2.2.0", "", { "peerDependencies": { "vue": ">= 3" } }, "sha512-G3dbSxoeEKqbi/DFalhRxJU4mTXJn7GwZ7ae8NuEQzd1bqdd0jAbdaBZlHPcvPD2xI1iGzNVB4k20Un2AguYPw=="],
-
- "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
-
- "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="],
-
- "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
-
- "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="],
-
- "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="],
-
- "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="],
-
- "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
-
- "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
-
- "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
-
- "@nuxt/kit": ["@nuxt/kit@3.16.2", "", { "dependencies": { "c12": "^3.0.2", "consola": "^3.4.2", "defu": "^6.1.4", "destr": "^2.0.3", "errx": "^0.1.0", "exsolve": "^1.0.4", "globby": "^14.1.0", "ignore": "^7.0.3", "jiti": "^2.4.2", "klona": "^2.0.6", "knitwork": "^1.2.0", "mlly": "^1.7.4", "ohash": "^2.0.11", "pathe": "^2.0.3", "pkg-types": "^2.1.0", "scule": "^1.3.0", "semver": "^7.7.1", "std-env": "^3.8.1", "ufo": "^1.5.4", "unctx": "^2.4.1", "unimport": "^4.1.3", "untyped": "^2.0.0" } }, "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw=="],
-
- "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
-
- "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.39.0", "", { "os": "android", "cpu": "arm" }, "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA=="],
-
- "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.39.0", "", { "os": "android", "cpu": "arm64" }, "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ=="],
-
- "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.39.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q=="],
-
- "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.39.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ=="],
-
- "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.39.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ=="],
-
- "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.39.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q=="],
-
- "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.39.0", "", { "os": "linux", "cpu": "arm" }, "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g=="],
-
- "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.39.0", "", { "os": "linux", "cpu": "arm" }, "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw=="],
-
- "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.39.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ=="],
-
- "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.39.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA=="],
-
- "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.39.0", "", { "os": "linux", "cpu": "none" }, "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw=="],
-
- "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.39.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ=="],
-
- "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.39.0", "", { "os": "linux", "cpu": "none" }, "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ=="],
-
- "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.39.0", "", { "os": "linux", "cpu": "none" }, "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA=="],
-
- "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.39.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA=="],
-
- "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.39.0", "", { "os": "linux", "cpu": "x64" }, "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA=="],
-
- "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.39.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg=="],
-
- "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.39.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ=="],
-
- "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.39.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ=="],
-
- "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.39.0", "", { "os": "win32", "cpu": "x64" }, "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug=="],
-
- "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="],
-
- "@tailwindcss/forms": ["@tailwindcss/forms@0.5.10", "", { "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw=="],
-
- "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.6", "", {}, "sha512-cnQUeWnhNP8tJ4WsGcYiX24Gjkc9ALstLbHcBj1t3E7EimN6n6kHH+DPV4PpDnuw00NApQp+ViojMj1GRdwYQg=="],
-
- "@tanstack/vue-virtual": ["@tanstack/vue-virtual@3.13.6", "", { "dependencies": { "@tanstack/virtual-core": "3.13.6" }, "peerDependencies": { "vue": "^2.7.0 || ^3.0.0" } }, "sha512-GYdZ3SJBQPzgxhuCE2fvpiH46qzHiVx5XzBSdtESgiqh4poj8UgckjGWYEhxaBbcVt1oLzh1m3Ql4TyH32TOzQ=="],
-
- "@tauri-apps/api": ["@tauri-apps/api@2.4.1", "", {}, "sha512-5sYwZCSJb6PBGbBL4kt7CnE5HHbBqwH+ovmOW6ZVju3nX4E3JX6tt2kRklFEH7xMOIwR0btRkZktuLhKvyEQYg=="],
-
- "@tauri-apps/cli": ["@tauri-apps/cli@2.4.1", "", { "optionalDependencies": { "@tauri-apps/cli-darwin-arm64": "2.4.1", "@tauri-apps/cli-darwin-x64": "2.4.1", "@tauri-apps/cli-linux-arm-gnueabihf": "2.4.1", "@tauri-apps/cli-linux-arm64-gnu": "2.4.1", "@tauri-apps/cli-linux-arm64-musl": "2.4.1", "@tauri-apps/cli-linux-riscv64-gnu": "2.4.1", "@tauri-apps/cli-linux-x64-gnu": "2.4.1", "@tauri-apps/cli-linux-x64-musl": "2.4.1", "@tauri-apps/cli-win32-arm64-msvc": "2.4.1", "@tauri-apps/cli-win32-ia32-msvc": "2.4.1", "@tauri-apps/cli-win32-x64-msvc": "2.4.1" }, "bin": { "tauri": "tauri.js" } }, "sha512-9Ta81jx9+57FhtU/mPIckDcOBtPTUdKM75t4+aA0X84b8Sclb0jy1xA8NplmcRzp2fsfIHNngU2NiRxsW5+yOQ=="],
-
- "@tauri-apps/cli-darwin-arm64": ["@tauri-apps/cli-darwin-arm64@2.4.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QME7s8XQwy3LWClTVlIlwXVSLKkeJ/z88pr917Mtn9spYOjnBfsgHAgGdmpWD3NfJxjg7CtLbhH49DxoFL+hLg=="],
-
- "@tauri-apps/cli-darwin-x64": ["@tauri-apps/cli-darwin-x64@2.4.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-/r89IcW6Ya1sEsFUEH7wLNruDTj7WmDWKGpPy7gATFtQr5JEY4heernqE82isjTUimnHZD8SCr0jA3NceI4ybw=="],
-
- "@tauri-apps/cli-linux-arm-gnueabihf": ["@tauri-apps/cli-linux-arm-gnueabihf@2.4.1", "", { "os": "linux", "cpu": "arm" }, "sha512-9tDijkRB+CchAGjXxYdY9l/XzFpLp1yihUtGXJz9eh+3qIoRI043n3e+6xmU8ZURr7XPnu+R4sCmXs6HD+NCEQ=="],
-
- "@tauri-apps/cli-linux-arm64-gnu": ["@tauri-apps/cli-linux-arm64-gnu@2.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-pnFGDEXBAzS4iDYAVxTRhAzNu3K2XPGflYyBc0czfHDBXopqRgMyj5Q9Wj7HAwv6cM8BqzXINxnb2ZJFGmbSgA=="],
-
- "@tauri-apps/cli-linux-arm64-musl": ["@tauri-apps/cli-linux-arm64-musl@2.4.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Hp0zXgeZNKmT+eoJSCxSBUm2QndNuRxR55tmIeNm3vbyUMJN/49uW7nurZ5fBPsacN4Pzwlx1dIMK+Gnr9A69w=="],
-
- "@tauri-apps/cli-linux-riscv64-gnu": ["@tauri-apps/cli-linux-riscv64-gnu@2.4.1", "", { "os": "linux", "cpu": "none" }, "sha512-3T3bo2E4fdYRvzcXheWUeQOVB+LunEEi92iPRgOyuSVexVE4cmHYl+MPJF+EUV28Et0hIVTsHibmDO0/04lAFg=="],
-
- "@tauri-apps/cli-linux-x64-gnu": ["@tauri-apps/cli-linux-x64-gnu@2.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-kLN0FdNONO+2i+OpU9+mm6oTGufRC00e197TtwjpC0N6K2K8130w7Q3FeODIM2CMyg0ov3tH+QWqKW7GNhHFzg=="],
-
- "@tauri-apps/cli-linux-x64-musl": ["@tauri-apps/cli-linux-x64-musl@2.4.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8exvA5Ub9eg66a6hsMQKJIkf63QAf9OdiuFKOsEnKZkNN2x0NLgfvEcqdw88VY0UMs9dBoZ1AGbWMeYnLrLwQ=="],
-
- "@tauri-apps/cli-win32-arm64-msvc": ["@tauri-apps/cli-win32-arm64-msvc@2.4.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4JFrslsMCJQG1c573T9uqQSAbF3j/tMKkMWzsIssv8jvPiP++OG61A2/F+y9te9/Q/O95cKhDK63kaiO5xQaeg=="],
-
- "@tauri-apps/cli-win32-ia32-msvc": ["@tauri-apps/cli-win32-ia32-msvc@2.4.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-9eXfFORehYSCRwxg2KodfmX/mhr50CI7wyBYGbPLePCjr5z0jK/9IyW6r0tC+ZVjwpX48dkk7hKiUgI25jHjzA=="],
-
- "@tauri-apps/cli-win32-x64-msvc": ["@tauri-apps/cli-win32-x64-msvc@2.4.1", "", { "os": "win32", "cpu": "x64" }, "sha512-60a4Ov7Jrwqz2hzDltlS7301dhSAmM9dxo+IRBD3xz7yobKrgaHXYpWvnRomYItHcDd51VaKc9292H8/eE/gsw=="],
-
- "@types/estree": ["@types/estree@1.0.7", "", {}, "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ=="],
-
- "@types/node": ["@types/node@20.17.30", "", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-7zf4YyHA+jvBNfVrk2Gtvs6x7E8V+YDW05bNfG2XkWDJfYRXrTiP/DsB2zSYTaHX0bGIujTBQdMVAhb+j7mwpg=="],
-
- "@types/web-animations-js": ["@types/web-animations-js@2.2.16", "", {}, "sha512-ATELeWMFwj8eQiH0KmvsCl1V2lu/qx/CjOBmv4ADSZS5u8r4reMyjCXtxG7khqyiwH3IOMNdrON/Ugn94OUcRA=="],
-
- "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="],
-
- "@vant/popperjs": ["@vant/popperjs@1.3.0", "", {}, "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw=="],
-
- "@vant/touch-emulator": ["@vant/touch-emulator@1.4.0", "", {}, "sha512-Zt+zISV0+wpOew2S1siOJ3G22y+hapHAKmXM+FhpvWzsRc4qahaYXatCAITuuXt0EcDp7WvEeTO4F7p9AtX/pw=="],
-
- "@vant/use": ["@vant/use@1.6.0", "", { "peerDependencies": { "vue": "^3.0.0" } }, "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA=="],
-
- "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.3", "", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg=="],
-
- "@vue/babel-helper-vue-transform-on": ["@vue/babel-helper-vue-transform-on@1.4.0", "", {}, "sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw=="],
-
- "@vue/babel-plugin-jsx": ["@vue/babel-plugin-jsx@1.4.0", "", { "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "@babel/plugin-syntax-jsx": "^7.25.9", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.9", "@babel/types": "^7.26.9", "@vue/babel-helper-vue-transform-on": "1.4.0", "@vue/babel-plugin-resolve-type": "1.4.0", "@vue/shared": "^3.5.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" }, "optionalPeers": ["@babel/core"] }, "sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA=="],
-
- "@vue/babel-plugin-resolve-type": ["@vue/babel-plugin-resolve-type@1.4.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/helper-module-imports": "^7.25.9", "@babel/helper-plugin-utils": "^7.26.5", "@babel/parser": "^7.26.9", "@vue/compiler-sfc": "^3.5.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ=="],
-
- "@vue/compiler-core": ["@vue/compiler-core@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q=="],
-
- "@vue/compiler-dom": ["@vue/compiler-dom@3.5.13", "", { "dependencies": { "@vue/compiler-core": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA=="],
-
- "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.13", "", { "dependencies": { "@babel/parser": "^7.25.3", "@vue/compiler-core": "3.5.13", "@vue/compiler-dom": "3.5.13", "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", "postcss": "^8.4.48", "source-map-js": "^1.2.0" } }, "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ=="],
-
- "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA=="],
-
- "@vue/devtools-api": ["@vue/devtools-api@6.6.4", "", {}, "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="],
-
- "@vue/reactivity": ["@vue/reactivity@3.5.13", "", { "dependencies": { "@vue/shared": "3.5.13" } }, "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg=="],
-
- "@vue/runtime-core": ["@vue/runtime-core@3.5.13", "", { "dependencies": { "@vue/reactivity": "3.5.13", "@vue/shared": "3.5.13" } }, "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw=="],
-
- "@vue/runtime-dom": ["@vue/runtime-dom@3.5.13", "", { "dependencies": { "@vue/reactivity": "3.5.13", "@vue/runtime-core": "3.5.13", "@vue/shared": "3.5.13", "csstype": "^3.1.3" } }, "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog=="],
-
- "@vue/server-renderer": ["@vue/server-renderer@3.5.13", "", { "dependencies": { "@vue/compiler-ssr": "3.5.13", "@vue/shared": "3.5.13" }, "peerDependencies": { "vue": "3.5.13" } }, "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA=="],
-
- "@vue/shared": ["@vue/shared@3.5.13", "", {}, "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="],
-
- "@vueuse/components": ["@vueuse/components@12.8.2", "", { "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-Nj27u1KsDWzoTthlChzVndJ9g0sW5APCXO3EJkSxlG11nN/ANTUlPPeoJOFvtbdDRnvsMJalboJyE0rRyg7yNg=="],
-
- "@vueuse/core": ["@vueuse/core@12.8.2", "", { "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "12.8.2", "@vueuse/shared": "12.8.2", "vue": "^3.5.13" } }, "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ=="],
-
- "@vueuse/metadata": ["@vueuse/metadata@12.8.2", "", {}, "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A=="],
-
- "@vueuse/motion": ["@vueuse/motion@2.2.6", "", { "dependencies": { "@vueuse/core": "^10.10.0", "@vueuse/shared": "^10.10.0", "csstype": "^3.1.3", "framesync": "^6.1.2", "popmotion": "^11.0.5", "style-value-types": "^5.1.2" }, "optionalDependencies": { "@nuxt/kit": "^3.13.0" }, "peerDependencies": { "vue": ">=3.0.0" } }, "sha512-gKFktPtrdypSv44SaW1oBJKLBiP6kE5NcoQ6RsAU3InemESdiAutgQncfPe/rhLSLCtL4jTAhMmFfxoR6gm5LQ=="],
-
- "@vueuse/shared": ["@vueuse/shared@12.8.2", "", { "dependencies": { "vue": "^3.5.13" } }, "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w=="],
-
- "acorn": ["acorn@8.14.1", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="],
-
- "animate.css": ["animate.css@4.1.1", "", {}, "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ=="],
-
- "ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],
-
- "ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
-
- "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
-
- "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
-
- "aos": ["aos@2.3.4", "", { "dependencies": { "classlist-polyfill": "^1.0.3", "lodash.debounce": "^4.0.6", "lodash.throttle": "^4.0.1" } }, "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw=="],
-
- "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
-
- "artplayer": ["artplayer@5.2.2", "", { "dependencies": { "option-validator": "^2.0.6" } }, "sha512-JsPRA9e+7KyWTh5KBeKLTcCigzGhpZulRFXvOeiFMbxnpPz9kZ/1STp1LZONqQXHkxX9wHTO6JhGOvzrduH2Lw=="],
-
- "artplayer-plugin-danmuku": ["artplayer-plugin-danmuku@5.1.5", "", {}, "sha512-iFjdXVbkw5FbkB98SOwMPQEFJp7k6Io4nHfehpSdCc7Eo1gkmjNShOT6dAtAH1kLMHjh38vRnf/oYwCvTKkVOw=="],
-
- "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
-
- "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="],
-
- "axios": ["axios@1.8.4", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw=="],
-
- "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
-
- "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
-
- "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
-
- "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
-
- "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="],
-
- "c12": ["c12@3.0.3", "", { "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^16.4.7", "exsolve": "^1.0.4", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", "pkg-types": "^2.1.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "^0.3.5" }, "optionalPeers": ["magicast"] }, "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w=="],
-
- "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
-
- "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
-
- "caniuse-lite": ["caniuse-lite@1.0.30001712", "", {}, "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig=="],
-
- "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
-
- "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="],
-
- "classlist-polyfill": ["classlist-polyfill@1.2.0", "", {}, "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ=="],
-
- "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
-
- "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
-
- "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
-
- "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
-
- "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="],
-
- "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
-
- "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
-
- "countup.js": ["countup.js@2.8.0", "", {}, "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ=="],
-
- "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="],
-
- "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
-
- "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="],
-
- "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
-
- "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="],
-
- "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="],
-
- "defu": ["defu@6.1.4", "", {}, "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="],
-
- "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
-
- "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="],
-
- "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
-
- "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
-
- "dotenv": ["dotenv@16.4.7", "", {}, "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ=="],
-
- "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
-
- "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
-
- "echarts": ["echarts@5.6.0", "", { "dependencies": { "tslib": "2.3.0", "zrender": "5.6.1" } }, "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA=="],
-
- "echarts-wordcloud": ["echarts-wordcloud@2.1.0", "", { "peerDependencies": { "echarts": "^5.0.1" } }, "sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ=="],
-
- "electron-to-chromium": ["electron-to-chromium@1.5.132", "", {}, "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg=="],
-
- "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
-
- "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
-
- "errx": ["errx@0.1.0", "", {}, "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q=="],
-
- "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
-
- "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
-
- "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
-
- "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
-
- "esbuild": ["esbuild@0.21.5", "", { "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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="],
-
- "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
-
- "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
-
- "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
-
- "exsolve": ["exsolve@1.0.4", "", {}, "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw=="],
-
- "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
-
- "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
-
- "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="],
-
- "fdir": ["fdir@6.4.3", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw=="],
-
- "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
-
- "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
-
- "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
-
- "form-data": ["form-data@4.0.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" } }, "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w=="],
-
- "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
-
- "framesync": ["framesync@6.1.2", "", { "dependencies": { "tslib": "2.4.0" } }, "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g=="],
-
- "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
-
- "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
-
- "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
-
- "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
-
- "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
-
- "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="],
-
- "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
-
- "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
-
- "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
-
- "globby": ["globby@14.1.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.3", "ignore": "^7.0.3", "path-type": "^6.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.3.0" } }, "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA=="],
-
- "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
-
- "gsap": ["gsap@3.12.7", "", {}, "sha512-V4GsyVamhmKefvcAKaoy0h6si0xX7ogwBoBSs2CTJwt7luW0oZzC0LhdkyuKV8PJAXr7Yaj8pMjCKD4GJ+eEMg=="],
-
- "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
-
- "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
-
- "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
-
- "hey-listen": ["hey-listen@1.0.8", "", {}, "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="],
-
- "ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="],
-
- "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
-
- "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
-
- "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
-
- "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
-
- "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
-
- "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
-
- "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
-
- "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
-
- "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
-
- "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
-
- "jsencrypt": ["jsencrypt@3.3.2", "", {}, "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A=="],
-
- "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
-
- "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
-
- "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
-
- "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="],
-
- "knitwork": ["knitwork@1.2.0", "", {}, "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg=="],
-
- "kolorist": ["kolorist@1.8.0", "", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="],
-
- "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
-
- "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
-
- "local-pkg": ["local-pkg@1.1.1", "", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.0.1", "quansync": "^0.2.8" } }, "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg=="],
-
- "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="],
-
- "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="],
-
- "lottie-web": ["lottie-web@5.12.2", "", {}, "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg=="],
-
- "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
-
- "magic-string": ["magic-string@0.30.17", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA=="],
-
- "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
-
- "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
-
- "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
-
- "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
-
- "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
-
- "mini-svg-data-uri": ["mini-svg-data-uri@1.4.4", "", { "bin": { "mini-svg-data-uri": "cli.js" } }, "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg=="],
-
- "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
-
- "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
-
- "mlly": ["mlly@1.7.4", "", { "dependencies": { "acorn": "^8.14.0", "pathe": "^2.0.1", "pkg-types": "^1.3.0", "ufo": "^1.5.4" } }, "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw=="],
-
- "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
-
- "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
-
- "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
-
- "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="],
-
- "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
-
- "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
-
- "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="],
-
- "nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="],
-
- "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
-
- "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
-
- "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
-
- "option-validator": ["option-validator@2.0.6", "", { "dependencies": { "kind-of": "^6.0.3" } }, "sha512-tmZDan2LRIRQyhUGvkff68/O0R8UmF+Btmiiz0SmSw2ng3CfPZB9wJlIjHpe/MKUZqyIZkVIXCrwr1tIN+0Dzg=="],
-
- "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
-
- "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
-
- "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
-
- "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
-
- "path-type": ["path-type@6.0.0", "", {}, "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ=="],
-
- "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
-
- "perfect-debounce": ["perfect-debounce@1.0.0", "", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="],
-
- "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
-
- "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
-
- "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
-
- "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
-
- "pkg-types": ["pkg-types@2.1.0", "", { "dependencies": { "confbox": "^0.2.1", "exsolve": "^1.0.1", "pathe": "^2.0.3" } }, "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A=="],
-
- "popmotion": ["popmotion@11.0.5", "", { "dependencies": { "framesync": "6.1.2", "hey-listen": "^1.0.8", "style-value-types": "5.1.2", "tslib": "2.4.0" } }, "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA=="],
-
- "postcss": ["postcss@8.5.3", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A=="],
-
- "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
-
- "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="],
-
- "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="],
-
- "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
-
- "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
-
- "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
-
- "prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="],
-
- "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.11", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA=="],
-
- "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
-
- "quansync": ["quansync@0.2.10", "", {}, "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A=="],
-
- "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
-
- "rc9": ["rc9@2.1.2", "", { "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" } }, "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg=="],
-
- "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
-
- "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
-
- "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
-
- "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
-
- "rollup": ["rollup@4.39.0", "", { "dependencies": { "@types/estree": "1.0.7" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.39.0", "@rollup/rollup-android-arm64": "4.39.0", "@rollup/rollup-darwin-arm64": "4.39.0", "@rollup/rollup-darwin-x64": "4.39.0", "@rollup/rollup-freebsd-arm64": "4.39.0", "@rollup/rollup-freebsd-x64": "4.39.0", "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", "@rollup/rollup-linux-arm-musleabihf": "4.39.0", "@rollup/rollup-linux-arm64-gnu": "4.39.0", "@rollup/rollup-linux-arm64-musl": "4.39.0", "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", "@rollup/rollup-linux-riscv64-gnu": "4.39.0", "@rollup/rollup-linux-riscv64-musl": "4.39.0", "@rollup/rollup-linux-s390x-gnu": "4.39.0", "@rollup/rollup-linux-x64-gnu": "4.39.0", "@rollup/rollup-linux-x64-musl": "4.39.0", "@rollup/rollup-win32-arm64-msvc": "4.39.0", "@rollup/rollup-win32-ia32-msvc": "4.39.0", "@rollup/rollup-win32-x64-msvc": "4.39.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g=="],
-
- "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
-
- "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="],
-
- "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
-
- "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
-
- "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
-
- "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
-
- "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="],
-
- "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
-
- "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="],
-
- "string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
-
- "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
-
- "strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
-
- "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
- "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="],
-
- "style-value-types": ["style-value-types@5.1.2", "", { "dependencies": { "hey-listen": "^1.0.8", "tslib": "2.4.0" } }, "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q=="],
-
- "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="],
-
- "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
-
- "tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="],
-
- "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
-
- "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
-
- "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
-
- "tinyglobby": ["tinyglobby@0.2.12", "", { "dependencies": { "fdir": "^6.4.3", "picomatch": "^4.0.2" } }, "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww=="],
-
- "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
-
- "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
-
- "tslib": ["tslib@2.3.0", "", {}, "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="],
-
- "typeit": ["typeit@8.8.7", "", { "dependencies": { "@types/web-animations-js": "^2.2.16" } }, "sha512-sSVpy+cjeFP6Z+fZqiHzUSShg5yYFeJEt/Qut/bX945+Axyq+Yq+GPOuuk+sofoccSv8nNX/ibOOHkbki2mEpg=="],
-
- "ufo": ["ufo@1.5.4", "", {}, "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="],
-
- "unctx": ["unctx@2.4.1", "", { "dependencies": { "acorn": "^8.14.0", "estree-walker": "^3.0.3", "magic-string": "^0.30.17", "unplugin": "^2.1.0" } }, "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg=="],
-
- "undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="],
-
- "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
-
- "unimport": ["unimport@4.1.3", "", { "dependencies": { "acorn": "^8.14.1", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "picomatch": "^4.0.2", "pkg-types": "^2.1.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", "tinyglobby": "^0.2.12", "unplugin": "^2.2.2", "unplugin-utils": "^0.2.4" } }, "sha512-H+IVJ7rAkE3b+oC8rSJ2FsPaVsweeMC8eKZc+C6Mz7+hxDF45AnrY/tVCNRBvzMwWNcJEV67WdAVcal27iMjOw=="],
-
- "unplugin": ["unplugin@2.2.2", "", { "dependencies": { "acorn": "^8.14.1", "webpack-virtual-modules": "^0.6.2" } }, "sha512-Qp+iiD+qCRnUek+nDoYvtWX7tfnYyXsrOnJ452FRTgOyKmTM7TUJ3l+PLPJOOWPTUyKISKp4isC5JJPSXUjGgw=="],
-
- "unplugin-utils": ["unplugin-utils@0.2.4", "", { "dependencies": { "pathe": "^2.0.2", "picomatch": "^4.0.2" } }, "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA=="],
-
- "untyped": ["untyped@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "defu": "^6.1.4", "jiti": "^2.4.2", "knitwork": "^1.2.0", "scule": "^1.3.0" }, "bin": { "untyped": "dist/cli.mjs" } }, "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g=="],
-
- "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="],
-
- "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
-
- "vant": ["vant@4.9.18", "", { "dependencies": { "@vant/popperjs": "^1.3.0", "@vant/use": "^1.6.0", "@vue/shared": "^3.5.13" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-1bmWv/G0xz45btPqSasgv4TUdTqCneyFfnrQJ3xgerGvfTC5aP/rpO4wJb5FItCZjaSw5+9FNBj2Tz6n9TLXYA=="],
-
- "vite": ["vite@5.4.17", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "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" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": { "vite": "bin/vite.js" } }, "sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg=="],
-
- "vite-plugin-vue-inspector": ["vite-plugin-vue-inspector@5.3.1", "", { "dependencies": { "@babel/core": "^7.23.0", "@babel/plugin-proposal-decorators": "^7.23.0", "@babel/plugin-syntax-import-attributes": "^7.22.5", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-transform-typescript": "^7.22.15", "@vue/babel-plugin-jsx": "^1.1.5", "@vue/compiler-dom": "^3.3.4", "kolorist": "^1.8.0", "magic-string": "^0.30.4" }, "peerDependencies": { "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" } }, "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A=="],
-
- "vue": ["vue@3.5.13", "", { "dependencies": { "@vue/compiler-dom": "3.5.13", "@vue/compiler-sfc": "3.5.13", "@vue/runtime-dom": "3.5.13", "@vue/server-renderer": "3.5.13", "@vue/shared": "3.5.13" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ=="],
-
- "vue-countup-v3": ["vue-countup-v3@1.4.2", "", { "dependencies": { "countup.js": "^2.6.2" }, "peerDependencies": { "vue": "^3.0.0" } }, "sha512-nRC65jBcdgwybxqztgd/WaK8ZN5T9ECPyiCFGYFMewCsvqdRVo1CtpT7JREcPNF837Fgu/izTSFiuzrIGD6w0A=="],
-
- "vue-demi": ["vue-demi@0.13.11", "", { "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "optionalPeers": ["@vue/composition-api"], "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" } }, "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A=="],
-
- "vue-echarts": ["vue-echarts@7.0.3", "", { "dependencies": { "vue-demi": "^0.13.11" }, "peerDependencies": { "@vue/runtime-core": "^3.0.0", "echarts": "^5.5.1", "vue": "^2.7.0 || ^3.1.1" }, "optionalPeers": ["@vue/runtime-core"] }, "sha512-/jSxNwOsw5+dYAUcwSfkLwKPuzTQ0Cepz1LxCOpj2QcHrrmUa/Ql0eQqMmc1rTPQVrh2JQ29n2dhq75ZcHvRDw=="],
-
- "vue-router": ["vue-router@4.5.0", "", { "dependencies": { "@vue/devtools-api": "^6.6.4" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w=="],
-
- "vue3-lottie": ["vue3-lottie@3.3.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "klona": "^2.0.6", "lottie-web": "5.12.2" }, "peerDependencies": { "vue": "^3.2" } }, "sha512-60uQmx4eefi3FdPjAxWnblrgJJjnVTXUA6e4BAI3jGzgOSR76pyzL1rrWDiyPmMFo4mTw4wGTW6Gbkg3HR1mYw=="],
-
- "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="],
-
- "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
-
- "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
-
- "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
-
- "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
-
- "yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="],
-
- "zrender": ["zrender@5.6.1", "", { "dependencies": { "tslib": "2.3.0" } }, "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag=="],
-
- "@nuxt/kit/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
-
- "@nuxt/kit/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
-
- "@vueuse/motion/@vueuse/core": ["@vueuse/core@10.11.1", "", { "dependencies": { "@types/web-bluetooth": "^0.0.20", "@vueuse/metadata": "10.11.1", "@vueuse/shared": "10.11.1", "vue-demi": ">=0.14.8" } }, "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww=="],
-
- "@vueuse/motion/@vueuse/shared": ["@vueuse/shared@10.11.1", "", { "dependencies": { "vue-demi": ">=0.14.8" } }, "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA=="],
-
- "c12/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
-
- "c12/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
-
- "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
-
- "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
-
- "framesync/tslib": ["tslib@2.4.0", "", {}, "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="],
-
- "mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
-
- "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
-
- "popmotion/tslib": ["tslib@2.4.0", "", {}, "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="],
-
- "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
-
- "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
- "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
-
- "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="],
-
- "style-value-types/tslib": ["tslib@2.4.0", "", {}, "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="],
-
- "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
-
- "unctx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
-
- "unimport/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
-
- "unimport/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
-
- "unplugin-utils/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="],
-
- "untyped/jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="],
-
- "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
-
- "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
-
- "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
- "@vueuse/motion/@vueuse/core/@types/web-bluetooth": ["@types/web-bluetooth@0.0.20", "", {}, "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="],
-
- "@vueuse/motion/@vueuse/core/@vueuse/metadata": ["@vueuse/metadata@10.11.1", "", {}, "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw=="],
-
- "@vueuse/motion/@vueuse/core/vue-demi": ["vue-demi@0.14.10", "", { "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "optionalPeers": ["@vue/composition-api"], "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" } }, "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg=="],
-
- "@vueuse/motion/@vueuse/shared/vue-demi": ["vue-demi@0.14.10", "", { "peerDependencies": { "@vue/composition-api": "^1.0.0-rc.1", "vue": "^3.0.0-0 || ^2.6.0" }, "optionalPeers": ["@vue/composition-api"], "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" } }, "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg=="],
-
- "c12/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
-
- "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
-
- "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
-
- "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
-
- "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
- }
-}
diff --git a/frontend/index.html b/frontend/index.html
index 624e57d..45fb500 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -1,40 +1,11 @@
-
+
-
-
-
-
-
-
-
+
+
+
HistoryHub
-
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 86d2b87..f85328b 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -8,33 +8,11 @@
"name": "historyhub-frontend",
"version": "1.6.1",
"dependencies": {
- "@headlessui/vue": "^1.7.23",
- "@heroicons/vue": "^2.1.5",
"@tailwindcss/forms": "^0.5.9",
"@tauri-apps/plugin-shell": "~2.2.1",
- "@vant/touch-emulator": "^1.4.0",
- "@vueuse/components": "^12.3.0",
- "@vueuse/core": "^12.3.0",
- "@vueuse/motion": "^2.2.6",
- "animate.css": "^4.1.1",
- "aos": "^2.3.4",
- "artplayer": "^5.2.2",
- "artplayer-plugin-danmuku": "^5.1.5",
"axios": "^1.7.7",
- "crypto-js": "^4.2.0",
- "echarts": "^5.6.0",
- "echarts-wordcloud": "^2.1.0",
- "gsap": "^3.12.5",
- "html2canvas": "^1.4.1",
- "jsencrypt": "^3.3.2",
- "lottie-web": "^5.12.2",
- "typeit": "^8.8.7",
- "vant": "^4.9.15",
"vue": "^3.5.11",
- "vue-countup-v3": "^1.4.2",
- "vue-echarts": "^7.0.3",
- "vue-router": "^4.4.5",
- "vue3-lottie": "^3.3.1"
+ "vue-router": "^4.4.5"
},
"devDependencies": {
"@tauri-apps/api": "~2.4.0",
@@ -93,7 +71,6 @@
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
@@ -939,30 +916,6 @@
"node": ">=12"
}
},
- "node_modules/@headlessui/vue": {
- "version": "1.7.23",
- "resolved": "https://registry.npmjs.org/@headlessui/vue/-/vue-1.7.23.tgz",
- "integrity": "sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==",
- "license": "MIT",
- "dependencies": {
- "@tanstack/vue-virtual": "^3.0.0-beta.60"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "vue": "^3.2.0"
- }
- },
- "node_modules/@heroicons/vue": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.2.0.tgz",
- "integrity": "sha512-G3dbSxoeEKqbi/DFalhRxJU4mTXJn7GwZ7ae8NuEQzd1bqdd0jAbdaBZlHPcvPD2xI1iGzNVB4k20Un2AguYPw==",
- "license": "MIT",
- "peerDependencies": {
- "vue": ">= 3"
- }
- },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -977,7 +930,7 @@
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "devOptional": true,
+ "dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -1044,39 +997,6 @@
"node": ">= 8"
}
},
- "node_modules/@nuxt/kit": {
- "version": "3.20.2",
- "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.20.2.tgz",
- "integrity": "sha512-laqfmMcWWNV1FsVmm1+RQUoGY8NIJvCRl0z0K8ikqPukoEry0LXMqlQ+xaf8xJRvoH2/78OhZmsEEsUBTXipcw==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "c12": "^3.3.2",
- "consola": "^3.4.2",
- "defu": "^6.1.4",
- "destr": "^2.0.5",
- "errx": "^0.1.0",
- "exsolve": "^1.0.8",
- "ignore": "^7.0.5",
- "jiti": "^2.6.1",
- "klona": "^2.0.6",
- "knitwork": "^1.3.0",
- "mlly": "^1.8.0",
- "ohash": "^2.0.11",
- "pathe": "^2.0.3",
- "pkg-types": "^2.3.0",
- "rc9": "^2.1.2",
- "scule": "^1.3.0",
- "semver": "^7.7.3",
- "tinyglobby": "^0.2.15",
- "ufo": "^1.6.1",
- "unctx": "^2.4.1",
- "untyped": "^2.0.0"
- },
- "engines": {
- "node": ">=18.12.0"
- }
- },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.54.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz",
@@ -1397,32 +1317,6 @@
"tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1"
}
},
- "node_modules/@tanstack/virtual-core": {
- "version": "3.13.13",
- "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.13.tgz",
- "integrity": "sha512-uQFoSdKKf5S8k51W5t7b2qpfkyIbdHMzAn+AMQvHPxKUPeo1SsGaA4JRISQT87jm28b7z8OEqPcg1IOZagQHcA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- }
- },
- "node_modules/@tanstack/vue-virtual": {
- "version": "3.13.13",
- "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.13.tgz",
- "integrity": "sha512-Cf2xIEE8nWAfsX0N5nihkPYMeQRT+pHt4NEkuP8rNCn6lVnLDiV8rC8IeIxbKmQC0yPnj4SIBLwXYVf86xxKTQ==",
- "license": "MIT",
- "dependencies": {
- "@tanstack/virtual-core": "3.13.13"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/tannerlinsley"
- },
- "peerDependencies": {
- "vue": "^2.7.0 || ^3.0.0"
- }
- },
"node_modules/@tauri-apps/api": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.4.1.tgz",
@@ -1663,7 +1557,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
- "devOptional": true,
+ "dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
@@ -1672,44 +1566,10 @@
"integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
},
- "node_modules/@types/web-animations-js": {
- "version": "2.2.16",
- "resolved": "https://registry.npmjs.org/@types/web-animations-js/-/web-animations-js-2.2.16.tgz",
- "integrity": "sha512-ATELeWMFwj8eQiH0KmvsCl1V2lu/qx/CjOBmv4ADSZS5u8r4reMyjCXtxG7khqyiwH3IOMNdrON/Ugn94OUcRA==",
- "license": "MIT"
- },
- "node_modules/@types/web-bluetooth": {
- "version": "0.0.21",
- "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
- "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==",
- "license": "MIT"
- },
- "node_modules/@vant/popperjs": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@vant/popperjs/-/popperjs-1.3.0.tgz",
- "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==",
- "license": "MIT"
- },
- "node_modules/@vant/touch-emulator": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@vant/touch-emulator/-/touch-emulator-1.4.0.tgz",
- "integrity": "sha512-Zt+zISV0+wpOew2S1siOJ3G22y+hapHAKmXM+FhpvWzsRc4qahaYXatCAITuuXt0EcDp7WvEeTO4F7p9AtX/pw==",
- "license": "MIT"
- },
- "node_modules/@vant/use": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@vant/use/-/use-1.6.0.tgz",
- "integrity": "sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==",
- "license": "MIT",
- "peerDependencies": {
- "vue": "^3.0.0"
- }
- },
"node_modules/@vitejs/plugin-vue": {
"version": "5.2.4",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
@@ -1859,7 +1719,6 @@
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz",
"integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@vue/reactivity": "3.5.26",
"@vue/shared": "3.5.26"
@@ -1896,186 +1755,6 @@
"integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==",
"license": "MIT"
},
- "node_modules/@vueuse/components": {
- "version": "12.8.2",
- "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-12.8.2.tgz",
- "integrity": "sha512-Nj27u1KsDWzoTthlChzVndJ9g0sW5APCXO3EJkSxlG11nN/ANTUlPPeoJOFvtbdDRnvsMJalboJyE0rRyg7yNg==",
- "license": "MIT",
- "dependencies": {
- "@vueuse/core": "12.8.2",
- "@vueuse/shared": "12.8.2",
- "vue": "^3.5.13"
- }
- },
- "node_modules/@vueuse/core": {
- "version": "12.8.2",
- "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz",
- "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==",
- "license": "MIT",
- "dependencies": {
- "@types/web-bluetooth": "^0.0.21",
- "@vueuse/metadata": "12.8.2",
- "@vueuse/shared": "12.8.2",
- "vue": "^3.5.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/metadata": {
- "version": "12.8.2",
- "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz",
- "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/motion": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/@vueuse/motion/-/motion-2.2.6.tgz",
- "integrity": "sha512-gKFktPtrdypSv44SaW1oBJKLBiP6kE5NcoQ6RsAU3InemESdiAutgQncfPe/rhLSLCtL4jTAhMmFfxoR6gm5LQ==",
- "license": "MIT",
- "dependencies": {
- "@vueuse/core": "^10.10.0",
- "@vueuse/shared": "^10.10.0",
- "csstype": "^3.1.3",
- "framesync": "^6.1.2",
- "popmotion": "^11.0.5",
- "style-value-types": "^5.1.2"
- },
- "optionalDependencies": {
- "@nuxt/kit": "^3.13.0"
- },
- "peerDependencies": {
- "vue": ">=3.0.0"
- }
- },
- "node_modules/@vueuse/motion/node_modules/@types/web-bluetooth": {
- "version": "0.0.20",
- "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
- "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==",
- "license": "MIT"
- },
- "node_modules/@vueuse/motion/node_modules/@vueuse/core": {
- "version": "10.11.1",
- "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz",
- "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==",
- "license": "MIT",
- "dependencies": {
- "@types/web-bluetooth": "^0.0.20",
- "@vueuse/metadata": "10.11.1",
- "@vueuse/shared": "10.11.1",
- "vue-demi": ">=0.14.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/motion/node_modules/@vueuse/core/node_modules/vue-demi": {
- "version": "0.14.10",
- "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
- "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
- "hasInstallScript": true,
- "license": "MIT",
- "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/motion/node_modules/@vueuse/metadata": {
- "version": "10.11.1",
- "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz",
- "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==",
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/motion/node_modules/@vueuse/shared": {
- "version": "10.11.1",
- "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz",
- "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==",
- "license": "MIT",
- "dependencies": {
- "vue-demi": ">=0.14.8"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@vueuse/motion/node_modules/@vueuse/shared/node_modules/vue-demi": {
- "version": "0.14.10",
- "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
- "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
- "hasInstallScript": true,
- "license": "MIT",
- "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/shared": {
- "version": "12.8.2",
- "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz",
- "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==",
- "license": "MIT",
- "dependencies": {
- "vue": "^3.5.13"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
- "license": "MIT",
- "optional": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/animate.css": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/animate.css/-/animate.css-4.1.1.tgz",
- "integrity": "sha512-+mRmCTv6SbCmtYJCN4faJMNFVNN5EuCTTprDTAo7YzIGji2KADmakjVA3+8mVDkZ2Bf09vayB35lSQIex2+QaQ==",
- "license": "MIT"
- },
"node_modules/any-promise": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
@@ -2095,38 +1774,12 @@
"node": ">= 8"
}
},
- "node_modules/aos": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/aos/-/aos-2.3.4.tgz",
- "integrity": "sha512-zh/ahtR2yME4I51z8IttIt4lC1Nw0ktsFtmeDzID1m9naJnWXhCoARaCgNOGXb5CLy3zm+wqmRAEgMYB5E2HUw==",
- "license": "MIT",
- "dependencies": {
- "classlist-polyfill": "^1.0.3",
- "lodash.debounce": "^4.0.6",
- "lodash.throttle": "^4.0.1"
- }
- },
"node_modules/arg": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
"license": "MIT"
},
- "node_modules/artplayer": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/artplayer/-/artplayer-5.3.0.tgz",
- "integrity": "sha512-yExO39MpEg4P+bxgChxx1eJfiUPE4q1QQRLCmqGhlsj+ANuaoEkR8hF93LdI5ZyrAcIbJkuEndxEiUoKobifDw==",
- "license": "MIT",
- "dependencies": {
- "option-validator": "^2.0.6"
- }
- },
- "node_modules/artplayer-plugin-danmuku": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/artplayer-plugin-danmuku/-/artplayer-plugin-danmuku-5.2.0.tgz",
- "integrity": "sha512-iHHSGEc0J+gl7imX4nmLqqC7LXmv8xeGf2lUevhhyUCoiCRZplecpKQICHjErVb1Yqyp1xCy6Sp8eYN+EpFWFw==",
- "license": "MIT"
- },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -2181,15 +1834,6 @@
"proxy-from-env": "^1.1.0"
}
},
- "node_modules/base64-arraybuffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
- "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/baseline-browser-mapping": {
"version": "2.9.11",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz",
@@ -2244,7 +1888,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.9.0",
"caniuse-lite": "^1.0.30001759",
@@ -2259,35 +1902,6 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/c12": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz",
- "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "chokidar": "^5.0.0",
- "confbox": "^0.2.2",
- "defu": "^6.1.4",
- "dotenv": "^17.2.3",
- "exsolve": "^1.0.8",
- "giget": "^2.0.0",
- "jiti": "^2.6.1",
- "ohash": "^2.0.11",
- "pathe": "^2.0.3",
- "perfect-debounce": "^2.0.0",
- "pkg-types": "^2.3.0",
- "rc9": "^2.1.2"
- },
- "peerDependencies": {
- "magicast": "*"
- },
- "peerDependenciesMeta": {
- "magicast": {
- "optional": true
- }
- }
- },
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -2331,38 +1945,6 @@
],
"license": "CC-BY-4.0"
},
- "node_modules/chokidar": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz",
- "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "readdirp": "^5.0.0"
- },
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/citty": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
- "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "consola": "^3.2.3"
- }
- },
- "node_modules/classlist-polyfill": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/classlist-polyfill/-/classlist-polyfill-1.2.0.tgz",
- "integrity": "sha512-GzIjNdcEtH4ieA2S8NmrSxv7DfEV5fmixQeyTmqmRmRJPGpRBaSnA2a0VrCjyT8iW8JjEdMbKzDotAJf+ajgaQ==",
- "license": "Unlicense"
- },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -2384,23 +1966,6 @@
"node": ">= 6"
}
},
- "node_modules/confbox": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
- "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/consola": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
- "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -2408,12 +1973,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/countup.js": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/countup.js/-/countup.js-2.9.0.tgz",
- "integrity": "sha512-llqrvyXztRFPp6+i8jx25phHWcVWhrHO4Nlt0uAOSKHB8778zzQswa4MU3qKBvkXfJKftRYFJuVHez67lyKdHg==",
- "license": "MIT"
- },
"node_modules/cross-env": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
@@ -2448,21 +2007,6 @@
"node": ">= 8"
}
},
- "node_modules/crypto-js": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
- "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
- "license": "MIT"
- },
- "node_modules/css-line-break": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
- "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
- "license": "MIT",
- "dependencies": {
- "utrie": "^1.0.2"
- }
- },
"node_modules/cssesc": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
@@ -2499,13 +2043,6 @@
}
}
},
- "node_modules/defu": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
- "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
- "license": "MIT",
- "optional": true
- },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -2515,13 +2052,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/destr": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
- "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
- "license": "MIT",
- "optional": true
- },
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -2534,19 +2064,6 @@
"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
"license": "MIT"
},
- "node_modules/dotenv": {
- "version": "17.2.3",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz",
- "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==",
- "license": "BSD-2-Clause",
- "optional": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -2561,26 +2078,6 @@
"node": ">= 0.4"
}
},
- "node_modules/echarts": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.6.0.tgz",
- "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "tslib": "2.3.0",
- "zrender": "5.6.1"
- }
- },
- "node_modules/echarts-wordcloud": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/echarts-wordcloud/-/echarts-wordcloud-2.1.0.tgz",
- "integrity": "sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==",
- "license": "ISC",
- "peerDependencies": {
- "echarts": "^5.0.1"
- }
- },
"node_modules/electron-to-chromium": {
"version": "1.5.267",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
@@ -2600,13 +2097,6 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/errx": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz",
- "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==",
- "license": "MIT",
- "optional": true
- },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -2701,29 +2191,6 @@
"node": ">=6"
}
},
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/exsolve": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz",
- "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "license": "MIT"
- },
"node_modules/fast-glob": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
@@ -2823,21 +2290,6 @@
"url": "https://github.com/sponsors/rawify"
}
},
- "node_modules/framesync": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz",
- "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==",
- "license": "MIT",
- "dependencies": {
- "tslib": "2.4.0"
- }
- },
- "node_modules/framesync/node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
- "license": "0BSD"
- },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -2908,24 +2360,6 @@
"node": ">= 0.4"
}
},
- "node_modules/giget": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
- "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "citty": "^0.1.6",
- "consola": "^3.4.0",
- "defu": "^6.1.4",
- "node-fetch-native": "^1.6.6",
- "nypm": "^0.6.0",
- "pathe": "^2.0.3"
- },
- "bin": {
- "giget": "dist/cli.mjs"
- }
- },
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -2950,12 +2384,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/gsap": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.14.2.tgz",
- "integrity": "sha512-P8/mMxVLU7o4+55+1TCnQrPmgjPKnwkzkXOK1asnR9Jg2lna4tEY5qBJjMmAaOBDDZWtlRjBXjLa0w53G/uBLA==",
- "license": "Standard 'no charge' license: https://gsap.com/standard-license."
- },
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
@@ -2995,35 +2423,6 @@
"node": ">= 0.4"
}
},
- "node_modules/hey-listen": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz",
- "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==",
- "license": "MIT"
- },
- "node_modules/html2canvas": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
- "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
- "license": "MIT",
- "dependencies": {
- "css-line-break": "^2.1.0",
- "text-segmentation": "^1.0.3"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 4"
- }
- },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -3088,16 +2487,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/jiti": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
- "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
- "license": "MIT",
- "optional": true,
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -3105,12 +2494,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/jsencrypt": {
- "version": "3.5.4",
- "resolved": "https://registry.npmjs.org/jsencrypt/-/jsencrypt-3.5.4.tgz",
- "integrity": "sha512-kNjfYEMNASxrDGsmcSQh/rUTmcoRfSUkxnAz+MMywM8jtGu+fFEZ3nJjHM58zscVnwR0fYmG9sGkTDjqUdpiwA==",
- "license": "MIT"
- },
"node_modules/jsesc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -3137,31 +2520,6 @@
"node": ">=6"
}
},
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/knitwork": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.3.0.tgz",
- "integrity": "sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==",
- "license": "MIT",
- "optional": true
- },
"node_modules/kolorist": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
@@ -3187,24 +2545,6 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"license": "MIT"
},
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
- "license": "MIT"
- },
- "node_modules/lodash.throttle": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
- "license": "MIT"
- },
- "node_modules/lottie-web": {
- "version": "5.13.0",
- "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz",
- "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==",
- "license": "MIT"
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -3285,38 +2625,6 @@
"mini-svg-data-uri": "cli.js"
}
},
- "node_modules/mlly": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz",
- "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "acorn": "^8.15.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.1"
- }
- },
- "node_modules/mlly/node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/mlly/node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -3353,13 +2661,6 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "node_modules/node-fetch-native": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz",
- "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
- "license": "MIT",
- "optional": true
- },
"node_modules/node-releases": {
"version": "2.0.27",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
@@ -3376,26 +2677,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/nypm": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz",
- "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "citty": "^0.1.6",
- "consola": "^3.4.2",
- "pathe": "^2.0.3",
- "pkg-types": "^2.3.0",
- "tinyexec": "^1.0.1"
- },
- "bin": {
- "nypm": "dist/cli.mjs"
- },
- "engines": {
- "node": "^14.16.0 || >=16.10.0"
- }
- },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -3414,22 +2695,6 @@
"node": ">= 6"
}
},
- "node_modules/ohash": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
- "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/option-validator": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/option-validator/-/option-validator-2.0.6.tgz",
- "integrity": "sha512-tmZDan2LRIRQyhUGvkff68/O0R8UmF+Btmiiz0SmSw2ng3CfPZB9wJlIjHpe/MKUZqyIZkVIXCrwr1tIN+0Dzg==",
- "license": "MIT",
- "dependencies": {
- "kind-of": "^6.0.3"
- }
- },
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -3446,20 +2711,6 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"license": "MIT"
},
- "node_modules/pathe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/perfect-debounce": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.0.0.tgz",
- "integrity": "sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==",
- "license": "MIT",
- "optional": true
- },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -3496,36 +2747,6 @@
"node": ">= 6"
}
},
- "node_modules/pkg-types": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz",
- "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "confbox": "^0.2.2",
- "exsolve": "^1.0.7",
- "pathe": "^2.0.3"
- }
- },
- "node_modules/popmotion": {
- "version": "11.0.5",
- "resolved": "https://registry.npmjs.org/popmotion/-/popmotion-11.0.5.tgz",
- "integrity": "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==",
- "license": "MIT",
- "dependencies": {
- "framesync": "6.1.2",
- "hey-listen": "^1.0.8",
- "style-value-types": "5.1.2",
- "tslib": "2.4.0"
- }
- },
- "node_modules/popmotion/node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
- "license": "0BSD"
- },
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@@ -3545,7 +2766,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -3709,17 +2929,6 @@
],
"license": "MIT"
},
- "node_modules/rc9": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
- "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "defu": "^6.1.4",
- "destr": "^2.0.3"
- }
- },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -3729,20 +2938,6 @@
"pify": "^2.3.0"
}
},
- "node_modules/readdirp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
- "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">= 20.19.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
"node_modules/resolve": {
"version": "1.22.11",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz",
@@ -3838,26 +3033,6 @@
"queue-microtask": "^1.2.2"
}
},
- "node_modules/scule": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz",
- "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
- "license": "ISC",
- "optional": true,
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -3890,22 +3065,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/style-value-types": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/style-value-types/-/style-value-types-5.1.2.tgz",
- "integrity": "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==",
- "license": "MIT",
- "dependencies": {
- "hey-listen": "^1.0.8",
- "tslib": "2.4.0"
- }
- },
- "node_modules/style-value-types/node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
- "license": "0BSD"
- },
"node_modules/sucrase": {
"version": "3.35.1",
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
@@ -3945,7 +3104,6 @@
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz",
"integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
@@ -4035,15 +3193,6 @@
"node": ">=8.10.0"
}
},
- "node_modules/text-segmentation": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
- "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
- "license": "MIT",
- "dependencies": {
- "utrie": "^1.0.2"
- }
- },
"node_modules/thenify": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -4065,16 +3214,6 @@
"node": ">=0.8"
}
},
- "node_modules/tinyexec": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
- "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
@@ -4113,7 +3252,6 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=12"
},
@@ -4139,42 +3277,6 @@
"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
"license": "Apache-2.0"
},
- "node_modules/tslib": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
- "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
- "license": "0BSD"
- },
- "node_modules/typeit": {
- "version": "8.8.7",
- "resolved": "https://registry.npmjs.org/typeit/-/typeit-8.8.7.tgz",
- "integrity": "sha512-sSVpy+cjeFP6Z+fZqiHzUSShg5yYFeJEt/Qut/bX945+Axyq+Yq+GPOuuk+sofoccSv8nNX/ibOOHkbki2mEpg==",
- "hasInstallScript": true,
- "license": "GPL-3.0",
- "dependencies": {
- "@types/web-animations-js": "^2.2.16"
- }
- },
- "node_modules/ufo": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz",
- "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==",
- "license": "MIT",
- "optional": true
- },
- "node_modules/unctx": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.5.0.tgz",
- "integrity": "sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "acorn": "^8.15.0",
- "estree-walker": "^3.0.3",
- "magic-string": "^0.30.21",
- "unplugin": "^2.3.11"
- }
- },
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
@@ -4182,52 +3284,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/unplugin": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
- "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@jridgewell/remapping": "^2.3.5",
- "acorn": "^8.15.0",
- "picomatch": "^4.0.3",
- "webpack-virtual-modules": "^0.6.2"
- },
- "engines": {
- "node": ">=18.12.0"
- }
- },
- "node_modules/unplugin/node_modules/picomatch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/untyped": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/untyped/-/untyped-2.0.0.tgz",
- "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "citty": "^0.1.6",
- "defu": "^6.1.4",
- "jiti": "^2.4.2",
- "knitwork": "^1.2.0",
- "scule": "^1.3.0"
- },
- "bin": {
- "untyped": "dist/cli.mjs"
- }
- },
"node_modules/update-browserslist-db": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
@@ -4265,36 +3321,12 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
- "node_modules/utrie": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
- "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
- "license": "MIT",
- "dependencies": {
- "base64-arraybuffer": "^1.0.2"
- }
- },
- "node_modules/vant": {
- "version": "4.9.22",
- "resolved": "https://registry.npmjs.org/vant/-/vant-4.9.22.tgz",
- "integrity": "sha512-P2PDSj3oB6l3W1OpVlQpapeLmI6bXMSvPqPdrw5rutslC0Y6tSkrVB/iSD57weD7K92GsjGkvgDK0eZlOsXGqw==",
- "license": "MIT",
- "dependencies": {
- "@vant/popperjs": "^1.3.0",
- "@vant/use": "^1.6.0",
- "@vue/shared": "^3.5.25"
- },
- "peerDependencies": {
- "vue": "^3.0.0"
- }
- },
"node_modules/vite": {
"version": "5.4.21",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
"integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@@ -4375,7 +3407,6 @@
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz",
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@vue/compiler-dom": "3.5.26",
"@vue/compiler-sfc": "3.5.26",
@@ -4392,63 +3423,6 @@
}
}
},
- "node_modules/vue-countup-v3": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/vue-countup-v3/-/vue-countup-v3-1.4.2.tgz",
- "integrity": "sha512-nRC65jBcdgwybxqztgd/WaK8ZN5T9ECPyiCFGYFMewCsvqdRVo1CtpT7JREcPNF837Fgu/izTSFiuzrIGD6w0A==",
- "license": "MIT",
- "dependencies": {
- "countup.js": "^2.6.2"
- },
- "peerDependencies": {
- "vue": "^3.0.0"
- }
- },
- "node_modules/vue-demi": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
- "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
- "hasInstallScript": true,
- "license": "MIT",
- "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/vue-echarts": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/vue-echarts/-/vue-echarts-7.0.3.tgz",
- "integrity": "sha512-/jSxNwOsw5+dYAUcwSfkLwKPuzTQ0Cepz1LxCOpj2QcHrrmUa/Ql0eQqMmc1rTPQVrh2JQ29n2dhq75ZcHvRDw==",
- "license": "MIT",
- "dependencies": {
- "vue-demi": "^0.13.11"
- },
- "peerDependencies": {
- "@vue/runtime-core": "^3.0.0",
- "echarts": "^5.5.1",
- "vue": "^2.7.0 || ^3.1.1"
- },
- "peerDependenciesMeta": {
- "@vue/runtime-core": {
- "optional": true
- }
- }
- },
"node_modules/vue-router": {
"version": "4.6.4",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz",
@@ -4464,36 +3438,6 @@
"vue": "^3.5.0"
}
},
- "node_modules/vue3-lottie": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/vue3-lottie/-/vue3-lottie-3.3.1.tgz",
- "integrity": "sha512-60uQmx4eefi3FdPjAxWnblrgJJjnVTXUA6e4BAI3jGzgOSR76pyzL1rrWDiyPmMFo4mTw4wGTW6Gbkg3HR1mYw==",
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.3",
- "klona": "^2.0.6",
- "lottie-web": "5.12.2"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "vue": "^3.2"
- }
- },
- "node_modules/vue3-lottie/node_modules/lottie-web": {
- "version": "5.12.2",
- "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz",
- "integrity": "sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==",
- "license": "MIT"
- },
- "node_modules/webpack-virtual-modules": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
- "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "license": "MIT",
- "optional": true
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -4516,15 +3460,6 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true,
"license": "ISC"
- },
- "node_modules/zrender": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz",
- "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "tslib": "2.3.0"
- }
}
}
}
diff --git a/frontend/package.json b/frontend/package.json
index be21de0..2a8656f 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -16,33 +16,11 @@
"tauri:clean": "powershell -c \"if (Test-Path ./src-tauri/target) { Remove-Item -Recurse -Force ./src-tauri/target }\""
},
"dependencies": {
- "@headlessui/vue": "^1.7.23",
- "@heroicons/vue": "^2.1.5",
"@tailwindcss/forms": "^0.5.9",
"@tauri-apps/plugin-shell": "~2.2.1",
- "@vant/touch-emulator": "^1.4.0",
- "@vueuse/components": "^12.3.0",
- "@vueuse/core": "^12.3.0",
- "@vueuse/motion": "^2.2.6",
- "animate.css": "^4.1.1",
- "aos": "^2.3.4",
- "artplayer": "^5.2.2",
- "artplayer-plugin-danmuku": "^5.1.5",
"axios": "^1.7.7",
- "crypto-js": "^4.2.0",
- "echarts": "^5.6.0",
- "echarts-wordcloud": "^2.1.0",
- "gsap": "^3.12.5",
- "html2canvas": "^1.4.1",
- "jsencrypt": "^3.3.2",
- "lottie-web": "^5.12.2",
- "typeit": "^8.8.7",
- "vant": "^4.9.15",
"vue": "^3.5.11",
- "vue-countup-v3": "^1.4.2",
- "vue-echarts": "^7.0.3",
- "vue-router": "^4.4.5",
- "vue3-lottie": "^3.3.1"
+ "vue-router": "^4.4.5"
},
"devDependencies": {
"@tauri-apps/api": "~2.4.0",
diff --git a/frontend/public/Comments.png b/frontend/public/Comments.png
deleted file mode 100644
index 2c528248ea0b5fd20daa0b71eb385c9b71a5fa47..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 200695
zcma&OWmubA*ENbe#agTsmm+}{DDF^PiaWvGwYXa;P&CD%Skd4ftVM%U+}&M*bJFKM
z@AsWQ&p!JXkn2ja?zz^SYs@jmB>I!G3@#Qq76JkSuAHot8Ug}(AOZri2?iScm7N-w
zZTJsFH#Hdvgvt?$Jp=@51UV^jjn77hS?GQgTWQaMTnjPu3a*VVJxf6j2Jg_!BzKK%
z-_p<+NDOXGuy46y4!jvCG&oo3XCP6-*pwiYz@(`gtA1~6|CPD7m!}EFGLYDCGBWgh
zA#^fycxbE1CYTDyhTv7V30|b0w3gLAPMvsjLu=UjB{499c~JC-m;=~}V=>;)P@{we
z;o~Doh+$wL{=*;6e=v4iA{2Sh!GlVLll_(#@05^RjwRo|6ysLA)JZQAC%X0hGa}0<
zFoF^FAUyIyF_rb-d~mRlMCUuKx1>d_8L6pSo7mwzt=Kn@KPxL;b4YF%6qXTcV(C=G
zHct|)Sm?0+X?_3qG2E4@GoZ+yP&1j&GL)_6A>aKe-9rYz3%$iM|e=rJdA4e{@phcBf%dTDmN$+M+W~bJ}v)S_&*+(
z|6S~=|KBgV-*2+0l?jChD_>l9`~Uy2{pa0pnW)dTmx&}+F^KSQeZztWo&Qyk@sSK^
zsm~h~zHidfjCsHp+d3j&`4Z`0y_e4w#Yg%{4}rV$3H4aJhw1Rm1ks4(g-~%bOrY^6
zE5JIn*X#oI+HLI6_tw-S@}h=|Wo31-EJAG~Iq*nVHDfDv@y{74aYYJ^j`NJRiRK&1
zdMiYS88x3`!JK>dxd6fM{cl>$6KTDDnO@19QajZO>Jf>vXN&vByj?IHm^iwqV|#73
zlmE)91fh!So8ir2^urMneY4a*r{@2ObrjJq+3ms_k3f}^#Y9s@rw5v2nZRDk2qfF0
zbruV0JZmVw9I`xJTP%N3*P(SU-IwTt>aHE%>SpdBQ?ujt+hNDP1*K~J3#;vVWs6nf
zMnUA8yc1z^Up(mx%I_8TYh|y|g!O*uEqNzrnuB=eGY>OphY{n81D(UnAP~1IY_2OmKFLOrFiCmioob7w-!ygn4LIe6E$P4G1-XGJy
zUHn#@eu1lNgcLwlSbOkBbyT0l@J+1Qp+RhSa0N!DGnSu+WXyqEUq#!(xed1OG|j~{-Mb62
zoBKGa&+{o`l4lKM`{ypg$ox!yQgB?gMNHwRNJ6fX;9s7i36wa@Td3=w>(EjOH&xdNrq9cvR!gUC~sv;ZR@%AsKtDs;P(?xx+`IvlN@W{E_NJ2ZG{_
zNSLgk6{Ic=TY*s}PVq=%`v0)zq0%)}!IBZdmjfl2Mtn#)?-Dv>5Psm$p!~a=qW^Ca
zX~}wdmMm2`L=D>`-710es=OeC9ecz&&D;v2i5+@PSUzo(!32}5RD8tgqd>)z)ZI@O
zG7GPo8Njkgl_gV>UiO5bkkBH68xDrgK-
ziEUoSi^cy*p8CliQ{po-X@oSR#1Dcn$!|Ie9&pI9gBlndpI^*_46~ab-lcG8XQh6?
zmEPc?CwW4`(C$*?5u1FB8fig%A}V@|xjg<$S@QL8>ow0H(2yF#4P>5yRDtrdM)+jNtR;p_Fsks1@rRjLp|?UO7hQMOBFH&E|B!`QSmp!
zdn7hPGaGA$4C92;LXC=J?Q@WjISo31RNDDLNJ<%kG?pnRjYKBG}ISBDT7G$Tiw{LzA@Z`3Xie;u@l
z1RSQ;mj^M}L5J-MS0)7v0{45rP06!<*5q;tLTv#DH1RqwZ3DIi%$#b{aP6v-Jyi=p
z>_ZL<2hF_q*F^no7j*()1FZIdd;2^w0
z(Uq-8=Z^YT2_T86`xF&l^ci{zd#$==%*tSTH1%1YRa<^r3rlbEMXVGuVc;_*m`UKC
z4&!TP&xMaw>1QW0E?C?TJ1u75ePGu4SdW!#QHHG01rhP6yJt~?jPWX;l%)Z-uz>~C
zsh<4AH#i_i7bfI-0>Kd0!rQ-nP0EQm&L!HlQ@O1%vDg|yJ9eGe!;rB1>&`g(L72_Y
zwf0|tH26&*#*0ZIdEVIlf(`rDfi=N@N0$`6p{9V|qzv{3)$G~QIuE1Vp8T!34q7cr
z+%!TnH$Dbp=FbmJhqYQ$B-L)BctA~2ZFyn^1lF^i;W^^_d)rJlz@bj`!*M-47U8Qu
z=l1pDW!wv^RK=jkKuwFE$R;{I^N5uPMcz9i9o^^|pmxNDL;z2lZPH0W;(UsSi}OF^a9^T?EDRyuKb~roXVJ
z305oZD+|)!s8$}==mZD?K}GS{_q;Tab;R9v>T`4+iHk_SV2TXbsQl)%(Bf)i|De)%7ZI!m)7QF(8O#iSZnU(Vd+4uj&~!
zN{iy^Y(hs*%V4RwlSs@%>ML1}KzyyDaP?|>b^iBua|1wO1Yxb1)h7N^ytLnYdS)xq
zn_lh68=aQQIBrzN^3&Vui|RZ)C+ZD2b-D8LM68;OIw?L{mg*ZoO(ed@eMrAU0B-K!
z_|w}`j%N<`nL}wch#jwDozN)*gC{ZpHArmStarqn!&Ueea3m7YBkC-)
zej&Qyy)ip8U!<$~x#44_;g^N+(jIE(YO?p(I;}aJc2_l=L&_wphx^6fbQ>}HRh`UP
zVsXQYjpD|_+;YctxzO+ZhL8w3mJwO~@wIqRxfZ_6rsYT(pPKU?l{Hu|*r=r0nEv>d
zT2#1naeOXQbbO8v0;H4*=~wYD
z67Y@`H?|)Tq4z14t-J&bPP3J8zNC;+ZVm&Qy+6X9hh*89#NlfL8$hw_AE((nCGR%j
zHG$s1wff)HgiZq5F}m}{AI_}RUl|i)0%9Mgd7Fi5QdHc?i~;lLmKR3W)#NwmaUboU
zilG931T-{C){#;^7@Z+xh;n%&oJQhP1hCN7I#w~fFBDHnX7i+A2Z0$uWbEAbTLF+@
z0xtZtv#vzWexqi2h9CM=&+UY9C80uApBII~7_+Rj-#5f4H7=MoR0M6-afou0-t$o3
z9zHwk9<283Mh!LfzFL-d^|`F(>F
zVJpSpfOYC`iGRvEJ5drqe-A5c=C>d(_j?nm?stB1F
z-fOfA4!rxfkX9;JW)oa1A!EZ*u}9$aF2TT$X(+VSnEP1Dc$WDTFFR-`Bi{Mhu!WD$
zlbx0e>;~nUT%s4z)HGvYA2vW6AaRVGtIHz#^#{l+i#anXG9>K0BvxwCX}^Tdx-_(v
zCP(V3_Wi2~P3Z4#V5jx+@W7wh!+2^wA0BKox+N6Wq#$L6EV?Nnj^RnaXA)h-^l&7Q
zPn=>aRu=)6#@!S<#NeT{$yWv2#OcMnaz*KR-|d^SZw8+QVSBi7{K(^JGn%`a_Mk|1
z&sIP?^C9_gft3wKzKbAq>XaEo%XeL#IK{7-2oa8mVaT4MkpDn(RhMMAZPbz4HE{6I
zz?-mgCxES|{Gg`B3sQ?V5>cUI3S!oc^-B)~hp)5wGNamCBqCg?jC``$&D`HoEUel4
zjx64}6Iz6B!gwu-EoH2#mZ|)!Ujna}fRrCQIFHFq)P(S6EB==|#Gw~XD9EmaZkp2k
zZ-4WT3`H;1udMDbK2#&Z8=?qKRXKQ;c7L!8UUS0
zt#w+a7M$JYY`m9EFVcEI?d>vzR}9I+auv5Z6RxF@RP+ukXRt|(digj%Ziu+KA9ufXbS?o1QEcnA8Xd&P$hWC>NGomS*IC36Khwk)xA4q4^h
zhgR+KCw3Mg0`N7hvTU||`C}DP_V`Wa{H9$YzRsZ4_vnSn5Iq#UXDS$+lZ^HEI0
z?a5weJT$4^3<()qdJcm(n<9eE>i@3U%)LkP(Rm^!FoPs(|FwC_?z6`aH@O8-xTW#$4rS`FN
zJ4&vntfn-doAbKy#@oAP}-tQ_E30wQr_`kkNv2R
z%6Wd(O69P3)}(8wfT>}mo`zBMvRp1CjiDs^azeDzdJ&Op^2;eR2_2s)Be;vCa!sTO
z3u6Je;Lj4FOgk%XZkaxQ*IyyVhsL@TQX12N35TK{U_+jalNzWQh;@%g`TH@goPvG<
z!pX>oMfF*hf?PX+;(EZOn%Xo~h%zTg;8NPo8%vnftQv0#@43^(kC-L9g3I@Abg0mz
zFdd;Kb(__^nTmVBSpHFOFLWQ~&T*7}%zGiknDS-%*A%=~N9_*bxnM0q=WSdTQ`+3D
zs5s%YAwl9y_`hLDsZpK?P<#xYQU@D&_%%~53*3)cJ7fZ8^fWp7KoXmO$_V&e;xdXX
zQlRImHgYXYjW*1jP9iwij4}EwPy>%A?OfFS9$D7gE(4^w52Ir7SK&E6zohLJ;Wb+c
zs$-fcwE6M`6&TL3jF)V$1aW67wnWZXk#QcPuuhMAsPy`#cPxZ>R0jr$8o_4_fLX|reRCzyi$lndyd$(H8I`6G<`r;&y(2?tMzK?ss
zd%*WOdOfOJmE8}>P3|7U7AqFs<%w+;JGpvqNo1~yf*f271#-d{BecH-Y=GYZklS_M
z#ApL^@=mX)aD`un5?5M!>J`MZEDb%T19-`X2j>$8UNrLTZLDj_1*wk$StpU8{dA2k
zWaolfNWu8rwVjxz!&E^=!uV%y9cp@%E$T***W>WYZ{4R#$RA9%S~+
zv0m@0X^QJc+qK%)e{`9ZK#OJyMA=wj$iBBr>W}Hi8
za4RKC!!i2V!yw|#;Rhn$@rTX8UnF0vWGh>CiFer`Ss!LOmn!xQ)C@D?`^OKDg^$Ip
z4W0xbmyWrmqO=>^zh=Dnm;xZoo9q0IIqw>f=U*u(_!iZUR?dpf@ih^ZSOf-**Cq9c
zMy5RmDC24aPfrjEzbddsEbJb66=0uz5>lU_FHfxWIFX^n$X8SQE2Eom+NkrrQm)k|2hCnpd!>)+fbjlVx{T}i
z5p`ZMTW&9=k?=Awg{Q%v0dzZskZ&S50S&<8D!V&Nk4FC6a?X;!a210CreXY&HpLLH}_WHo8y4&{Hi5w4D(ie{GbLD%8>>Y|oqpS!v24-;f
zPg?}3)`J5iRwPoL{17|TMBGKA-ZW)r(`AteMf(~75NZIAQa7Fe2Fw#9=jun{5E`G9
zo2;5kvwY>zh=~&EIqw`_2L5zP@Y(;p{y(1
zW03{G4vzrH3c=LbB`eVLe;S=SY?rdT=l2hVEFdh9IEa>uOObLC%&a%HhqjXQH;x|hb#E45Us3_?^E_NqlA$@`;qzUws5I-*=YQJ+0$#E
z&dT>rs(Zoo=YrZaSKGe~wzcDb8#9vYwxdO6ed(`b6^>AOMYY{t^GD^TaOHS1e)4n4X`W@vvhl+VzvNI${vRynmdp+uXO&yiAL=%HaI!Edio
zj2Z_{)QEJBX=2TC;##-FTL8Gm9x+rzsMav4jNjXm@#~~%9q&PBRGm!sr~flr3Vg$JpkMZyVfg~={0;R+m9yntZJC>nTg(2D06pS3+c)gFJ!{@8gs^d7H#D9%pdDUf3yPQMoT&7u8eG`e!h7Ab3_hNvS
zoPcd4@D|QNlhd9Aw!SJO@o#2Pn_3^=h;2GGjt|62tnL!zQg*~*S|i_4K=>^f|7q`p
zh;qN=+^6SF^%SC?p83VqTpOw6_HBX{8WdMkgj5LQ4J4~4yQ90x!ZzQ5}t}wSq
z^pYg5EDNkF-$L@PYHRY_YOw~^?3Mo&a-YI
z$%PI5TbDK`e3d*4>v4J
z&^Z^>kw$D6k^JP})p6G1st=5mJK(7q>(<1G`;G{)4a$mT_(C7oNOv(Z`Sx%H19*f_
zJir|f_Wa3G@un;^!CK7q?1yuW6vVR++Vt-;x9zp941^f=nyzj9og
zBpBW~PHTK*gM=hv?Q$O(6*v8xGyWe~5WZ|odd{kIRBL3r_#MOk`EW5XxoQOs9Hey!Rm3@zhry;K^ZESaY0v&Q
zqW})j&!Xgaa*nYR-D5gGwG1zDmBHIQY~pvZ9Y`8?-fP0q|
zcZLB)NQmSVo15I%d)lce|5fNaavr+dbHgeuUG^M9kMWrVpDW6jo|R~PY2{~jT_)-T
zSsrvTdOqI)zPjY0sP&i%Gr9L6et;uh*K?#WrmWGDgWvGJe6Li-w)xQ0@#vzT*C8}T
zsf2LKlCoNtDtOr|S^s!$;i9Q6rv_H>V`8LkMLWR|CRF$7)ekojG{DPR1yR=bnV1l|V|A)GuB|*pzh@SPI
zz($`)a2sM-9@)GzR_wrETZ37G7~bH@`D|gK57c#3s~EG4WyJo_C}y)pw0p4bZGwJ(
zNkH`<(HS;p8>=aW8L-cEBF1&32BtXzyiWcSb+(t=Gij}7E7l>32`o8oR77Diis}!m
zy%pig5L-W4*+K!NNWW0x(;onerEo7lkbgC&lh_!QHs9Z3Q!EjE2kB*2)4z*Q(M13*
zIZt`<pw)@jsO{(0gOxyRM5L??M==*KU*plV-fAijtJyZ~
zPv~pn8MZQm)9j@V+(aWZ`)l!wjD9807iM<}QKlqaM}G1c=WP!2G+i6zCn(q3oQJsD
z7~XPY+d_O06qew$Q1^@zPI1X3>r;rthSpO$&wxK@m;&1ys(c%v0wM3WNYJ_DYL~_i
z(=AZPv?q_J^r?Gcc|iHwas_2&HA!P%?_$pXb5_V`=|!!2ZbsVNhe~G6EN?HGbA7E-
zy}JEiwnXM=MUoO2;kVBZ3-36GPy6ok##(X|fZAF2uavRMBE~%tX4xP8=+mF!?JIG|
z)IfTe7&D^X1?8R+trONi6y7mhr0GgDYdUn#4dv#K@SV&T&qd#IDm<#+Ll`>e=y+5r
zNPSLIZ)fw7%k8}vzu0@XmuerASVFI|@z@j(h*o9=MM%4<&8&eb``1(H*>Lw|d;YdW
z0aui%@fwu;LQfQ7y~9>?*4u=c6bvrWerRh+9OBj!sD2y_&KIp(U9vnhLfeXA#fHP9
z>inBH46307Is>7nnlPD%hrrtV2Oli#+8&g|n7{#uUkP3n@m}bz4OIj<0RB<{CS7&B
zdS{+$EkRnqheU-FX_Fn6)W!C6@u-|f@05V;?=}0?8U8!W)c7XR6v9XOaL&k#QbQ|!
zvx@jAbakwx|3p9j&jDVi?NXmbjT}~zh71jM?EQt>2{3U~033bCnDkbq!&CI@^y6YN
zFZUBNh7uo%C6rws%Sk5pnY4YGWpnIq(V>ll-Aw78jz4F#Q*_fDu4Ef8KOvfZ({IJF
z6zRFg!pTN?&OP(&Fxe3{-Enp}%UHNWtFg<`wCH4JcGx5kIm1C=%Iqu5ncHK@kNu6^
znD1=N^-v#bLb2GxP`P0hm_P(wRG7O+wd26_`$;90&=D!GSV@8;lk?ZpF=}A>-whVK
zZ~l5z;@pxAFO86dSpxYXb~9#LKBIDeHTrc_#5E_7prQ0)O*WkL1?1*7(aZvy!d*`CJMwH7cyi!Ji(zb_vc#o)AC5F^&hU%wvk(i6Ov-Mp5>F5x^xCS+uL>%XW%@>I1S
z`npW=;Q{O%GSiTFtUSEEWS}+wEJ+K1w+LtxTs?@8??z`%@!YO4wI7jY%bDys0>)4^p5n|icn4b2OEHkvV<=GfGkiE4?V9o89!g!36}mSgu5)Kx
z!`z|felnm3wkOS4Zr5VOXT-zlbYv~cG))!i#Q
zt2ChpsT`C@I&O%{LZt^jy!sj{*z8qP?Ieu!%Zggyk-U8+;jHr5V>u>rFYx2j^|I6V
zn%ZSaI5a-tSD1_buehmm{I4Nx_dInjtTT^rSN!$>%|FJj62H43%*u0kvfoh$=@aK4
z5-ICLp)e-kYEi@z;$hIwq(|;aK!1BHMl&vlWZ6D8T)!Yp9DIc?GrXN_eK*{ZR~0A>
z`#pt3ppgaBwEp8oLXH)?kns7sc+BjBfhix)j@c<5#V90b68eNfzG6Kev0IKu_s*7h
zMRIR}qCyjP!PiBkEdKfKL$(x4#dJsy(ya)o?@G9CKaIc@mhz0{v{2+>D|SlfP%%D*
z2O2F`rA2Vo=k4b+f6G$Lgc1-9cbpGV*^(tMz#^?om+|4TkDBws$BRnYd3sIaVyB@k
z;&M<%=Tnk9E>3pPY-W7z%fjrAfu0VDJR5XwsDyKOGh2{;&VvY3a)mL)*`z2I#1cOd
zyo_x2j3)A0STFwV6?)|xB)ah+xFchebAmf3u-{y&$p4%AOkBT*+j3EOcXoZhgHgm{
z+|;S&)nC~_GG>Z@f8M|L+l{05!-7y8*arbA-;$2ov}k|LPE=z;cWY3es^gUwBjQS@
z%exo$62`mC@KTU!-yT|dWF@_Mk{3Xga1h?xpl1E^YS&ns=S+}mT(-!RsI#K4r3%!07Bk-t2w(G-V)t+L`t#{KPKaC
z6LTUA9DcIfBd3zpvdS(t^JcKq;n$32oDYQ#Nil)AwI-|}wHGf$UlGVx&BqVT7bh&-
zF_xPnL(j$vE}Hw;8NN2ZteNDQIgZSLOV`a_Bwg#-ZNonWU}a-v_hm-?;X-OqxqZj=
zWr)Uf`owgF%5x*jhCx5Az=8DfdwWK_PRy9fsLv+eR80V?u*j4#
zBYQ^xsd?WShn3+5caz0w@ug}8D7qyX4oY3l!yZpUo>mIc{E8PjnNohEhW
z1NhyLmhaoGTz`@{no@k(Sh{kU>c-xRlbZ0+a?9*3w|&T53zgp6xSNMjiTJ5j)ZcRQ
zjY1E&J=_MUtdn2*<>0Et)1fKh!V$nhn?MvP$L)VjaZg=vfb$fJ2tEDpk})I|o_$8X
zbv4yS5`SgN*UWp@&wvSr;B>t^-OVA9~RWa
z;>}pCvvHq}#3vO9XRx!~Tk3bvMHI$2R~__szsIrQS1OFkdg_(FFe*r0M9sJ0h_^}n
zG{t>$kMq%a!W-jKltAxok(f^D^Sc2JRu6n)1}Ce)mt6#thM)Fkp1&LxY3m4}|NPB4
zuu`+>R9y&2@iz*-Jon{$JUj`cHFa~;S_erNB%jrYI`dm8!03e53~uaH#9RlQ_|p`8
z(JJ_-FoY>&+((8_lM1FEsP{%56ZK&<&8Jp=Ms+*8Uk?aKJy~MrCVZfA1xzj~`d0;x
z3d?wxw15$1lu7Xn#vu*lnggKLR$Jf5j>otd+Y`1fJAqPS`e5W_3!Qppor1e>i(;9;
zxP@?W%*PtMt6KJR*r(`$D>xJM*GPPs2L1XE8}-+uyzCNJ6SJ%U-zaeYO7g@-vaJ?-
zoCW*9uRrU+ZtKO7ka!lDXMC?lnjSGRUe~g4bqcp$LDxy-)+*j
z10b7T{U>_3(6?1>v01lra4cUp`SV(t8E2t|WI#IroolMw_fq>x(t2rCov`3gu*SzV)wzwybxw$%~{!QnGYndb35N@GD>B|bIPHFY*^OzC@
zPRj4?nj>F2zxq)eNb&TPzi?@@tzM&`S`2z7ljezqv%I;H>ul-6_N-8AVZA>878C$dzU^bC5P
zcC&)lfFhp4v@};vvi~1-W1bNImh}XS#@U_-j)3&pjttgUG+MQ;UPkxZBUPw8e)EN@
zor4l9G9O|uZIbRZ8$Z)_UWQq?09O{LUjQ8gEUq_%Fzt^{tkX_nR#c
zs8h5($N2dqV_eVR%D69!y2)AAy08+)I9g%K9YkdZ5czrhN_p_VqTJ+RSG7p+5H-CJ
zK@L2snrMM8YV*eaITy{Z+A)NSei)dW;zUO!F_xo59^H;K;g@+R%d
zSGWgex;fq$uFbh!@wo#P`_rqHu!CKUpWAPSV?$1Z3^zE1bUOW*mg=nZ_9+t`P_$_=F+&~SJA
zCN3IbLQ%nwcjrdC2PH{N#uGP0f-m!pXqxR{A`f@*c+?rg^{vB6j9XgqkhA|{=ZF8|^RD{wO=MkFO$;lfIBKV~em`=y
z^^TOs{8RMq(U$_xrav0m^{mmu&%WfdO|50n)q^_JV(|?A?2d*Pb)7BuWV_gw$Yv2Q
zbMB9b#5gA{4IHLFTZ6JA9ETS=i06lQkjI@fT(ZvE>;wyx273Od{*KvU!gIV{hV}IU
z1B%b5C*ts|#?{JSn$3LJmMy5!OdX>n8R0^gI)GxMD_LBqv~p>wC|axOI5R*Ire4Z>
zHWa^BcHC#C%9(n1**kiNGh|O#GIJa{*G818ySm(vpicZVtps=|`HaSz6h>UKe!ET*
z5DMfXZ=}6ld_HZf%bq3Ul?0P@3rDMip9pR%z>+aD$l*ez9Cv7)TN!WO+j7iu>c}V2
z7pjdU*l5%6`7}W6>gnLFPEyH@zyKMa8
zjwh1=tUrxLUlY^S-pPrO2Io0W+rq4)-J|Is8~yC;b){#|@w#^EhE>NSatsu>c*P{t`Z+r0J!R~AU^@&K
zHvcQ7W7-TFH0-Wm*6O0rNSG4Ig8K&Z^9DLeom|?4K(@b&%}3&$k*p&u%k+zcVq#A@TTe94jnt#h
zrfV@xw-IG$#pqOKw+fuIa^DljJdD7}JOEG!O!yo{x4yBm66>l`*0*K5
z(wC~c58N?fsNzM>hG}=V79tPR66mWeAD$CE^L4w@qwJXYMbN(B*^p9C-{918?E3K3
z9%-1ctU0$dcOPO@e9|{vb`YdPI?u!&GOdkyNf`b5QnDi;Kox0H7(G4jdGhwSUT=jw
zwc|**eCxn?94~Yh=HAk9C1|qTiqZdS9-?s|M(!ohZb1D%^9p^!@HV3Fkzf$bhd-Dy
zp`#EI0GXIpEl{S?sUqES?URnPpq6VRWeVKG`|TO8*Q#HZ#n9kSDL15Lt|c7&P^md4
zp~)tacYvYNLYg=3W=wxgb36E4V${}-04ue`6b&0J#%(WscZKeaM{gvVuPn2Eo6|jkTt)bIFezf}_rAkDI
z(T4w|-ui_II$#+ueTk^)rkUlaJ|o~j_2mnD6f9l1i^h8;-2e3re=4jCBgfZ#KgHmB
zo~-inaB6ptmr^Qq+L%0ZsK`SNY%V-KQyVAW)2;ApAo5Na-p}U|Cc#_#arh7%Y?li}
z_CJ}2gji}?YjfcFa2_YRQRlMZ(tDHev!XJB7)Pvj5@O)N1nRqcBY0N4lWN+%Io@=3
zhkAOu8~H*oz@4e&ZXn)ZgYom55``ZVa@Sh&s8p2?NA^^G>j#l^fqTmUK~K})V>D6H
zdnZH)m}}ZApI?hMU)deIrCck`2;cp=kfooz8PfzM7gS_@7*6+e&3MVP0=tyZCY?+h
z-}u=NoD8{&kqN^5m767qJIw_~K4_4cg{ObFA?)E*
z3ca4p32R~{QD59K_qd+T*Yi!r=;@V}XWsU@qL!9edq)+CN&n=Z5YH}Dwy*I84~6wY
zuyxKS0}g|8mOBmY4PyoDVmD@hzMQN&5-ft1y%+fWWH0CAHT2WO+D3^Y_2H;A>csJU
zCd2V~5Jm*9x?WyT#cCA3T}W8u0LExvgB0vf7V{%>#-yFSEP!tee+?K3_8b&=W*z8a
zEV$0xf9S{_>}$nVK8{|1%Ep3rd=3v04v0N6i`M!v0+J=GW;&j{y$@3!A8<>
zUX4TW)0{Gx4sN%esTe=-Y276IScS9Bn%ZH?SU0@BE9Sz
z_CTeY$(cYL1tlNai|Y*o&+qbT2UExdIrnnb!KCE|NCOPdk=?;cW4W~mmF?%~r7*|v
zsFF0>_2sT)#jW;^P{wYO3gi?+_D?IuElfFoO@C61hEbaeUb$m+S-!Xz5)a~2jx+Dz
ziW8tT{&YgLo5eg?iczl2rpi?gRepwm!iTfF*eK@mAW+;y6myC(tS=|>bQAlAoF&bk
z;r004WjsH#LSc1&GAHGGqCZ~WHyh+0zdoAiG;7s!C|NP9FccvFDxz^6w2&2glq9ub
z$t>=gae8U$CNd)I1;J}nt8EImh4Np5
zOl*|s9S(B5$Qd`<%-${)S;S8ZTHEg!(=#PhxtI6G1zhjcZJvCFr{COMZN!{j;7z9qQNrZlfZ!r_~Jm!R8~H@M;&v8=i1JXNRz
zaTI1@@EjGki(|EhxPrnS+L3V?+5{6jlud82bD9V=wC=12fp&9xIx#B|Phf3CaZx7N
zP>vAB(IGSS_+*xhc2b8SbDF+Lpzn{WR*3eSYVY|Hrj3MRl6vO%iwQRc^<$xgKV;;e
zJQ+WMb)7|u)i?xvEA?%g+sZw?21Ob{t{$5=N;5{|Hgm_71$GMxPiifR_9(fV_iB=)1@yI3s3qdaw=O10|RzXNO^rw;?-^9
zmu@NeVNEtGHBuZM%i`f4X+n*w5y%ZfkbR#^ey
zq8eiCpil-H2qA9xSqPTk@w{5jTtE0|4M2uddT_<`!}m1HV@zmGviXl=8S7c@Fh;}v
z!f@L&lV*1Y7Fvm9@)0@v|f8FcafKbV&ITM
z)xQ5OnrnM4x9{fb%*)2rw_dxy|BSvw;;KK<5@YFPL(}n}=}DP6JK;`$n>Fk+3oZGp
z#fp|w;+u8xW`s$$ABvZr5|jA#%u7RcM`hDUjMHbAfUT@NwJYu;8Bkq
zSE*#}uoncMeR~^Yo>;5Jj%tl~XNLgh4;UfI)4q~{N&+_~hRLsV8O4<$$#PN)%nrmY
z4ftNKDz#T9Y;}%(z;1U^lb%tP7wKGthLu02ETJODG>TSIzpTdvZcOW=vY%AO{KW4`
z57*Zh&06Y4&)57G;lj@g;bv_NiZ_3SpBGkXa8VYK#<`pzH*r)&=$@??=ZmS>F3OFb
z{u-|mitT+T304@O(XrX>Y%{ed%bItA58At+A*9|MgoA6DyhkXK@e$AWz(CwP?MkHX
zk(EdRUl|hMN$G>f@$S#Bm0ns-=QVyGmJ&Kf+USpDg|zlx`PFTKYdK`tB0^~XX!I=+
z{#I6-N&uxuZ6vVV9}0uwW(Dnz6%7PuJT%bejEvMXC3e&mi9T$Ndy3*u
z7AyAN#p<(Mt5j+vw&bf2V^7O~5VKDP94dhwMAH{eh@hb`k7v{4d%O0wbYBdw!auIJ
zu-Ulj$u$^IP}Ba%ZkvTctfd=FLOSAKJPIY{7!j$#F}7mEt8trUx-iYM`&v0|0UdFd$@xJ
z?q`mf>&%Uof4d)$4Vq|%dn;Qt+yj4eJP|7>^4=bNSHAu(Z&~y
z4MO`qA_m+c1NY%-MB70nj+es!s!LpRovx`U_Qt35Vep}!#H!SREf8EK+`g5!YYnh}aUY~|?ualVj_M_ia)qH^{Jia5L@-J8X^sQhkW?}I;Icn&;q
zMpp!#H1bou(tcTOiXTU%R!9yztM_Q)J--q?f7tH-ev(E2Ezu-1g+^a7|s?HpEv
zJ-SxMlEVD7#&PTpl>l)J5`gFV)ivZk-RVaHUS|e2!3Ke>De8qX=+mj!@%F>c11c9!
zJwnpjTVU3J1+w_Ch^y@g(`R{o4LcG=uNi2djC`RX^D^^I4K_uzk=&C{-(wd5Xgar$
zO<&~ZJkidLD(B-Ay%V>|vD9jN)G7lxeO#O-{AJVRgN(=pbb^U-X%){F;_h_}pg0DphH
z9W!d!fBprD&xgMv%-v@TH%O3J{J;v~z&7)<;`6M;-c)ycEE{vhZ^W16jir<=mw|bF
zexZ!wwHg!2iN*916%tx+A}fCl7HJG@7?W!839dCN0SAYdq)w)ED*>==5tNzHu
zFuu-14H+vjZ``gGIcp4pv>m3oVNJG30`Kstk@d@t!7ti1+_WYWJMIcjKf@$oer+o~
zr`$r;Kiy%8sv1b>uMWhM)C?GtIlD=ke=^1!h;Lf86tp9nS;m<(WU#p9!IRpvcJl2!
zkoe~DW|MkJ^wYfwqc>2T6e||6CdUj8;A@zt~nvQxZ6W=A`B4%&<
zIdy}l9^HH(v0t
z_+6bOl)(lx{G%Uuk0gF_bmWuooe}ywx|h>Wjvnu%sc7!g7w%hqP?tFNLW{^gw@&eD
zVV824#f97NVuR-xR$7_5$^s~WarPOSNvFxSfC#a5N2?bBQ^)ls?*Shnh=m9qbkvGBj!%E1w%=2!2G~Ya8d-@gD=cbnA*Kz
zgPYwC{1;d?W2p`wp0OyN^|
zdc5{BGwD8etRtw8RrBOUQOgN}+0NKoELFHX)A;R3J?_MrF^po~-h`*C?H)$;?AJyA
z(<_220(?U{>A=5`1`Ykk-G+5hqaKR3BPmVJG0XG8r}uqi;BgquJVzj&
zY^6_IfB>>S@jzgQ@BU8u2zS72>{fo-0d|iScafRbP*=uwy|5;yt`n~E>VB7)+VP3x|IZkJ@ukMx3|6a~=
zD}yX#C$7X4rvXe5TYORChkjG(XAl(a}M{rdM5mot%p3ki+O#
ze}Cys5eIfowVN@g;+XkFz2wDr7F_05YSK^NzOcfGvOcyae{vD)_4U5%lnr&UE$qwMu64bIPFG-qm2;QUPB!O|c*ReGu+>gDR%5UcT(Y
zzBu>|o`vPon?SU&09e0~7hJzx^6~k>55tV>UZ!`}kFnUZ(6lmG
z_R}q~a=(eifSoD2WZjwgdM;;0Nia;5h5K05QdgxY>57q}VVzz-f;$n{-*DCVq1bgY
z^V59i8<@@QRU=cfG?zm52qtAo(CBWQ(BN`az3}n$>}Z9D0ww;GUNq6z^i4`2cvX_}
zXLj{!cA18nGW8_E3;Te?L)E7B7a473+J`BV5|z91Gyd&k{u(h!0nG;wYIO?Y+Uyrq
zR8~e*wSx(I=lGAam``MxRVW<$PwOW0Hemy=JAwDcZ)mo7UOh7(%*c=K)$=|UkNoWh
zoldrMMtZTRI~A!xalKh65~sv1+^M1KVU3R&n++NF^tD?aBuAw?TuaP
zcFl}y;(K)}Bh|MYT`NOk^DvKkl-<<6N`|OGx@)-xN-1!E3E%mkfRx|xBL7V-j=B$U
zX%b)r92lqg`LuS0(zgWW?6dvAbI6-6Q}BV4{7J1JluoGIF-r4m*3D-K@jkiLmrMFj
zJTz>5-w+A*sY(1GJTSje0GlOpyH|W@No!8)?tkd}HFd+2mo!6FuHdyk^{N>6Gi*5U
z0^5OIX+dC($CK|uqo3~`8ZNj5asf=2nwxtX)uV7=E`?csQYi6Xo}quo+(5~7I%Er>
zhQowMCMmYrW`Vv@9k56;uIJM_nblIr@>L
zTj*$@Z98yH>{TrP;RZnsWHG8PlM`k>A_7e)o72R+oc`!9-50k|YmoD($6}LCG})
z{OJ>DU0syj5UKr}ePfOW;d*iH>49q!be?&uf@b^ux^~I^po3ZXzrld|vpuPHZpQ5*_jr1W7x}0}gGHLXtB?Sz;us-z#FfOM!b_
zlr@K-{nMBUaoyxNIQ!KMLxR(j<1gSP3}-NJQh@rh`RO64UA*Ggb;0t_EyE%eb2HBw
zV>-Z|^ayMiSk!uE$Olq?edMLd+Qnx=hiS+&d*zcUvGC|6*SuUo^fS)mO*KpsW;L(+
z%O0YC$|q*_T02X_26cUyFzE?}s@rs1Mn_ilc8{foCCx2E>YMr#m(gP&>s$(#8r`PO
z)v~L_o1Q+7-fRaEwuD+baZR|PjG4`n)p9+&m;6Vs(dyc`ii5IhiSDTvnv(`sW;O1_
z_--((Ppy{qEUGv$wW^lC_FH^BK*=CPH4WNnt-T`Prm8nm8;t{43%W%;I6S78Dn1f`
z0(D052DR6Awrc5#A3$Xub64h;JZ-y?Dp=5P%K^fm+ID`(mNrY$z@L4oynTxj{5m0d
zaa(bA&JT}Q%={@#FHs0j+sboHZpPDAO-X!av0Cf#Ys{gvNL~_594P4A`oOVQ&kmiI
z-J3{3-l#qJX3=HnN^f5Zc5ZYge0;jXMhE0v=PiKp^E)E-m8Jrmb7iPtH`y=4
zaipv(yiyj@y!DBl*DSmUe;eTWVe28ERv)(m+H5!d2Fjryb7%muFg()(5v@T
zVKI$QsaEOgNBd^rf$ZVD0v{yvad{cJo4mx&nFQ8jgHcI#rYFL%pP^gw%)(u1htU{za<*
z<*emB8TRnOFONqv0v!sv&C0)Q>6xK=%oHc7gWW%@cXd0`8g~Kw{8A)0S7NR*FS=p-
z?y>5A0tUEeR{VyKBMqN;>89Gd7n#U7&7lV}1}Pc>DCm#?Qr!2W-=`DlbTdB5$L=yO
zm|5&BvLe}QSM9}3)6jjlkab&yk`eL!=hT)vP2-%mmR_%HGR7*uYNp!unKk|9d+$`s
zpI`4Ejp{Xr5U*y=mJM>?u@n#H8_lqU&ByJTuO2rREDH)7G+t!~iTl~fVVO0%ZEuw~
zb|dBZv0Lm`uDJO()W_?yT6uHL?BwYQHtg3O-nJN>`1JWPP^#iVI-h;%7D(iN%5tO(
zd=k4_f4buGkR~kGzes7(<|M#7r9
zrsTwgd5Y9lpHLPMd2x)-9XFju_YRC2F(a_IN=yCC66YwHIKb1J)id;ThJMf){^Z#(
zUN98r?wB7CtfGmb9FP;YB|Ezivu~$W2Ngbc)bszchnfo;Z^caSVZ!y8S$YD}11NvH
z_2Q2&cD%>&uVaknaLM}BLE134sRei5sh2D!XmV21!0$zKPM9>E;R$7IG4J-mUE(xn
zd5cb!Bp5qYUy|g#cr}%kl@Xp}2UP_wSnto+CH9DMMlKa@>mF|Hq)I9E9UfWxCk3Y8
z6ISv*+b2C0%yS8-aHmg7)9#qk6aN(7Yk0RUZpvx4lOy6x+7Cm(DIbe@g_CY<;na6m
zkBbjlc&;sR$V~X1h&ulg
z*fyQ{f-r3=m$_mv);~X-J!>uQ88J#>bmMNa$~qoq*izb2ELKdV(`u_5`(p#0d$P{f
z?&>!FaEO^~AqsN~B4aGx1AS@*&Pt$ln%Eczflzu2zF9<+*LzykdVAWOMWV1|dD`1$
zQqT2iogiY*y@?#XSs=6hVh91N?F{5rDmCA1`St}p>*7&YHbasUCKhJtWf1|nY7YBV
z7J_$hP|e*483!T~u-2kFgoHInrkHpX-r+LYq?PpJRDO?=R%OKZwdUZL=90N8)$!7)
z5~gO4qlMC3FBctdL#S@j4qq%!)JE^C&iZ5?otG$Flthv~@jDcFPab+(k@>z8-xrjE
zjzu=&7vxD-R9d|XMu4f-q;LaorelkqG2WiEu&ns(F#WWq{0&ku
z;Sq%8moeNleekrm=f!qIpwEi%GVZ|bt78F0lJ_d-%OAe!Aa6Wpm0*Z~X^+X2D{b!|OZ*lFW
zocQw`;;*`IW__%GfHaL@y%<5;OimX6lf-e`YHS4C&>e3Z$a5p)5F>q!LK(5;X~#fz
zE#z#0(30hVsp}-#?8e}xczU%*)e~>>&3$K496u(^aTKg4R&ERR^OXzG%-R-J<;XEZ
zRh{jjSByymVNVr6q~`fEwC981WPxwwm(RnCcw
zGYwC!=!{W}51VY(z#YUbDX+7TxuE?5FNW=;NZ!>{3xRW3-!3QftcE0ud?7U37C^j3
zyy!Y9Guif8mQ#G@sCY-OFNp_@P*QG9ssfFkev7-UDWVF|W6CPoZjn4lU}7l%4X>!M
zHa66;J<3tI=*;Dkf8wa1!+)gRT15+DZivvERx3e0pa@Cx&GQW`>lYoT(U)T_lV!T)
z7nv(uxO1JN*fMX->>{FUb}*pna(Hbc=%T?GrNOtOS!xHi?E3+8+8-GXeGTBX*qE^#
z;(0eQG-V7g3+B}-Eo&0HZd`R<1L75UO;2g@Rva0?tYRUeA|Mg$k(%yPQI)63F<@O%!{h}-a0KuZ476Lt>8`GTE}Is5+)vn3j{<|GQgJ^
z0hy!CL;7s+y1>W1T~SZ+{j8LVn$2M!#fsY-yb#{I*kmxrcj+cg+J<7bw`1z2l7nMy
z&uWeIw#{`q`SlXb*9rKo`nq~}#SitjpX!L4>9iC_Kh_OK1>fl|j5Dcg)FW;NJf&7k
zZ(Bg8HLF2U^y6*%u}#NdI|bb`B6saasRbeR#h-Qa9RM^+H5xCEeAfNEQyMZ`!y`A2
zVx}nVsq%}cU4+Oyu
zFVQ_Voyui6nJIc=jkfn|8J|
zk+p7DV$Fh)io>{i050LRA!cJ+9vOOmR878wIAT
zC2N0DrJ0`%FCqc+@^t!u`
z>gr?5w%9Xyt-x2b#!$)O=eL}GTJW`
z9P=>ea;%|cXiQX=SpQB%Z>2W{)KB0Wh#aj1~vLHfA2`~xTr?o#e@FI
z+j0+?8zzpQ%UO%R>P>Ulw`qAlf!w_-DdZ*qQQkfnkKUn>9Aa~Xz*|Ycr7ABdf=5ZI
z@cI22N!QM;pGtA?tJ{ZwYax1Bxx222`t?S>npsI0u|xNF?Hmh(NPq(EzU`W*r&vNmYzj%LNQk*hnQPY=%8JW9I4*Lrq#Gy$neWwPE}DVv#ErURQPf
zK&WF^SiR6$$jIV;aiB<5#;D>JAwGbI@&=z=q{s0NDu8Fzs>{2ba2Xj!%OP2J7)Dvb
zLyb2~%w{AkqG83UrAzX&{l{+o0ZTqoNci`8&kwDX4xD*o%buQqmyr7kSncKP^H27+
z-kYem4_wNx_B5MGC!VTGUn@#t3oh|5(u5~!+fT|0?duGt86}N7C~s$d71~Nz>Ef^S
z4YyanB}IE9BS~^akvVPj8tuDem_3>_;z_TGDTAKSNzhBLR;rZ^%czpI!Dd8NrT$u|
z6jN-0b(%A+z{I*-$P;iR>+tQLl(*JUVMuZ(9f?4(fA5ubjPM=2D1!i@_#06D3$6bB
zWw-dkLb;x8bYMY*Oi!CxFJ?p`?Ze&R>|dR&Z@(kdkunM^S%!CL)T&7uO6;a;zjnxo
zNyPJG@(sWx?=m_Z_!D9p@3DDo>c4O=Ic#I?722zq{qcg(fkDSXuJVS5V>$`)7&38f
zXx80JT$W)1|D2%B45FDJ$Le*yr|JUheVCN6mZ-jxNYfb5q&
zA`{pV{+1RF%D)6h)xb;%mL8HI2N+N1jDhape
zR%f!Yu*Qh2Vpo#$lsFE&*DfaPn<2ru}&keMYY!E=C+fw9A1=oDo#
z|AUbK-QK?d#7&o#jWte3jc}|Qx;SBA;2_7E1)P&~Id9MN+)O$RY=8VF;=dBR%mxr`
zw4^T|wAccFCYAO)^zC2$+He2n^Ay-78;!guj14f*bZB<
zK3#eo{M$nRPjSExa?f!Pp(b`wy#{#54k=>!3$OX#@mrn&M(-6IbnZqJZ#9|z(n5dR
zUJwUhOsdbWKWS+IjLC~v<<7s+_;2>}i0k>nt~Vy*%@>c^FPua;u8+xSi*VWdcm7hV
z|Fxb8GVMpWtC!vahfUXgoTNek!slyd*8QdC{)7L)2R8sUA)&TQq}0Fz72nuD@9Z0(
zRqJ5Z`3m3|?O(LR{^kJxman-opssTqssPeT$Jy|>-^B6Pf7K7f;>WhiY9w}mNco8V
z@vOnxB!K-tNq-o?4_LzHy0zOstsUeDn3;*Vi02Oou(WBq*h$o1Z{gpI_!t5Ep59kP
zncM{yZ&S`v{inrcZk=zXm0kGT5*Zbqb0Tg0zY6)wBlG}PX+TQyh!0r%-rcdk29n>l
zrw?eQ_S@6jL?wW~8`fvD|FfBS0LSY$(4-+uy|5s7h2S3znDyK%ik=s!nE^|m`1;Z_
z{?pp?hJXc6s9$B;|1I49C!zRlr+;**Ia*d6`VcqdM+eBH!A*0Gnox?)$GnF|$Q6Hw
z-f!B?9$A+-pxC?nx3bCxtfA`R??M78AspAB$tfWr=K{4bhwdIgT$_^%G6Ix2BVqCz
z<3;K3<|ZAVpi#|X`KoZ${$#kRPxNx~*r!bJu^ROF#F3qgYkJQwmRJXC_9LB(EzE?e
zmI4-2Klex}T70FDtp0n%-)gxMFdu{4|5MpVB7*Wzcrns)C!LQtME+Ictjv1k6SAxv^(flc=!wj!BHHi;cz55HydT7pkWTU0BA@&!VoUs&8>mNi@P1b2o
z4_h_mu0Q!7u>A3<0x%QDl<+qs`am96yYiHqXomgc;BLJSoG8;r5rA@1atR}L6vm{k
zwX{(lfBJz)&zY8+dra!e=TRL(E-#wyuJ_7T!dsOujw%+wjZ5k}HZX|WGiLWxo*
z=nTF-dBaerI)5ZU{pjp#p-BX}bKeeb?Ctb-)ua&6da6!g+X80AUqG&GU9fm=%yA-&
z(71Y6?{uq@Dz*ePm6QAAmrz2S3~Ga%O~msV>n(jsyt
zS4Vi}EbSe!8qHsu*T*`*4eiCznoI*ul4VB~D=6X$sT
zoRJwHSgZfW)t`g@%sX7Eemtu+u^(67)!|Hi(?5e~W1>dHZZRE}E?#$KI>a$AyQ^Y?
z52uq==Bq%_h^SEs(5pRhYnwD`16|$}{Pvg=p(4%wx53sN0PNl#nHCGc>BD4;D1zBZ
z9x>yY`C^B`O@hI*#MEC;__$9e6saeTt~2AyW_el*=3-?`qr0pNRKCcnkp^NTh>)Lo
zhZ`!bjOP?{Rcw9?DKeXtq7HNfXN7FuIL%e5`AG|rJe;E|k%FT;WV0+kMRkfo1|q%j
z3Xh9ek46OHLx|_jNcVP`l-*r&vF!xY`zR9KWpuN*(?qCvP<%y)J>g%Y+pru^ut~0@
zyx@ERJbajZ5E3Lus2&Dy^=?j_*OOMA4)N7ZZ%Ac`yCob3}GMKNjg
zma2t#Kwn_~rCbn=hX2y5b-y9#aI-USn9WCrzw;TQ1i%6}FZ|vD=k1OlJI4XPXh=VU
z5{P`6%FuIsxUuMvz!Q_$wgBq2IfY!8tFa-x>|ZUyh@#h7gZE=18uuq6JNR%>3U;*k
z;;NAhfAz<8uKbM%*lBu
z8!#3gW(S;_lQh+as_Xd!ZC>qPU%c~MpN#o_p;(RPjqSl41kX|${~ZG%fX0>L}fW(Je076)7)?C#w;+%6CEc68_9~U3b
z-?3X?QK&TMZyViovU1iFrKa3Z$-ll`K(HnQFY*?MiTPM0U-Z}Q0C
zNkBj)R78wG$oIOLutBBtB`C09`zJ?lu16;*Up6;U=vRZj08VEDTZZ6kwVk7x0zc2y
zQYC#*%GS!^D6i{8Wsl_B>YwjAL1R7k_uP9!AVbjs<8NOs!r&ddnD=Gr%ir~oNkBZW
zqrC$uxZ{lv-2Fv2oNYj}ed@DN&LiwTIri)5=&y?0f5p<4Y#>>czZ-tr{Jg#`zP?PQ
zR2szmh4wmaH%p8(rwd6@SV3+tSE3054I*qB~Ttw>|htlHxRDo192-Summ#M(#M1
zz8VL~3P}Ko@)fx|5icMy2GW-d%OQFL%zHawnMziloVajf-b$OdPjK=PIiYaf&Dxi$
z^nYho!ARoaJ2;)QO20WAi}h4Fuk~@y*xvL;?Qqp=E&GX;d-fA`iHrf?77*pHsob6b
z8z+_DkYTMP^!*4igaVM6k6B1X%SbaLcKkjtMcFAzLM$QZ&W%rz1Yf7bb>$3aM||qb
zi~ZW#g_n{TE`>%9jbrKPpKu|?Udo^#7E2NJ^%E**8
z;i$L48xyAfqp^AQvm(knuuabGwPF2%k%3bqtWS$Io!_g%GL-N_`DVd;iaTFsy~OQ%
zXxv9CAZnPXi(G
zh#{+8J0?~*CbnFcbi?QY6AO!2a=4d&p)`o$>tRpx{dU8~1=J6Nfe6#pq|)i-jjZ~f
z4mG2npx#MJan$;aP6ovp3ZE~4>0IXgAnp_`agF5A__)5{fqx8A649V!i!RUpaW|sQ50z5#?klp>|H(L5Hi%6MUq(?$H
zCf^a0z3rwD_a2s*_(m6)X;oG6_w?cHpD*eCkk^los-eUCpV*ccu&DRg=ybx$HnXvn
z_K}PvuKYPJ^yb(HgHkf*)j)B$aS)^Ps%yz0y8l;vZCytcGqd;I#H+5n*uWWzhC)C(
z5u9(!{+Rp!DbKNIpKsj7pzG)2u`H>#qZmX!g8O{+-K(nG^F6u+dzVwdFdn@_xIUs*
zjBiWW%hdu&&~CN3QtFOXo9KpuACFb$Q3>J#@XMn7+aw?%T&?h<>fO3KiUuBA)l6PJ
z|EL)fR&$dUy#>_C)wHFvvL@MZ%yxWd!3^xjE2C4y$4TRIc0gFgg=V`cTwyqIIa
zb*<;oIUHPEMj2q=aFA0CjYi3?sNomK@v^iwGjV|}Ty2iL!QXlHe^QdID@Q!IfV~tt
z`O|U$1BDzBL|Rcr!Wpqsg0S1kr)WZY_wD6;YdmOM$)Le0guH3*Y$?1~psL(qFZ4c6
z5>+DQj(JyLdA*Tg@w-L34*
zOtdxgQ9Cg^v4!rW;`6QNPLPcB(!X9f+iv|(+<9fi@r?|OVw5&;w47O6uyE!#t$OCt
z=omNSH=$-B4z}(0odadwK_Q}O@pJclf&1w9T
zo&Mq5APpk_8+cQxjIZ8RkV@)9d-ie((Z1NCGNmKzFI$i01$&KN8ZA`(33}t*Nmkof(+p#GUmxk|55Bv)
zEDBegw?pAJB*kDJc2Q>4(w_AN*Lne_c0y-yf-1H(?&5d5qVl^BBL2F>{`Y=!p+V(s
zNDI-ZMAsGmkCpY5$-?TAL!J(zu2YcIF_OxS=3tiM7Xz?4e>&Ld3SfHX}9M`P@ijV7aHP()k0kEMSh0P|Kh4Nyfkp3Q+
z+GbJ~e$5imSkHQ$d{bHrH6yk6c>R^9sG{+#KA?66+YqULBsB1JyE;b@1BqW0F*>eq8owb37%>><=dS
zCo2eo69X1nW?ZXqLh;p9NJz+PyoPkRG9c|!b$$Jp=QdJkLFiIjb>8dh4#TO;KwZq~
z98atHbJM`X`}X5CTdRoyKR~~VFMtjsToW3F^;~&%k03p37F%!RrB!o6(Y>=*86g85
z4ah(Y+qSxe7rcVZNkgi#U>ySF?;;Ox>=rA|=FH@2`SC}NZvq`}XjPeuf9CE)RP~e0
zzpZ-Ce{gn=jXEQFPn2#veCRy${2XSrA-ZFGe6%;{RN-*SWHiIWZe>_>BI%+_CC;Vf
zjZIb&nHk{LrdL$^+Q#+02{xVA8$am0FO?qJh}gQeHu6iG&
z6x4mNuj*&L$S^i{(dtLxCI>IXaK_+yD{2y(Z`WGcaQUdHlT+VU(B*sB&JL6Guc1K-
zGcReBpNG_yD}iV?PXH>jc-Z80PA^)nIW{Rye7&fb7X=NWL{w?V21x
zY~;6RPO)A&R-OGO!-cYvP|MMKVkht0bJQp6_i1}1k=rj0c#j3K?(=)N=CWz|01EqtoALcBK6smOI7x%p4N
z9Mp1~02vBDA%_E?x7RYtWj&Aqd%-0MSMZ{LeL9v6g6y$AHvksuA={Js$Ax6%iTqjc
zJP8*sQ*^yyN$$ezgA-V2aqPWGXPn!Jy5Z*INEwMz|a?*ulzl@SBVMOxy2
zUX_OkC<4@o`JD61fu6%jza-mVbvXaS)e{hDa?2d0sRSSn^MJ%lupm+P*x0;m-g}Wx^^fELT-sm8aV$QDh>FyvEb)E#CHNR7L-?@-oQT@`FBb
z%_|?1T#F)5$w{R?3;js}?A`mvMVL%WxXi0xfd+8a7)B&GA
zzPRE%T>M&Vn&2L?@wA#z|1v(Mw>p1O80ko?xaxEg!|GOi5R
zK1m?#zR3agA9E&Fc|xAusY;KS8keb2UCN_5=ZIc(h{5Hu%;D@3W}={sQ4E
zKn#o2FD?-H0XBKqbT>+dhv)2yjP<$8nuBkJdZ}Mp6VXSE=R)hpUbZxNdj>TN@U~qlyA|4%@)<_
z#IMZ=gUcT_iA4a#J^;2deu?(FbX*48yb18PsD36%Z(ul}T$L--<+eH1yz1TF|JN<@BLuZEH+xT4
zqc!cvgOhD|Uj@`wQ&3M_aZtDreBPrgx%xZOC+LFN6Ph5E#6MYQGi?RUAz+bk)nKoA
zB(zpoNPM#exYa}c0)Z{SWTn5#r6qa-ti^YUXh!hkd%-Mu`R`S)dO_TLd~v>Bj>@pd
zwH(62?WZ>nsQ&1q7YMEZ`^$LhkE$D#4`-JR0zQGzit>SlEt8M=BhPCD$aBKXMTP!(
zFx9NH+p96TN-mf2Zyaxe$0
zd7NCX&+iJy#u`h`4?hP-2}K{x?KS$7D7Fo|MJ@_NDYmcvNmQKY
z^5$yx7Cf>4U_1=|^4Uwl_4RJE_+o$e0as=s_ee%uaz^@XlSa?c9y)-$N_^{*P!2!6
zy>)8j(xiULWK7y6{rX+OmdEBgcL~HdFWd*F56`i$y&h?7k@78PPf@fn@X7dBg(Q&^A{)fBi#fgSIHrUA2pYN?jZuu(vE>P;2wn*r&fpQ&O`Gei>
zLIJod5JEPhW%Q8gkjr(Ig!A5WX*6}>KHo|gmoy46NsG~vhSSH8Ft~&FZf9lycXhrr
z`)lYjyc6qB#zfD&*>X)`K<_2sCxI2@7YHbU2Cc8#@LE;lxj-bP4=4yYo~H#jKT8D>Y>=#j!WnOnl^p>N70gkaWPuAl1
zps8dD;I4)|+#51@2uJmkiZ>X^CL!?wM*Su{v=qW-f183Oc|?O306sCpUkY;>iYs4L8Y|Yx
zt_p;^ec;2{r{K1SJ=m#8v_HY`h=b9)m;~uV^6hbvD^H`+g&K_}kD&K=MevX3qK!_E
z>`#@}yB?0set%oOQLugC;T14CkfAes<2^ZeY~Y}Z=RkLxX$}gbC7dWWkP~R0*Fdbs
zNa8<_hjg(O@k+=x0Ri!ME^%ZGz`La=z&2y?%ed;7b0`RCN8M-b{_DNU%Wcul;}?;B
z9W#9OG3j^PFPRk0VjamtlljfK;R0s%>v;2W4eMR3S>6F8lViVFSiY(_iKV~!qUPR`
zc-$+0I#R}|j&V1G%XMEh4JY|GS@TF9M9ZWCMv}k&O?c}YfU2DRNvYS|R9beDpI3uc
z&%SD}2%gB7t@*k9aN$2iiyr&$;J)5|)l``>d+a!KmGQXw)oMBOrw#AzjoT1ku02yz
zSUOF#xM2o(U9A-166Q@Zy9s$S1%~6J4^UX!*Jtemwc=n6$#tLC*x8t+4T5A9bx;zB
zyf$#40wM1|1JD*{b7v211|4Q%jS4`0gD*x-1YVxrU9&tJl-zo>*|jSQ)WY5j^-gn7
z0lsg7aNhBfad8x{JDppT*gPOJi+AvKshj~sW2)4z5T=h26~G_57=rus6+-kEbUDBG;n9%1O
zxAje933x2(`L1S4z@$1e1zaY_&8o#*A
z{Am!@#zo2te;in3jUoahAkU`leM-UfI_z1%yo>#FxM@f(Tg*FM@yM{~nts4R
zhsoMq*fsD|A;LJZHOAP_e6iU9nnI_gRr7kMKW>s4F;Z@}+(|GBhnh2e4S5sD`cWOg
z)%6F{ks{o{gR({bH6k7k;Mhi*ns)@74>M|<$Bd)JPTWTDTheYaroN{E>od)@jAJm%
z5NruBa*6zoUHobGMBK5DCkkX+ZmJuSE$+Qd8d6mm?KFOIj;+!A!&H7Hi|^zudKHGZ
zraJgwZjEjLvT{3zW^*TADXOOF^4B=rX*XMpUglK06&mfPEAG?RW;wQcK2I>jcwm|3
zy^UzE9Jpbc_(%U*=bRrO)YxVWT#h*&yprd
zpmPKIKDGEN<5{e@*~w@Bk{Ub2-ICikD8RVy5>qv=(~R9)*ERE0Z1VE&2q{H*3A%KG
zO539qbgwGTy#?q-wUomprw(u)3;Pem207aau!KFup6j;Y5G*TK`6u
zeZVT}kg2ieei4^ABy|e`6U~Q`h3Q-{ZgOQ259Y0X{F?svk!4txH8v}=Sq`)53VyFT
zmHUeA^=Sx~9Kd89P1mXM(tGNh4K_N2p=i!NIp4w;4~$+Lq@44%ovHJGAwvv~!7IK=
z11Wv6*shuv6@|3PSu$yV5~vl-cVo&0&DTWB_?{!kYLoB=5%9oCm0WzyO{t}5SM(;i
zgQ9e~LA^4f-kCd!VKg477!hTNOt1lWBj&oDB)&a1J
zpzTycFW*NcNH3>LEaj-gR6f)HzWMMkRPew1v1@Q3vUj6$0Mw4GK^#NccleXy^rVx2
zT=Dy$Jy15fVa22!E?6sAUx=
zp#i0`AP^Y#P!q^le83r>*pxN+$s^OC;`&$P>s;MU$I{B>8H!<`^$pq5VlJT)k?AqU
ztNmM(wrxls3`KziiR@|DW18UU>{
z+py->nt%nzk0=z3JZo9s)mzm%)9^yg-6=8=HxnWZ{NuFKIIJNvPv$FcXw#*(1`vvULV*|TX^53Gkuew<_=ojr9E
zuMi4T4}n7_N@BVZ+q)DN;;A|xB{rwPy@{uSNe@en-aWBDz3DtVyrsYGv)}p0%sFU+
zcVYUONuYobNy(vB9
zdHJ7*G#g01G9bwY)4iDEbv|BtO@T)i7-CiTC#{`sJ&s7~X(E+Ni(M?Km`KeTRRJ+j7NZ~EVVXR4bbS5d=I=d{s)8LTN-Ota
zenT3nOL6#%d4*pmHKh-pXh9SoH-~v+q7r#&W%inL!K#j^^3m}79
zUz17l88L@XpS@1HqX&9^*XpckK(Y8$KPWWQ3!QzStALbv+TiI>9uU|*PvE}yL9(|N
z?$a$)T0&NM*%5mqPUc=AnUAe?!8hyO15
zSRSF7Wd$U8s2zFUJZa>5mI#o=-Ah;nRTmfawOR2_jU+Xrx+E-==gX6+UodJ#fI#6qvqQF@K^8iI{pl-?uKYY+&5kc4Mtmvhc`
zbD#HqKRnMDe-T3dYt5Q9<+^4jL&||>_}69ustu;AMj2WA3cnkL)EH*8HJc#vLc2Tk*C>X(
z#aoNE0D*$@QoAzk+Bmx4PH|7PIq~a2FPZFr#8IR=i;aXofS9RdQyGLc+sL;~S1{cGSoJHhd4bR0}_Ld0>%C90x#RoHvt=I3vtubGLe`*mfHnTS0EufP!z6Q*-0
zuVJ1#Y-x(sR)TY`+SL@cHK!AS=Ov0cFuOLgaW4J!Ict**OtSaJbT`iEtL~i|G^C`>j_+Zl!kAqRU;paQ#
zZSKaLlPHwo4#-bX4nfwSt|_PE7hd;Ow4TyMlNn-hM9fF`TMeLbZpt!Zy_A3$BV6#+
zuWafcSzWXjy7UZ*&e2`AxE>XMDZM3I7?b0x9FU{=li^=O>)b6dyh4DM^bS
zH9qdOoC7rK1~-Xmf7&$cphjQR;5V3th>oNQJWhvHqLpzR>_|+aKWLi4j;**RR;^rr
zK@(_u(=BoUZq$0p+Q79k>rKh^O!ASedhcj73*M@JtEN`~F&i9-yfXR0@x%kuDkm2|
z{`XCc_p98ei~}n7K}x$O2Vpv!LfPH&lYt1jjm%M?D`u4Z3AJYRjkRAuXdm-G5Gi=C
z*ESLO7?~O`RU2Ejk%Gi>(ApTLU=o5fe2PlwPU+YVMJGsCIZAO~(7jWch6L7R?Bv9K
zm_wswhK#opKOm$hBORD0oL@}`Vp-GMp3-;ePnvr
zdD)u-jbqW{fC!qMW%PHLb}E*E(mQ^;o7?k5wFx&L`kt-%XGF50OwOR?#9R?FOHKxX
zefc1uPbM!BkOP)oy@QYYkBT(h(9JF_N|b?`OY(Y9!Q6n%taX2-%YW1ULuCHd7J}W<
z8+}f^rEsqy#UFl(-Bg?mnw-KPQ3%SAcM%qbYO)K%`K6RuBU_umyXy`0$Ol
zE#~#OlMgLl6xT>Cq6xEuk|;VhMK;Ib(lTPCe2P$3%iR-%OD1QXCZsN`)T9o2A#mdf
z8^cB7YRG9F@(ZP|DlTq{BUz{MsyXhyo6
zI!Lp!x_=VryQ79te%cQ6!%_D1;jzH=cSNK$Sb>@h>%nBtz9w@a-&I)IJ%nF+|VNMhSbhzhxFSM?nY*qeBWd-F?
z0Ggw%4`QUA=T&kUlY*X1cyrU}h3EG=fjhTD*Ghw*c|6rPrNEi1VDb!E6B(c&ho8M8
zd_s1iYpUFR!KH5J`MAoYc@g;!HI55HzIAowK1*=7xy+QDJ9#^s1D05sYLD%&Mj?5H
z>qVhcf|4iL8E8B)&-FQF0)J$UX_3&h=ak68u)z(ZcmwCXwyFg=&;_%l4l4E8ch$m*+6`E@wS!Cgj}S@2op}YsUDa
z>jm`l7^hulPtM%F@}GBjq|C8qbxIEuGhBO|dA;x#=cCY!A{R1(C*sff-fOUF%7JbE
zk0i+L*Py&1H(&+o{*kkuZAzCt=~3S7tW{`WddJ4F&k6V0v|1)=Xn3#zSBdeiV`J-Z
z2RgRRG9$dSy(tQl^{H@`9fv-L~P-K+8H*7t;Y{lY0QJVN|VPPO*P
z_SIYKnFh@H*9eOYv)HiJ2EK~v`|zqXINKva6`&A2QOwimSE!-3IM#zG0L?lcb^TWS
za^lhCk@j|??5=^lw#sf1I(^bqC!cMrn1eQeI2vFDitg_GQPbAAjaW1@u5$>VOGCCu
zunXf$y2^SDpPCC<<9GcZ_fFk%zVFKitL13ze8aF&_&cFjXOni#K_~IZNKx!<_3s4OAc+7=PtW!&6Y%#WJ@fLKo~B6+Qvt-V#XkOvSy7<*nnc
za<)173mxybeg_s$F?h0k>oKRi*9gDA|FHAd@_U7PntXZAw6u8PDhCtfjAS|!s$qt@
z4(&b!+n?uQlGXSuef!G|J4ToXBOv%?HgMm>px+)!W%Y8*HCEtmH~$Drh)d`Yf+M*(
zpv0;R&{f^duK`)YO-YRp1@US7YxwuyZ*1PSwX`e7c3r*@QN1MA{@)<#n8>R?h9>KBom3fO({S1rKb
zeic*$2nmENbbBfUJV+$t4`i!ZaEdeDS!3vc?@1jo^f1DqMj1WhILaI}u%&bkU%Qhw}M`
zq(IlTr~g|2VH;!M`aZQ`6w=Mz2=+8#09fvBsdW~&|1s~7x
zvjB733i+S!oO;joJ$=L5`)#<3-Wjsvl$-8s#bIg4h=-(IFpMDb6!sHGK&)u8_zx%i
zr;M!01t|;<2zQ;6bq)w&$3ZoqD7e%_sdu3-L7$6eai5Tg+{^Zqv)BpRwqv
zJ-P0p1MwrgZAhJ{P`mXpNO;_cyw?56m)uat}nnt+foEO0}&
zZn=*($GzctF1$eO6FNOR;QC%f3Xh~@s{^K8SnZG7-^@$CoWJl9@H}v>?q~RlDc(=n
z=MU8&eG`Q_QPUc9%tY$th@jF+J|@nn`=mNr(WX85B>aGT#LMv7dAGXV;(j6X3=;Zw
zndU#yH|EPR4S6?3CS|HbSyBr(y!wYqa$(D@?#TF`dhCe;mTF1Q%LSv-a9vxQV-4<=
zUyU(bVqp;yzaiuc!)Uw`;U0S%}yiOFWCxXGJI
z95pJkp^Na_87TgCSp7aspE{pA(|di48?!Q`Wx!&`LPl|!3e>719)4ykx7yQ?!VbjF
zcExH(1yKgIT~s`^hgQqz9Cw!+{Mc_C+hUlRun1pNbet``ZU240J!$C-uq3o>{+Ta`(r{HZSf^Q*B7e
z^(%(04^m`tWdmjF*l@4Al?I{D;<)jeR6_9=zuUk_N!QGCPhN)nHcB!VcGiGHtt;na
za!|;9-D!*uG#Y7|aSwzYA&)-|&Uil$NteLZ;MGa1$KUawJH_rw(NIaED>MGm0!9k(
z{08yPpw>P#qc>j99}`z!$hxQXkc6`OTU?68K)sWt6_POP&BL8$@D>Ta!HizKdk!ktlX
zYj`lAxETO^aErxsvq2W7`W?Bqp}_uzGAFmxZ(-l(YFaIe_jVegL{HE@=q9(Vs1K9h
zx0#N7yB}QRgkrBZ8aXSNLOE1+%Zcey(S|W)Td5!D(Uf5GI0mx<4YhnqN!JhaVR+JX
ziB@ClyMd&`JMXvvAEQe#7rryTw@+MfpQ}`ofxgC~V-Fg!WnM-u<=(`?DBt}nitOzi`SAuH(E0lu(KC_jA~h$QI?Sf;i!-+$0nV#8tY>(zWm-t6aS
zcFw<@>`FMVZlm}SW#!P%OkTsHRR}x
z8#1N0eLSz+nR08
zhs;I{k-yw`f9E~rDNqIW8a>|`Gbc3nX5HMnW5o1=`4!L=LeMfByl-V^61_1zV()pv
zqa4&;xO{JG%Aah;MGr*$Fsu{c@qs3
zY5e|nDbn#>{*mF;I&AKPzWryGmEXN5xW#9o9MDto{M-ytYAq2l?3493>R*6*4?^G+
z0+0q*dvRr77cv6Nz2eFP!`x6?2RuT<#TAWP!y`*R(`ZRr=)kKLZ`vZr_~f3y7CP2y
zSw21StNcnRLM*iJPP`GfPWZTZefp0n(@=E;&tZ5JDSG
z!_T4V<%Q#G2r@W3k?E55wR94`AX=!i>&QI2+$y&)H~)LU2x1(X
z$?>8V&~$8|cC$zggMH%?n%HoB#Lh0qBCmU9NNx9g;tO)BT}|MqT*W(l4zoZpydclJ
zY(J)$`H;Mc7TSH*CF7cb9R7zRt8X_`x!sbOFE&;*TOTxXSUR5snQp>%&%@~>ZnETjk8YhGM7xwgfyQv$vZ*01II&J5cn0^}5
zm-k0kh-U44(YRfNE%URm7@2IsT^%g!HN-s(7Q3oK4P~6sD50t)jR5-+t2BJrdd*0u
zu)Orvo$59qjBrnE4T=Qm!`PR0qkCRjXyaVWEgxO*&91n5ZD^m7_2i10x>`e`5yDmi
z^kV*D1s^C@8*^+oDNos^+KJ!6FcM83zGEN{1VeT({Z3-chpD3#sa{1drJCWrC<&!?
zj?HaL6>a+F0UB7Xmq&End_t>ts(e2EHQp;k;RMLJ6OJEZxsH%CfsDE2&3RX@sLQZQ
zDkuhEpeIKPW?W*moK1N<6TKQi0=^Pr{4SE}1_>>>#2}zkPDn2a6ibkDcC`g~NYw+J;cEHTdNt?p6(z3-U`aswt+0Am~(_w8Y`Jl1j
zcRvoxrmE$~3s3O7z2^}K28Ca@$PL6)+$t_ma^XGWVmlaazX0#Nb-&=uArK8G9e}R-
ze~V##mq$6lNMyfp>0TwO|Bc5~FuByAa-rel%9%gYQR-9R+L0osLtuh`p+Vb~LH-{h
zU)sL)rd!-iUwJ|v@x<^LDEKv{_P9X@tYH76K31_q4l9ToNHF5cJ!*1l#z#iGo$IJ)
zn%9_8sCa%G7M&Iqq9b!9*;mW-#luF^1?_`9OiJ=^Q;}tn^8dk#AB2nh^kR3YcnmX5
zm_WrKwS90JlKMdoU?)k44oN7#q749S>HDiG#_wKpz_cjYdw!OfJn6LN??zJK;SLgC
zN3Vgu*6e?2J960Z#)C|?fQ&VPcUOTPhjkhsiDlp-F
z8_b8-yd)aW{T-YOoI6baFa##*IS`2bjinQ#dgSYLP)}7Ra*j)<1cZ61b_V*~)NKvE
zr$mFfy5iGs;c^c@LK3@VClxrK14Op-(1v8#D}ap|c7@k4+)fDE|Aewq|9X=AB>0&$
zg}MY4j}Fi?SgrnHW4gXOf(r)G77gA4h##DuFPf|N4zL;KTZ*m>S4fbQ`JsT=zel*X
zlO~-dTwBWqg_*8ncO{NuNF6bu{E?-Hf!5ie=|eIHe=S163{()+DxXnkP6uz771iL5
zq5(hA&+q3uOn*3l3J|Wm4*Spx5pMikjo?i}yRG#{rO0@HbbBj%6ewgbH_u3c=(sHVf=&RTK~3wOmCg9aE5_UX
zr|Ys06q0b?eNe`RG*OBF$OW5?z=NBTwT{gw0fBL72`XunfDJnk?AgGi&w`WCEXw!a
zaO|RQ2;Z}M=L%O;O<3#ouU)Iw_l>)S^RcW#_;woBeeWyE1|6iJY(^<2F@+n~JLEcI
zXW|Z;@HX@MwWC+y4I1YpopegW0A;86Algi7QFRYD&M`Z}uJ#;fGsM*}4Yz1A9oD+K
zQW7SMKIEoqk=kK|H3Fz^2)%a&!v+-q-@{w<~8os)Yug
z2g#G9dNnfaBZ{;GPje=%KukAw6GyA95sbrBa;(6<8{2M+)btN5pVXgOE%?o6@x`~z
zz6$Yd$HWMMq>+y2NYiQ;#<}Q}Shi)Tx_ZGA?5A7CWp42U1?G2bdXojyq$_F9LmD@R
zoz$uL-NcR;A>Ny9*-$Crw9EUvBk`6AtY^0RNei{4x4tk$u%>p7DrJu2+cG2{M(eykN
zl@{A)jx5Z0Ndq;Q1ciUG$n6GIhrzBymIEpCamr%(=xLYP9y2f~BsqiB;J{3wM*AWQ
z6gtm9clL}rC`SMdYk1ZAA7-=J861O4$|+p1Lal=FZc$GFk-%VEb<_voCS#|*0zj*{
zxbQ6-(%SX-$X@5ITb!g(d5%XxXIQovUSf*NlvSVz+gm?MZ%c1a+?Waqz6d)J5fIV(
zdBGk`b4zK7?fojt{r&mI@ap{sML{iWMazqeMWyHMF@taBeo%HWIrD)263MOkJ4m5W
z4fu>-TbSB!O^7Qgd5D4WCWXIwcWfJPZhS5?IS+;nnrK%3bC^K^2~WkG_$o(UMtKp9H^?!_
zKmV1eJ&MY|d!Nv^3mBAgh8GtBFV&~eOdu~f0S#}sEhOX#jHbOe`FRdmyDGh!vF@>j
zI14X}GK1=J(zK8BmerCQXoB@DW>_O$(BRfwSA>lrnTv`SQT6)zKv^%C;!zcL3E(Eb
zxJ?ldQh2s2f2E^%M+FL54c~(?(U)}jgh_#d+ZbzQE5$v~$D_Lhdt|M2ACV4{Bj2S_
z*0FCbW$AXUXJlm4;_09@PLq7g>pvz^S9OK~hYcp&n9uH}L!(;4&n2vs8^2%n0Hft<
zL21Tif*8eeQl$zm@9;gPmXkOtJ+(`Tw
z3+BEfXu|JP7IQ#%a`31xENvLc$T9;pYo!IB@TIqvqgvL4Nr(}ij|J19DqZQyD7|As
zuV%p7aNX~{tkVWcsUgci{&~b%Hky`_slB4Hg^`5=TlCH562YDj0vkiNz>Cb!BjLwh
zuC+`xlpV8t`S5s|**hv-ys+}O-#(pntgQ}eVc0HIwtQ)B`SP4)sqoN9IN67%7d538
zpf+o=j=jkeMQasaP^>%m!m0!&&3Hl1AGxy6XCGg8l8j2>2suO05em*Df4)>GVo)Gf
zcW8+Bs`3Wmod@DACp_;Q*)y%V^QoEhJ7YfoUW$Zfg;3#e+#7BA{U-{KT7>{7deF+Ul6{V^-{NDCOO5j
z3ejN?*H6GkALsDBRXwp9>efzaD`i_eH$zmyo`@^UGBWQIr+H8{3kPdv?+@>HiLdBw
zQ0`j%-qQy8vXZ-0bNu4-&UmDkhZlMZ0lvkFX=Lmg^*`lughEgYh~e>Pk0UUxQwl^c
z8jg4_2Cx!qBZW*N^*}Iw@S%HrJaQ&Siilf*Tcd*2{5HDIwAN3w9wf0cWa-9vzM8vS
zq_b4nOUoh>lR?1W_1!JwpBuP(Al%9pQ0uWa_J!kJ%qMQ*zEzSW+Ocl0rM*9ciZ+mwOED@C=TF4VbLxU#aQCHt
zL>+C6>s>Y|#SfBCB#g~pG=uPfxyg8mz4|c8HU+
z4RW1~VmU)Wc+NFOXYgAVEwjkBVsb%L?Bcut6mwrSQd&Au+}^+n?J0>@bZMAj*A=^u
zNHB2_7gO>)*7nMldJ0wmHP-FKa`Zu{xazRnk_j<2YV9-MAN2`c2$QhCIH
zt-(*fT((YMbEJi^Q5W_m1nkruY}uyrJl(pxpQ^&+?WXQlR7!zniiHXt`1cQ%6X}ob
zuhlsl})g{W-x;^fFf-nb#mb&>!opn`z~vQ*qjpffC7C
z{c+01kG}`$V;E)ZJ^)>0HuK1xctqhK0F}7RDd(5KIp2dX
zSup=J@-GASZ~br6II@=#e|C;b$DCYK0IGds&uMS}0I~YApAfn(0=jtBv+J`F<}S#Y
z-p!HN-j4YcC!R!YX`wQ$F>;fko_)V2hzd1CZ*^JBgh*W5W0^~2F&8*rigdX|jxBzf
z*ik&{o*G@JF|U>C5pVYR=ct&~#@I`x$~m~y$wZ$BN1gCHh)NGb=d`QS52c_VYxOPF
zFE|CC0f*9d>uOg5pAP+I%@m6QZ4X=Zq+nuPFGdd1a{MsE!xf?S}xPRf&XQygd?e*%NV@($lJxZEz)~w0`v~
z!t3Y7CkE2Qy-!Qq&4dB0V|XAJ^vUCOoSkw%RFyPOqW`xs3UsU?4Cl*6V-*F2YX{FZeydd
zjp8r5<9bD|mMCvGpabG?X20=1AHE-8t&JP}ihrrS4iJe!6tXqV!^TQ*zOq3jjj;cT4$67p^D_fh5$HLK7Ljq`
zrkCA`6E}B1x97j7V%xr#cz36zpie0!x~{aszX~tAw$PgQin)5B;GTiJ$1u8I3;DK#
z3wqw6?yS>mU_PrCKZ-jaW@UlP0;bLD92cEJ=DR-@GEbwL
){7Za5ttOx+)tFNJJ*fDXK<0q>6I#Pf81k9PX5otU3HBLPcynMQ
zf_x3k;#oLzqoB!sLg4yt+0-KgUyQUJ5&=fAX5XGx
zZK{ewhBx|!Aq=QEp{CY3N&JU7?jVIJa7ez4IkHr|*&np3Tm1;}DX(LNw4rRw4CV)%z_Yrm-*p{7^vp6%z^?}{YRWTQiafGeL$hgg
z2g2(HeZMa4*7Y*4^NsE&CEM9TyU~}irJEOFwt-^&oPmQ^V*BJ$7Vw2~o@agzZ?WtK
zEQ>>jIW_})_XZ_rza&Cp6@^Zo$bLCA^GJo8za3&UW-H-}>2uqi#LCfRSBto=47m!=
zx)Mt1xPya8A(rT`QR<%xm3b2!@@B0rEjgH)kC(V@B)w_mX{|cF{K7((BEWg75stX_
z)nr~Uy2zq*%f~z#S)Xw=k8rQ&rgfYVHjJ93bC0p5y_u}j|Dw-)@#wprACva`!gJ;A
zdPg^n;w7`Tr7ezM=8I}(oanc*q6Z8Hds+B-1l609n@@AV%#r=%EqK@QE?+{q0Kf$GHuSJs$
zQ#2orFFBBZ62<^NdFNlZ?Qeno5ehKe1}_|WzKT;v7>Mm$CnO-Z^wkTA{#*2ujx4N!
zBQP=;4qO9`WO3+PHzN~UaYx-OJOU@Xni+r?`09$>3gkR(JnRmvbY-swak(PUAG<7I
zshx3Y*euYZYRA`LUy*3YB$=j|c^Q0u`FmaJLpACM`BS_#qe5mA^|c&4+jTsT?mLf7
zcyBz1OJzEeoR&p+^POG>VV|~qkMDf@hvTclvI!Pr$Wm_Tuvq}p-lw=up>j7HpfN2Z
zXO^~Blob?z!mv+2&&hB`M2)Dbf^~RV#QnQHw~)3SW^LZtm)^vN#j3TlE)YBJ%sHtN
z3s;uIQ0}df7(MeM{eB0n<%#K^$VTPBfDgN`u9SLawV_PlM+i!sNxTYP?(4@7hUN?r$)!Po1cRFKIlW{vrSaM%dGCJM}wFo-m=itkbG~r?^EO1mj{Or)|{H+&x=8zkmwWAi`Zky`P
z_lJ@0c5PwT;U|%Kj&!#(?{Y9)%23ejKq;xF@}L{BZ_VVEF7It*9kkK)yTnRm1g`7e
z`{oP%(ZI?X%ElD7IOH&pEA49tdC6Uk-8bq4Yok};^itfAbh4B|&M_h7S=V6Uv!9&R
zfzBqFdGXO59)cYOm-i%tJvliO4=I}dKAkm(z{+pFFR+{9K1qDJx|hXfU651%TqkgU
z?R4D&QEk>6`iAR(*n1g`J6BY4u|Lmnz6(WD%Bwj{4L&OEGR3DLz*NnOjvxIWZpnZ6
zN?2|ja#$-(MDXKwn-YDLx%U{TJgef}bV4si9cTA5%Ow)8k3Q)SpIzX;kajtbrW`eh=G@KCGErP3J>s$`g@ZaUVRvxbbTAJJ2Vtm;#eq)3
z1Tot~)=S&|{D{%)N=UiY=49X1ibp44gynJ!!%{iwI;^Jq`alS;(WHPF{Lui6;BbBb
zQh%W`trFN~4=D#DcyGk0yXA_H^Y#*#x%S!Rc!(QDwy*lbxjyS6uD3ggvWeYHk5OCN
z1&l}0ErG)vw$4Qc9Pu+H|FjH~5!04`!Vasp#=aih=Hogpy~Q!}1~bNTSl9pc_Ih-|
zq^e*T-Z^{lVR6ZApf<0HdQyczBJfwVHef<5RL`epVaw=>FKtE7L2uaU#SF(3rF)pa
zbyXxX%PZ%*ITI3pJ}bIRG>n@Vr6!2wDH5Mhx2tZ{*t-X$VUd!`T_T)HMaN
z^b%&Q>mHAtIKXn#PikK$Oyh`XU|wN&n*x(Bn^cbYyAB!{#xO?8-}2kJFMaLqB&unD
z^_<-&iHz*PwKCWDQ`otY>Eo^M)WsqGav&%R$NRw3^tcZCW$8P+v~5CL91R=hODiEIF!o@pTJUv^4a)C7C^0h0O8P1tDnn
z;`GDUJ@mrIXaW$O#PQn=h0xueso4B#yaDLp+{ok*C{BL#(po}p&jH4tkvOsaept@}
z_zSAZC$V$^W%!^HCkS90Pq~-SSW&78(g$@oDE1{}*GT(DUF`xGA$8=G7
zl_iA9Sto~6mO7qWxT)*}p$L2lZvgJOf*7y_V%!=EoQ&WFpV^t`3Yt^{_lU`iJD&?;
zazfE&r<<%hP;Gfumg&zVzLX0?V|mJnk8-}i6FY9pvo;K6e&%=Vzub7b&U*s$8)x5e
zM3*PE!Ims9Cj`2Z7PM&K=H8)M)A8aH{dU%!K_41|EGKZU%)+r*ElC5e10!qsh82Ws
zTb|vmnDo*0ry;LrJBpzE6>>@3vI*-VMI|_Mh=Q7mbRN^7#z5h9Nt6{g1l3{V5GB=zQ9V_OlIZc3=N~ugMNmRh;a(~KiTG+*fD&ul*a5CE@k>|OgeGIj
z%DM80=BhbYPScdEcdzht*-s-x{UEWDR~d`b?Uu@LwaoQgN18#EX3(r#J7?Fv!<)y&I?dt=tBA;D-%v%eNK}_w1W|*yEiOZ|Kpno`2iMXk7giqA)^;
z;4yF`OSx7gBUip+ExT^S9ud3ynC%}5lNv;vdNB3Gex<)?V^XCfQ2=HT-yFOXY@|M@
zVap9Q;MdUbzKL279&utON2cZTpG<0$_LDrNxv^lK(
zZ34==RK70QmveTosAq3*p(P(1_at0H$_o1aMLcr(X7Y!kXFV8+0zMV$eSx&Wy3ZOk
zEWHEvrf*$2zqsFfmEBXEt%YqM45j!+H`(*7x^-gcJPP`0Q*3d`_OUD?_ust68>9(d
zbxz+a>TUK+i(L8fuvb!}l8;)iVvUEjXkW)u>n4$EY1DFQgtw>~uXzq?yTjti^%vIu
zR~A!E(f1^e!JsAbLVC>=uhY)KxZ^y|?3=@wH1z>2UmDkH-e-|O+kvENX;YTHapR{0
zp$gW(a|?AQ4w*)Qq>Pd!O+fMj%%lS%s`Aae*XLC26l2M2WOS*&i{KhPf-@bzh77x0
z_fs*_ewf>vNtDKj){xsg>eY}$hF~`j^fe*JH+kqlC))}=+km)QKMNPF+~1B88F%G0
zzs_-aN~&23QAtH0jydwA8=Ys`EBXQ#fH*%s#~asepB>**KQSSS+$?mh!Q^gE9X~jk
zQ{ctr)?L%LX;dTcy>0|^Pnbz~pS&sAJvLi8Y4;C9;h@0jOtYZ#87@7vTqvV5FC3?1
zVq?i(N;RpK7a&rN4nVmdpa^k;@zN{9HyP_X1IGt`i>EQa2z7j(9>Ep$3dHD4d^C!j
zvcQD;8OA+RC?T0pktAG@$Ece*WVxEoxO?BY$>jS>gQUHrO5|=tsA}4Arw+(g@H6RP
zfH_r%Bl*|piAr(V@i`6ZMn+=`G^!xGd9-aT6@OnZk;;IOE#+^dR$BiV?x3VLQ{RI4
z;D<^~t3he-LF7qM=PHx2XMFrD7*7(j;!?}IW&A0(5#I}yizfM2^bm7jp|+mK%G1)e
z;cRhecb$q#PXc$~%n+wb<70mwkylazY2Lg$?9RVtjS3j5IL5t{>pzToKStms_AB?j
ziKUV4ZomCx4}<<>L&J7=Y#~^cN2e7JV7Tn3Lzo-i(#i_DzCWH^5D;Qv!(J+
z$I54S_;Xgu{Qb~N?oW#1cSg^*u5jQi?arUQ+mPys9w~@i!-*u>BNsF<7bGGozvZYC
z>UnI=fq8onag{3O@lx!&`2{c^T))?5d@u~(E!JDSAGY~x7^>q>p2Q7(jf&5Y_GYW9
zxm>sO!2We?#m;EsDOA