commit 77c16ab4a2a30f73f668877b2771311d8b8b8449 Author: 谢宇宁 Date: Tue Sep 15 15:25:05 2026 +0700 初始化 diff --git a/.cursor/rules/commit-standards.mdc b/.cursor/rules/commit-standards.mdc new file mode 100644 index 0000000..0e91fca --- /dev/null +++ b/.cursor/rules/commit-standards.mdc @@ -0,0 +1,12 @@ +--- +description: 用户要求 git commit、提交代码、写 commit message 或创建提交时,必须先加载 commit-convention skill 并严格遵守 +alwaysApply: false +--- + +# Git 提交规范自动激活 + +当用户要求**提交代码**、**git commit**、**写提交说明**或执行提交流程时: + +1. 必须先加载 `.cursor/skills/commit-convention/SKILL.md`。 +2. subject **必须**以 `[Ai]` 或 `[Human]` 开头:Agent 编写的变更用 `[Ai]`,用户手写且仅代提交用 `[Human]`;提交前须结合 diff 与对话上下文判定,并写清业务变更,禁止敷衍 subject。 +3. 未获用户明确授权不得 commit;不得提交 `.env` 等含密钥文件;默认不 push。 diff --git a/.cursor/rules/frontend-standards.mdc b/.cursor/rules/frontend-standards.mdc new file mode 100644 index 0000000..6565c4b --- /dev/null +++ b/.cursor/rules/frontend-standards.mdc @@ -0,0 +1,21 @@ +--- +description: 在改动 Vue/hook/service/store/views/components 时,自动加载 frontend-project-standards skill 并按其规范输出 +globs: src/**/*.vue,src/views/**/*.ts,src/hooks/**/*.ts,src/service/**/*.ts,src/stores/**/*.ts,src/components/**/*.{vue,ts} +alwaysApply: false +--- + +# 前端规范自动激活 + +本仓库改动 Vue / hooks / service / store / views / components 范围的代码时: + +1. 必须先加载 `.cursor/skills/frontend-project-standards/SKILL.md`,并严格遵守其中的"强制规则"。 +2. 命名细则参考 `.cursor/skills/frontend-project-standards/naming-conventions.md`。 +3. 代码模板参考 `.cursor/skills/frontend-project-standards/reference.md`。 +4. 用户使用 `@fps:new` / `@fps:refactor` / `@fps:api` / `@fps:fix` / `@fps:review` / `@fps:hook` 时,按 `prompt-templates.md` 对应模板执行。 +5. 输出必须包含:分层说明、hooks 变更、API 变更与类型、错误覆盖、维护性收益、PR 自检结果。 + +不得绕过 `src/utils/request.ts` 直接 axios,不得在 `.vue` / hook 中直接发请求,不得在新增代码中引入宽泛 `any`。 + +**禁止过度设计**:默认走最小可行实现,命中 `SKILL.md` 的 `### 0.1) 反过度设计` 任一信号即必须回退方案;任何抽象/拆分动作都需要在输出里说明对应的复用或复杂度信号。 + +**完工必须做闭环校验**:按 `SKILL.md` 的 `## 完工闭环校验` 执行,**只校验本次改动文件**,不扫全仓、不修历史问题。最终输出附"闭环校验结果"区块(已校验文件清单 + 5 类校验项 + 未通过项的文件:行号)。Agent 必须对改动文件调用 `ReadLints` 确认 0 新增报错。 diff --git a/.cursor/skills/commit-convention/SKILL.md b/.cursor/skills/commit-convention/SKILL.md new file mode 100644 index 0000000..9cc82de --- /dev/null +++ b/.cursor/skills/commit-convention/SKILL.md @@ -0,0 +1,124 @@ +--- +name: commit-convention +description: 为本仓库生成符合团队规范的 Git 提交信息,并在用户要求提交代码时执行完整提交流程。用于 git commit、提交代码、写 commit message、创建提交、push 前整理提交等场景;须根据变更来源选用 [Ai] 或 [Human] 标记并写清业务变更。 +--- + +# Git 提交规范(Agent 协助提交) + +## 触发条件 + +满足任一条件,**必须先加载本 skill**,再执行 `git add` / `git commit`: + +- 用户明确要求:提交、commit、git commit、保存提交、push 前先 commit 等 +- 用户规则中的「committing-changes-with-git」流程已启动 + +**未获用户明确授权时,不得执行 commit。** + +--- + +## 提交来源标记(强制) + +所有由 Agent 代为执行的 `git commit`,subject **必须**以 `[Ai]` 或 `[Human]` 开头(二选一,不得省略)。 + +```text +[Ai] (): +[Human] (): + + +``` + +- `type`:`feat` | `fix` | `refactor` | `style` | `perf` | `chore` | `docs` | `test` | `build` | `ci` +- `scope`:模块/页面,如 `benefits`、`mine`、`community`、`player` +- 仅当标记为 `[Ai]` 时,可在正文末尾追加 trailer(可选): + +```text +Co-Authored-By: Cursor +``` + +### 如何判定用 `[Ai]` 还是 `[Human]` + +在撰写 message **之前**,结合 `git diff` 与**当前对话上下文**判断本次待提交变更的**主要作者**: + +| 标记 | 适用场景 | +|------|----------| +| **`[Ai]`** | 本次待提交 diff 中的逻辑/样式/配置变更,**主要由当前或近期 Agent 会话编写或修改**;或用户未说明来源且 diff 与对话中 Agent 已完成的实现一致 | +| **`[Human]`** | 变更**主要由用户本人编写**(用户仅让 Agent 代写 commit message、执行 add/commit);或用户明确说「人工提交」「我自己改的」「帮我提交一下(我改的)」等 | + +**判定步骤(按序执行):** + +1. 用户是否**明确**要求 `[Human]` / 人工提交?→ 是则用 `[Human]`(除非 diff 明显全是 Agent 刚写的,此时先向用户确认) +2. 当前对话里,Agent 是否**为实现用户需求**而修改了待提交文件?→ 是则用 `[Ai]` +3. 待提交文件是否**未出现在**本对话的 Agent 编辑记录中,且用户只是要求「提交一下」?→ 用 `[Human]` +4. **同一批 staged 变更**中既有 Agent 编写又有用户手写:优先**询问是否拆分**为两次提交;若用户坚持一次提交,以**改动行数/核心逻辑**更多的一方为准,并在 body 中简要说明混合来源 +5. **无法判断**时:默认 `[Ai]`,并在执行 commit 前**用一句话向用户说明**所选标记及理由;若用户纠正,改用 `[Human]` 后重新 commit(hook 失败则新建 commit,勿 amend 除非符合 user rule) + +**禁止:** + +- 用户明确是人工改动时,仍标 `[Ai]` +- 用户未授权时,将 Agent 刚写完的代码标 `[Human]` + +--- + +## Subject 质量(强制) + +提交说明必须让人一眼看懂**改了什么业务**或**修了什么问题**。 + +### 必须做到 + +1. 先并行执行:`git status`、`git diff`(含 staged)、`git log -5 --oneline` 了解风格与变更范围 +2. **完成上一节来源判定**,选定 `[Ai]` 或 `[Human]` +3. subject 用**完整语义**描述,优先中文;可中英混用 scope +4. 多文件、多模块时:一条 commit 只包同一业务目标;若混杂无关改动,先询问是否拆分 +5. body 写:原因、用户可见变化、风险点(如有);混合来源时在 body 注明 + +### 严禁(subject 不得仅为或等同于) + +`test`、`修改`、`update`、`fix`、`xxx`、`111`、`wip`、`temp`、`提交`、`save`、纯标点、纯数字、单字 + +### 示例 + +```text +# ✅ Agent 实现的功能 +[Ai] feat(benefits): 新增七日签到弹窗与连续签到奖励展示 +[Ai] fix(player): 修复横屏切换后 HLS 首帧黑屏 + +# ✅ 用户手写,Agent 仅代提交 +[Human] style(home): 调整首页 Header 搜索框间距与图标尺寸 +[Human] fix(lazyImg): 修复弱网下占位图闪烁 + +# ❌ +feat(benefits): 新增签到弹窗 # 缺少来源标记 +[Ai] fix: 修改 +修改播放器 +111 +``` + +--- + +## 提交流程(与 user rule 对齐) + +1. `git status` + `git diff` + `git log`(可并行) +2. **判定** `[Ai]` / `[Human]`(见上表) +3. 根据 diff **撰写**符合本规范的 message(HEREDOC 传 `-m`) +4. 只 `git add` 与本次任务相关的文件 +5. **不得**提交 `.env`、密钥、凭据类文件;若用户在 staged 中含此类文件,警告并排除 +6. `git commit` 后 `git status` 确认成功 +7. hook 失败时:**不要** `commit --amend`,修 message 后**新建 commit** +8. **除非用户明确要求,否则不 `git push`** + +--- + +## 输出给用户 + +提交完成后简要说明: + +- **来源标记**:`[Ai]` 或 `[Human]`,以及一行判定理由 +- commit hash(若有) +- 本次纳入的文件范围 +- message 摘要(一行) + +--- + +## 与本地 Hook / CI 的关系 + +本 skill 约束 **Agent 行为**。若仓库后续接入 `husky` + `commitlint` 或 CI,以仓库脚本校验为准;Agent 仍须预先满足 `[Ai]`/`[Human]` 与 subject 质量,避免 hook 拒绝。 diff --git a/.cursor/skills/frontend-project-standards/SKILL.md b/.cursor/skills/frontend-project-standards/SKILL.md new file mode 100644 index 0000000..181a383 --- /dev/null +++ b/.cursor/skills/frontend-project-standards/SKILL.md @@ -0,0 +1,258 @@ +--- +name: frontend-project-standards +description: 为当前仓库输出可维护的 Vue3 + TypeScript 前端代码规范,覆盖组件分层、hooks 抽离、service 接口封装、错误处理与命名规范。用于新功能开发、页面重构、接口改造、复杂逻辑拆分与可维护性治理场景。 +--- + +# 前端项目规范 + +## 适用范围 +本规范适用于以下所有变更: +- `src/views/**`:路由级页面容器及其私有 `components/`、`hooks/`。 +- `src/components/**`:跨模块复用组件,以及形如 `src/components//{components,hooks,types.ts,index.vue}` 的"组件即模块"容器(参考 `src/components/HomeHeader/`)。 +- `src/hooks/**`:全局/通用 composable。 +- `src/service/**`:接口封装层。 +- `src/stores/**`:Pinia store。 +- `src/utils/**`:纯工具函数(无状态、非 Vue 特定)。 + +需遵循的项目上下文: +- 技术栈:Vue 3 + TypeScript + Vite + Pinia + Vant。 +- 请求链路:`src/service/*.ts` -> `src/utils/request.ts` -> axios。`request` 实例除标准 `get/post/put/delete` 外还提供 `deletes`(form 形式 DELETE),不要新增同义包装。 +- 路径别名:从 `src` 导入时统一使用 `@/`。 + +## 触发条件 +满足任一条件,必须先加载并按本规范输出: +- 用户消息中出现:前端规范、规范、可维护性、重构、refactor、抽 hook、抽 composable、接口封装、service、错误处理、loading/error/empty、拆分大文件、整改、治理、frontend-project-standards、@fps、/fps。 +- 改动范围涉及 `*.vue`、`src/hooks/**`、`src/service/**`、`src/components/**`、`src/views/**`、`src/stores/**`,且包含结构、接口、状态、交互或业务逻辑调整。 +- 用户提供 PRD/Figma/截图要求"按本仓库结构落地"。 +- PR 自检、code review、规范审查类任务。 + +轻量豁免:仅改文案、样式数值、静态资源路径、纯 class 调整时,可只做最小变更并说明“不涉及分层/API/hook 调整”,无需强行套完整交付结构。 + +## 快捷指令 +团队可直接在对话中使用以下短指令触发对应工作流,每条都映射到 `prompt-templates.md` 的具体模板: + +| 指令 | 含义 | 对应模板 | +| --- | --- | --- | +| `@fps:new <页面/模块>` | 新页面或新模块开发(container + hooks + service 全套分层) | 模板 1 | +| `@fps:refactor <文件路径>` | 拆分大文件 / 抽 hook / 行为不变重构 | 模板 2 | +| `@fps:api <接口描述> -> <页面>` | 新增接口并接入页面(service typed 方法 + hook + view 三步) | 模板 3 | +| `@fps:fix <问题描述>` | 修 bug 同时做最小必要规范化 | 模板 4 | +| `@fps:review <文件/diff>` | 仅做规范审查,不大改代码 | 模板 5 | +| `@fps:hook <逻辑描述>` | 仅产出单一职责 hook(state/computed/actions) | 模板 1 子集 | + +调用约定: +- 任何指令默认带上"输出分层说明 + hooks 变更 + API 变更 + 错误覆盖 + 自检结果"五项交付。 +- 指令后可追加自由描述,越具体越好(目标文件、行为约束、是否允许重命名等)。 +- 不带任何指令时,按 `## 触发条件` 自动判定是否启用本规范。 +- 若某项交付不涉及,简短标注“不涉及”,不要为了满足格式新增无意义文件或抽象。 + +## 强制规则(必须遵守) + +### 0) 通用工程准则(最高优先级) +- 可维护性 > 短期省事;规则冲突时按 类型安全 > 分层正确性 > 局部简洁性 排序。 +- **不引入新依赖**:除非用户明确要求,否则不增加 npm/yarn 依赖、不替换现有库(axios/Pinia/Vant 不替换)。 +- **对齐项目结构**:所有新文件必须落入"适用范围"描述的目录形态,不另起新目录约定。 +- **优先复用既有逻辑**:动手前先在 `src/hooks`、`src/utils`、`src/service`、`src/stores` 检索可复用项;找到 ≥70% 匹配即扩展或参数化,不重复造轮。 +- **避免过度设计**:见 `### 0.1)`。 +- 历史代码受限暂时无法满足规则时,必须明确说明约束并给出分阶段改造计划。 + +### 0.1) 反过度设计(硬规则) +**默认顺序:先写最小可行实现(MVP),出现下方"复用/复杂度信号"再抽象。** + +判定信号(命中任一即"过度",必须回退到更简方案): +- 仅以“未来可能复用”为理由,为只有 1 个调用方的逻辑创建 hook / 工具 / 组件;至少出现 2 处调用、明确跨页面复用价值,或命中本规范的复杂度/职责边界阈值时再抽。 +- 为只有一种实参的"泛型/策略/工厂"提前预留扩展点(如未被使用的泛型参数、单实现的 strategy map)。 +- 引入空壳 wrapper:组件 / 函数 / 类除转发外不做事(可直接使用被包装对象)。 +- 配置爆炸:用 5+ 个布尔/枚举 props 控制一个组件多种形态,应拆为多个组件。 +- 未使用的导出:新增 export 在本次改动范围内无人调用。 +- 为不存在的需求设计接口字段、状态分支、loading 子态。 +- 自造已被现有依赖覆盖的能力(已用 Vant/Pinia/axios 拦截器/`@/utils/request` 时不再造轮)。 +- 抽象层数 ≥ 3(view -> hook -> hook -> service)且中间层无独立职责。 +- 单文件代码量小于 80 行却被拆成 3 个文件(除非命名/职责必要)。 +- 单一页面被拆成大量细碎展示组件,组件之间只是传递原样 props/slot,无法形成清晰职责边界。 + +输出要求: +- 涉及"是否抽象/拆分/泛化"的决策点,必须显式给一句话理由(命中哪条复用信号或复杂度阈值)。 +- 找不到理由时,默认走"内联实现 / 单文件 / 字面量参数"的最简路径。 +- 抽象阈值另见 `### 2) hooks 抽离` 中的硬性拆分触发条件,二者取严。 +- 页面私有 hook 因复杂副作用或业务域拆分而创建时,不要求跨页面复用;但必须具备独立职责,不能只是移动代码。 + +### 1) 组件分层 +- `src/views/**/index.vue` 作为页面容器,负责路由参数、hooks 组装、子组件编排。 +- 页面私有组件放在 `src/views/**/components/`。 +- 跨模块复用组件放在 `src/components/`。 +- 展示组件禁止直接调接口,避免承载重业务副作用。 +- 模板相关逻辑留在组件内,复杂业务分支和副作用迁移到 hooks。 +- 不为了“看起来分层”把一个页面拆成很多小组件。只有满足以下任一条件才拆组件: + - 该 UI 区块会复用,或未来已有明确复用场景; + - 区块模板/交互复杂,独立后能显著降低容器理解成本; + - 区块拥有清晰业务语义边界(如用户面板、订单卡片、筛选栏),而不是纯布局切片。 +- 仅用于排版、单次使用且逻辑简单的片段,优先留在当前组件内。 + +### 2) hooks 抽离 +- 满足任一条件必须抽离 hook: + - 同文件存在多个副作用块(`watch`、`watchEffect`、生命周期); + - 一个大 `setup` 中混合了业务状态和 UI 状态; + - 逻辑具备跨页面复用价值。 +- hook 命名统一为 `useXxx.ts`。 +- 放置规则: + - 全局/通用逻辑 -> `src/hooks/`; + - 模块专属逻辑 -> `src/views//hooks/`。 +- hook 输出保持最小且清晰:`state`、`computed`、`actions`。 +- 页面私有 hook 的价值来自“隔离副作用/业务域”,不来自文件数量;单纯把几行状态搬出去不算合格抽离。 +- hook 内必须清理定时器、监听器、订阅等资源。 +- 大文件硬性拆分触发条件(满足任一即拆): + - 非样式代码超过 350 行; + - 单文件含 4 个及以上 `watch/watchEffect/生命周期` 块; + - 单文件混合 3 个及以上业务域(如分页 + 权限 + 埋点)。 +- `src/views/**/utils/` 下的重业务文件优先迁移到 `src/views/**/hooks/`,工具函数保持纯函数化。 + +### 3) 接口封装 +- 禁止在 `.vue` 或 hooks 中直接调用 `axios`/`fetch`。 +- 接口新增或调整统一在 `src/service/*.ts` 中用 class static 方法实现,并保持项目现有风格。 +- 统一复用 `src/utils/request.ts` 的 `request.get/post/put/delete`。 +- 新增/修改的接口方法必须有入参和返回值类型(避免新增 `any`)。 +- URL 路径和参数组装留在 service 层,不放到视图/组件层。 +- 历史代码若仍有 `any`,本次改动不得继续扩散;应在改动范围内增量替换为明确类型。 + +### 4) 错误处理 +- 网络层与 HTTP 状态码处理继续由 `src/utils/request.ts` 统一兜底。 +- 业务异步动作仍需本地容错: + - `loading` 开关必须成对出现(`finally` 或等价方案); + - 失败时必须设置可预期兜底状态(`error`、空态、安全默认值); + - 仅在需要用户动作引导时显示用户提示。 +- 禁止吞错(`catch {}`)以及仅 `console` 不落状态。 +- 需要继续抛错时,必须保留明确原因与必要上下文。 +- 异步后会变更 UI 状态的动作,必须覆盖失败分支并防止状态不一致。 + +### 5) 类型纪律 +- view/hook/service 中禁止新增宽泛 `any`。 +- service 边界优先使用显式 `interface/type`。 +- 无法确认类型时优先 `unknown`,使用前做类型收窄。 +- 路由参数标准化要显式处理(例如 `String(route.query.id || '')`)。 + +### 6) 命名规范(对齐主流最佳实践) +- 目录名统一 `kebab-case`(如 `user-profile`)。 +- 非组件文件统一 `kebab-case`(如 `media-content.ts`、`use-xxx` 不使用,hook 文件仍保持 `useXxx.ts`)。 +- Vue 组件文件名使用 `PascalCase.vue`(如 `UserProfileCard.vue`);页面入口保持 `index.vue`。 +- class、type、interface、enum 名称使用 `PascalCase`。 +- 变量、函数、方法使用 `camelCase`;常量使用 `UPPER_SNAKE_CASE`。 +- 布尔变量必须带语义前缀:`is/has/can/should`(如 `isLoading`、`hasPaid`)。 +- 事件处理函数统一 `handleXxx`;计算属性使用业务语义命名,不使用无意义缩写。 +- 禁止拼音、无语义缩写、单字符命名(循环计数器 `i/j` 除外)。 + +### 7) 历史命名兼容策略(增量治理) +- 历史文件允许保留旧命名,不强制一次性全量重命名。 +- 任何新增文件、新增目录、以及被修改代码中的新增符号,必须遵循最新命名规范。 +- 若本次改动涉及重命名风险较高区域,可采用“行为不变优先”的分阶段治理:本次先保证增量合规,后续单独提交命名清理任务。 +- 禁止在新代码中复制旧命名反模式(即使同文件已有旧风格)。 + +## 交付输出要求 +完成编码任务时,输出中必须包含: +1. 分层说明:哪些留在 view/container,哪些在 component/hook/service。 +2. hooks 变更:新增或调整了哪些 hook、各自单一职责是什么。 +3. 接口变更:新增/修改的 service 方法及其类型定义。 +4. 错误覆盖:哪些异步路径已补齐失败兜底与状态恢复。 +5. 维护性收益:如何降低耦合,便于后续功能扩展。 +6. 自检结果:`reference.md` 中检查项的通过情况。 +7. **闭环校验结果**:按 `## 完工闭环校验` 给出逐项通过/未通过,未通过需附文件/行号。 + +若某项未发生变更,写“不涉及”即可;不要为了输出完整而新增 wrapper、空组件、空 hook 或空 service。 + +## 改造工作流 +按以下顺序执行: +1. 识别目标文件中的职责混杂点。 +2. 必要时拆分为 container + hooks + 展示组件;组件拆分以清晰职责边界为准,不以数量为目标。 +3. 将直接请求逻辑迁移到 service 层。 +4. 在 service 边界与 hook 状态处补强类型。 +5. 补齐 loading/error/empty 等状态保护。 +6. 执行自检清单并先修复不通过项。 +7. **执行 `## 完工闭环校验`**,仅针对本次改动文件。 +8. 最终确认无本规范违规项。 + +## 完工闭环校验(仅检查本次改动) +**强制收尾步骤**。范围严格限定在"本次新增/修改/重命名"的文件,**不扩到全仓**,不修复历史问题(除非用户明确要求)。 + +### 必执行动作(Agent) +- 对所有改动文件调用 `ReadLints`(一次性传入改动文件路径数组),确认无新增报错。 +- 若改动了 `*.vue` 内的 ` +``` + +## 4) 错误处理最低检查项 + +- 每个异步动作都具备成对的 loading 开关。 +- 请求失败时会落到确定性兜底状态。 +- 接口细节与类型由 service 层承载。 +- UI 层能展示空态/错误态,不允许静默失败。 + +## 5) 旧代码 any 的渐进迁移模式 + +```ts +// 改造前 +// static getMediaHot(data: any) { +// return request.get('/media/hot', data); +// } + +// 改造后(增量迁移) +export interface GetMediaHotParams { + pageNumber: number; + pageSize: number; + moduleId?: string; +} + +export interface GetMediaHotResp { + list: Types.Acg.MediaContentListItem[]; + total: number; +} + +static getMediaHot(data: GetMediaHotParams): Promise { + return request.get('/media/hot', data); +} +``` + +## 6) PR 自检输出模板 + +在实现说明中必须附上以下区块(与 `SKILL.md` 保持一致): + +```markdown +### 自检结果 +- [x] view/hook 层没有直接请求调用 +- [x] service 边界方法具备明确类型 +- [x] 未新增宽泛 any +- [x] 异步失败分支具备兜底状态 +- [x] 混杂职责已拆分为聚焦 hooks/components +``` + +## 7) 轻量自动校验命令(可执行) + +在仓库根目录执行以下命令进行快速自检: + +```bash +# 1) 优先检查本次改动的 view/hook 文件是否直接调用 request +rg "request\\.(get|post|put|delete|deletes)\\(" + +# 2) 检查本次改动文件是否引入 any(人工结合 diff 判断) +rg "\\bany\\b" +``` + +判定规则: +- 命令 1 预期为“无结果”;有结果则说明可能绕过 service。 +- 命令 2 不要求仓库清零,但本次改动不应新增宽泛 `any`。 +- 只有在做全仓治理或用户明确要求时,才扩展到 `src/views src/hooks src/service` 全量扫描。 diff --git a/.cursor/skills/ui-requirement-planner/SKILL.md b/.cursor/skills/ui-requirement-planner/SKILL.md new file mode 100644 index 0000000..cba8caa --- /dev/null +++ b/.cursor/skills/ui-requirement-planner/SKILL.md @@ -0,0 +1,239 @@ +--- +name: ui-requirement-planner +description: 将 UI 需求转化为可维护且可落地的 Vue 3 + Vite + TypeScript 实施方案。适用于用户提供产品需求、Figma 链接/节点、截图、现有页面代码或自然语言想法,并希望输出组件分层、页面结构、composable 抽离、Pinia 使用决策、API 合约规划、交互流程、样式建议、边界状态、素材落地(图标/背景识别、下载、目录归档、页面引用)与验收标准。优先给出可执行方案,再生成代码。 +--- + +# UI 需求规划器 + +## 概述 + +将模糊或分散的 UI 需求整理为可落地的前端实施方案(Vue 3 + Vite + TypeScript)。默认采用“方案优先”输出:先明确页面结构、组件边界、composable、数据流和 API 职责,再给出 Vue 骨架代码。 + +默认技术栈与约定: +- Vue 3 + Composition API + ` + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c662709 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,13842 @@ +{ + "name": "redapricot", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "redapricot", + "version": "1.0.0", + "dependencies": { + "autoprefixer": "^10.4.13", + "axios": "^1.3.2", + "buffer": "^6.0.3", + "crypto-js": "^4.1.1", + "devtools-detector": "^2.0.14", + "html5-qrcode": "^2.3.8", + "js-md5": "^0.8.3", + "mitt": "^3.0.1", + "moment": "^2.29.4", + "pinia": "^2.0.30", + "pinia-plugin-persistedstate": "^3.0.2", + "pinyin-pro": "^3.13.0", + "postcss-px-to-viewport-8-plugin": "^1.2.0", + "qrcode.vue": "^3.3.3", + "qs": "^6.11.0", + "spark-md5": "^3.0.2", + "swiper": "^8.4.5", + "terser": "^5.16.3", + "vant": "^4.0.10", + "vconsole": "^3.15.0", + "vue": "^3.2.45", + "vue-clipboard3": "^2.0.0", + "vue-router": "^4.1.6", + "vuedraggable-es": "^4.1.1", + "xgplayer-hls.js": "^2.6.4" + }, + "devDependencies": { + "@types/crypto-js": "^4.1.1", + "@types/node": "^18.13.0", + "@types/qs": "^6.9.7", + "@types/spark-md5": "^3.0.2", + "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/parser": "^5.50.0", + "@vitejs/plugin-vue": "^3.2.0", + "eslint": "^8.33.0", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.9.0", + "prettier": "^2.8.3", + "sass": "^1.58.0", + "sass-loader": "^13.2.0", + "typescript": "^4.9.3", + "unplugin-vue-components": "^0.23.0", + "vite": "^3.2.5", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-vconsole": "^1.3.1", + "vue-tsc": "^1.0.24" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.2.tgz", + "integrity": "sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", + "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/standalone": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.15.tgz", + "integrity": "sha512-B3LmZ1NHlTb2eFEaw8rftZc730Wh9MlmsH8ubb6IjsNoIk9+SQ2aAA0nrm/1806+PftPRAACPClmKTu8PG7Tew==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nuxt/kit": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.2.2.tgz", + "integrity": "sha512-T3UeLxGSNl7dQgKzmtBbPEkUiiBYgXI+KkemmpkYbQK/l+bWy2f9VQw/Rl0HkQLfRTE2fS8q8jhsOedFiEnHQQ==", + "dev": true, + "dependencies": { + "@nuxt/schema": "3.2.2", + "c12": "^1.1.2", + "consola": "^2.15.3", + "defu": "^6.1.2", + "globby": "^13.1.3", + "hash-sum": "^2.0.0", + "ignore": "^5.2.4", + "jiti": "^1.17.1", + "knitwork": "^1.0.0", + "lodash.template": "^4.5.0", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "scule": "^1.0.0", + "semver": "^7.3.8", + "unctx": "^2.1.2", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + }, + "engines": { + "node": "^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@nuxt/kit/node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@nuxt/kit/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nuxt/schema": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.2.2.tgz", + "integrity": "sha512-o3O2OqLAMKqb/DlGpK8eJq4tH29NA4OMaohknSSXl35+Nw/qHB5eOLDz+cFxNE+MKHoMj1rRVMCfi/Y/PrCN6g==", + "dev": true, + "dependencies": { + "c12": "^1.1.2", + "create-require": "^1.1.1", + "defu": "^6.1.2", + "hookable": "^5.4.2", + "jiti": "^1.17.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "postcss-import-resolver": "^2.0.0", + "scule": "^1.0.0", + "std-env": "^3.3.2", + "ufo": "^1.1.0", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + }, + "engines": { + "node": "^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", + "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-82E/lVRaqelV9qmRzzJ1PKTpyrpnT7mwdneKNJB9hUtypZDMggloDfFUCIqRRx3lYRxteCwXSq9c+W71Vf0QnQ==", + "dev": true + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "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==" + }, + "node_modules/@vant/use": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vant/use/-/use-1.5.0.tgz", + "integrity": "sha512-Dk7aMn7gLpoDew2tix/mjXpP0PoERWcxWh+pRY4xxl0MG4eeByAAyZSE6PgMpof4Yorqn7yq8KmeQcaVnxq2cg==" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.2.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.2.0-alpha.16.tgz", + "integrity": "sha512-aIktWe9Zg0M+u/RIXHCuL+IoLRHTrpsbTib8olrg4etlurHDXahoVhoEnH9wmlliray0iigIo2z5vwueYInp3g==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.2.0-alpha.16" + } + }, + "node_modules/@volar/source-map": { + "version": "1.2.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.2.0-alpha.16.tgz", + "integrity": "sha512-/AK3VqnFqONd221COI2ZnEvfgBulfoQkjA/ZjPOXpsOkWri99TLcfZY/NTQRytp7Hx6EP/1p1DDeyGuMCUYjgA==", + "dev": true, + "dependencies": { + "muggle-string": "^0.2.2" + } + }, + "node_modules/@volar/typescript": { + "version": "1.2.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.2.0-alpha.16.tgz", + "integrity": "sha512-ltlTLHIkLxgmTVBZmOnhmnlNzEj2lpvlBmmaV2GWYTrBUMt0z1OgeCq0Utlj9HjjrGPhwWxZNkv86ZABgrMA3Q==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.2.0-alpha.16" + } + }, + "node_modules/@volar/vue-language-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.1.4.tgz", + "integrity": "sha512-2C2CwHvaT5AzNzDbYZQ85lNr4jACZARoZMZBLuU5+JyIwhWeAfxvyAeoE3VbgfgycN5t6X4uBqx/Wzh1QLgD8Q==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.2.0-alpha.16", + "@volar/source-map": "1.2.0-alpha.16", + "@vue/compiler-dom": "^3.2.47", + "@vue/compiler-sfc": "^3.2.47", + "@vue/reactivity": "^3.2.47", + "@vue/shared": "^3.2.47", + "minimatch": "^6.1.6", + "muggle-string": "^0.2.2", + "vue-template-compiler": "^2.7.14" + } + }, + "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@volar/vue-language-core/node_modules/minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@volar/vue-typescript": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.1.4.tgz", + "integrity": "sha512-x5i5TUUXb1PM0rM80Y8XUeMBUcoS3/TjR3WTxvvEUIol9uEOPp6uxxQQ67uSv7ocN6vB0LugJqS6FA7Z93oL0Q==", + "dev": true, + "dependencies": { + "@volar/typescript": "1.2.0-alpha.16", + "@volar/vue-language-core": "1.1.4" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "dependencies": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "dependencies": { + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/reactivity-transform/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "dependencies": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "dependencies": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "dependencies": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + }, + "peerDependencies": { + "vue": "3.2.47" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.18.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/axios/-/axios-1.18.0.tgz", + "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/c12": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.1.2.tgz", + "integrity": "sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA==", + "dev": true, + "dependencies": { + "defu": "^6.1.2", + "dotenv": "^16.0.3", + "giget": "^1.1.0", + "jiti": "^1.17.1", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "rc9": "^2.0.1" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001457", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", + "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/core-js": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", + "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==", + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/danmu.js": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/danmu.js/-/danmu.js-1.1.8.tgz", + "integrity": "sha512-GIFSHqJ+HFTGLLaL2BHMPBaOuPY1bWPwC0Pvi/V06uMIoxNTyEGxMuoO2SzNHsDvKC/r252zR9T/Gwx93AaKfw==", + "peer": true, + "dependencies": { + "event-emitter": "^0.3.5" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defu": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", + "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/destr": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", + "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==", + "dev": true + }, + "node_modules/devtools-detector": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/devtools-detector/-/devtools-detector-2.0.14.tgz", + "integrity": "sha512-lI7zNCDL+a6jusFIYG5zztJSGt6gNV+rtoDAm9Z00MhHKMHQxh58oLYLz0xlv0tFwbzl1S0Qq6P87iznwwEcGw==", + "dependencies": { + "compare-versions": "^3.6.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "node_modules/dom7": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", + "integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==", + "dependencies": { + "ssr-window": "^4.0.0" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/downloadjs": { + "version": "1.4.7", + "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz", + "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==", + "peer": true + }, + "node_modules/draggabilly": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/draggabilly/-/draggabilly-2.4.1.tgz", + "integrity": "sha512-HHHLPEPZqRXIDQDFRFdK7RONZausNlJ4WkA73ST7Z6O2HPWttxFHVwHo8nccuDLzXWwiVKRVuc6fTkW+CQA++A==", + "peer": true, + "dependencies": { + "get-size": "^2.0.2", + "unidragger": "^2.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.302.tgz", + "integrity": "sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true, + "peer": true + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz", + "integrity": "sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ev-emitter": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ev-emitter/-/ev-emitter-1.1.1.tgz", + "integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==", + "peer": true + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "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.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.6", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-size": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/get-size/-/get-size-2.0.3.tgz", + "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==", + "peer": true + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/giget": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", + "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==", + "dev": true, + "dependencies": { + "colorette": "^2.0.19", + "defu": "^6.1.2", + "https-proxy-agent": "^5.0.1", + "mri": "^1.2.0", + "node-fetch-native": "^1.0.2", + "pathe": "^1.1.0", + "tar": "^6.1.13" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hls.js": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.3.tgz", + "integrity": "sha512-4Efu6g90HfFGDuQrkquhDoRpA/4iVpSMcfK9zguJ2qXEUfo5VknZt6rziwwFPHmC2DU3crZ0NtPD0eUqOhFyqg==" + }, + "node_modules/hookable": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.4.2.tgz", + "integrity": "sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg==", + "dev": true + }, + "node_modules/html5-qrcode": { + "version": "2.3.8", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/html5-qrcode/-/html5-qrcode-2.3.8.tgz", + "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==", + "license": "Apache-2.0" + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.1.tgz", + "integrity": "sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==" + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/knitwork": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.0.0.tgz", + "integrity": "sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "node_modules/minipass": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", + "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", + "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "ufo": "^1.1.0" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/muggle-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz", + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "dev": true + }, + "node_modules/mutation-observer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mutation-observer/-/mutation-observer-1.0.3.tgz", + "integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==" + }, + "node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-fetch-native": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", + "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", + "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pinia": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.30.tgz", + "integrity": "sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA==", + "dependencies": { + "@vue/devtools-api": "^6.4.5", + "vue-demi": "*" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persistedstate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.1.0.tgz", + "integrity": "sha512-8UN+vYMEPBdgNLwceY08mi5olI0wkYaEb8b6hD6xW7SnBRuPydWHlEhZvUWgNb/ibuf4PvufpvtS+dmhYjJQOw==", + "peerDependencies": { + "pinia": "^2.0.0" + } + }, + "node_modules/pinia/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, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "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/pinyin-pro": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pinyin-pro/-/pinyin-pro-3.13.0.tgz", + "integrity": "sha512-mwXkm0fbNdyBqWMCkpmPDT3by8nAIROpQBtJPd2zCQtYn/ED2KWe42X7gZ96R7jZz8zPzaWk5yq93BnOOucNNw==" + }, + "node_modules/pkg-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", + "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.1.1", + "pathe": "^1.1.0" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz", + "integrity": "sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==", + "dev": true, + "dependencies": { + "enhanced-resolve": "^4.1.1" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-px-to-viewport-8-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-px-to-viewport-8-plugin/-/postcss-px-to-viewport-8-plugin-1.2.0.tgz", + "integrity": "sha512-3mbLHcJSb8LymP3zIsvwBkumkyfau5IMEGcn83dzELIRi83yKbIuJCKv3sDZW5XaJs3CntdncYugHWffbubCsg==", + "dependencies": { + "object-assign": "^4.1.1" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "node_modules/posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5" + } + }, + "node_modules/posthtml-rename-id/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "dependencies": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode.vue": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.3.3.tgz", + "integrity": "sha512-OsD4tQjIbxg/K6D5ZkWjBdYI9eg9K2i8qeYILdEAX5mdAydSAxV7xKmmZSP/hA12olLqEMZ9ryqDQrwa9jEMgw==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rc9": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.1.tgz", + "integrity": "sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==", + "dev": true, + "dependencies": { + "defu": "^6.1.2", + "destr": "^1.2.2", + "flat": "^5.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/sass": { + "version": "1.58.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", + "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/scule": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", + "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", + "dev": true + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssr-window": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", + "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/std-env": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", + "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + } + }, + "node_modules/svg-baker/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/svg-baker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/swiper": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", + "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", + "hasInstallScript": true, + "dependencies": { + "dom7": "^4.0.4", + "ssr-window": "^4.0.2" + }, + "engines": { + "node": ">= 4.7.0" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.17.6", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ufo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.0.tgz", + "integrity": "sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==", + "dev": true + }, + "node_modules/unctx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.2.tgz", + "integrity": "sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.27.0", + "unplugin": "^1.0.1" + } + }, + "node_modules/unctx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unidragger": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/unidragger/-/unidragger-2.4.0.tgz", + "integrity": "sha512-MueZK2oXuGE6OAlGKIrSXK2zCq+8yb1QUZgqyTDCSJzvwYL0g2Llrad+TtoQTYxtFnNyxxSw0IMnKNIgEMia1w==", + "peer": true, + "dependencies": { + "unipointer": "^2.4.0" + } + }, + "node_modules/unimport": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-2.2.4.tgz", + "integrity": "sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.27.0", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "scule": "^1.0.0", + "strip-literal": "^1.0.0", + "unplugin": "^1.0.1" + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unipointer": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/unipointer/-/unipointer-2.4.0.tgz", + "integrity": "sha512-VjzDLPjGK7aYpQKH7bnDZS8X4axF5AFU/LQi+NQe1oyEHfaz6lWKhaQ7n4o7vJ1iJ4i2T0quCIfrQM139p05Sw==", + "peer": true, + "dependencies": { + "ev-emitter": "^1.0.1" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.1.0.tgz", + "integrity": "sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.23.0.tgz", + "integrity": "sha512-JAJ+BGvjHvi9P7lICwOzDx2Av+OcI6ZTzvySmjXDNGCNVPrt2NQQmbcp7cW027CR1mRugIX5G//awm3doHyqkg==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.2", + "@nuxt/kit": "^3.1.1", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.27.0", + "minimatch": "^6.1.6", + "resolve": "^1.22.1", + "unplugin": "^1.0.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/untyped": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.2.2.tgz", + "integrity": "sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/standalone": "^7.20.12", + "@babel/types": "^7.20.7", + "scule": "^1.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vant": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/vant/-/vant-4.0.11.tgz", + "integrity": "sha512-axVP6eHH4vGb5FQ2hqNhB5DykMSBQb0KK97HT4bVVFTYM81EJq1YImqOglzsVt3OC98NRoT01DIwt4y2n1iwVw==", + "dependencies": { + "@vant/popperjs": "^1.3.0", + "@vant/use": "^1.5.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vconsole": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/vconsole/-/vconsole-3.15.0.tgz", + "integrity": "sha512-8hq7wabPcRucSWQyN7/1tthMawP9JPvM95zgtMHpPknMMMCKj+abpoK7P7oKK4B0qw58C24Mdvo9+raUdpHyVQ==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "copy-text-to-clipboard": "^3.0.1", + "core-js": "^3.11.0", + "mutation-observer": "^1.0.3" + } + }, + "node_modules/vite": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.15.9", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-compression": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz", + "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "debug": "^4.3.3", + "fs-extra": "^10.0.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "dependencies": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-svg-icons/node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "node_modules/vite-plugin-vconsole": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vite-plugin-vconsole/-/vite-plugin-vconsole-1.3.1.tgz", + "integrity": "sha512-fSuk+UROXpxIZsQID7/CSvBxIRO4Zug5P+Qv8H2Rdnl4ks9nAhSCzNBE4amyZhJLJE1Rl4z0EMIOomK8sHLugQ==", + "dev": true + }, + "node_modules/vue": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/vue-clipboard3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz", + "integrity": "sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==", + "dependencies": { + "clipboard": "^2.0.6" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", + "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-router": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "dependencies": { + "@vue/devtools-api": "^6.4.5" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.1.4.tgz", + "integrity": "sha512-CMG8KZsBBPyulYie05XxJCfq/yAPiB/uMMeHmog09aLm2Kml82C6tUSRgQz8ujM4JoCrpDqVCd9G0NuM9aLt1g==", + "dev": true, + "dependencies": { + "@volar/vue-language-core": "1.1.4", + "@volar/vue-typescript": "1.1.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vuedraggable-es": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/vuedraggable-es/-/vuedraggable-es-4.1.1.tgz", + "integrity": "sha512-F35pjSwC8HS/lnaOd+B59nYR4FZmwuhWAzccK9xftRuWds8SU1TZh5myKVM86j5dFOI7S26O64Kwe7LUHnXjlA==", + "dependencies": { + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.2.31" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.84.1", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.84.1.tgz", + "integrity": "sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xgplayer": { + "version": "2.32.2", + "resolved": "https://registry.npmmirror.com/xgplayer/-/xgplayer-2.32.2.tgz", + "integrity": "sha512-VWK8Hp5K3Fs5YoHadpyCw2zwuiOimRjkPo2PSJZPYKj59VNnL9oLruZp6cy86LHoAgWELRIQj6Nmw5SkQNByWQ==", + "peer": true, + "dependencies": { + "chalk": "^2.3.2", + "commander": "^2.15.1", + "danmu.js": "^1.1.2", + "downloadjs": "1.4.7", + "draggabilly": "^2.2.0", + "event-emitter": "^0.3.5", + "fs-extra": "^5.0.0", + "xgplayer-subtitles": "^1.0.19" + }, + "bin": { + "xgplayer": "bin/xgplayer.js" + } + }, + "node_modules/xgplayer-hls.js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/xgplayer-hls.js/-/xgplayer-hls.js-2.6.4.tgz", + "integrity": "sha512-yHIXppRRGWVCZqkI+sAa6lFUXgocd87rk0BhGks04ARh4T8sMrpOBhyNq1PDolPu/mbOvIe8iwG4VwDJFkdwvg==", + "dependencies": { + "deepmerge": "2.0.1", + "event-emitter": "^0.3.5", + "eventemitter3": "^4.0.7", + "hls.js": "^1.2.9" + }, + "peerDependencies": { + "xgplayer": "^2.0.0" + } + }, + "node_modules/xgplayer-subtitles": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-1.1.1.tgz", + "integrity": "sha512-GYzrK/e4ydAATP3Xg06sXYliiSCcyNIqqQSwnWbs7pw+cc5NwyrYXuLfa3Bp9skIxT6pT+A7qTicUps58N3eEQ==", + "peer": true, + "dependencies": { + "eventemitter3": "^4.0.7" + }, + "peerDependencies": { + "core-js": ">=3.12.1" + } + }, + "node_modules/xgplayer/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/xgplayer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/xgplayer/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/xgplayer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "peer": true + }, + "node_modules/xgplayer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/xgplayer/node_modules/fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/xgplayer/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/xgplayer/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/xgplayer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/xgplayer/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@antfu/utils": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.2.tgz", + "integrity": "sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true + }, + "@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", + "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==" + }, + "@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/standalone": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.15.tgz", + "integrity": "sha512-B3LmZ1NHlTb2eFEaw8rftZc730Wh9MlmsH8ubb6IjsNoIk9+SQ2aAA0nrm/1806+PftPRAACPClmKTu8PG7Tew==", + "dev": true + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "dev": true, + "optional": true + }, + "@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nuxt/kit": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.2.2.tgz", + "integrity": "sha512-T3UeLxGSNl7dQgKzmtBbPEkUiiBYgXI+KkemmpkYbQK/l+bWy2f9VQw/Rl0HkQLfRTE2fS8q8jhsOedFiEnHQQ==", + "dev": true, + "requires": { + "@nuxt/schema": "3.2.2", + "c12": "^1.1.2", + "consola": "^2.15.3", + "defu": "^6.1.2", + "globby": "^13.1.3", + "hash-sum": "^2.0.0", + "ignore": "^5.2.4", + "jiti": "^1.17.1", + "knitwork": "^1.0.0", + "lodash.template": "^4.5.0", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "scule": "^1.0.0", + "semver": "^7.3.8", + "unctx": "^2.1.2", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + }, + "dependencies": { + "globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "@nuxt/schema": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.2.2.tgz", + "integrity": "sha512-o3O2OqLAMKqb/DlGpK8eJq4tH29NA4OMaohknSSXl35+Nw/qHB5eOLDz+cFxNE+MKHoMj1rRVMCfi/Y/PrCN6g==", + "dev": true, + "requires": { + "c12": "^1.1.2", + "create-require": "^1.1.1", + "defu": "^6.1.2", + "hookable": "^5.4.2", + "jiti": "^1.17.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "postcss-import-resolver": "^2.0.0", + "scule": "^1.0.0", + "std-env": "^3.3.2", + "ufo": "^1.1.0", + "unimport": "^2.2.4", + "untyped": "^1.2.2" + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "dev": true + }, + "@types/eslint": { + "version": "8.40.0", + "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", + "dev": true, + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/node": { + "version": "18.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz", + "integrity": "sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@types/spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-82E/lVRaqelV9qmRzzJ1PKTpyrpnT7mwdneKNJB9hUtypZDMggloDfFUCIqRRx3lYRxteCwXSq9c+W71Vf0QnQ==", + "dev": true + }, + "@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@vant/popperjs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vant/popperjs/-/popperjs-1.3.0.tgz", + "integrity": "sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==" + }, + "@vant/use": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@vant/use/-/use-1.5.0.tgz", + "integrity": "sha512-Dk7aMn7gLpoDew2tix/mjXpP0PoERWcxWh+pRY4xxl0MG4eeByAAyZSE6PgMpof4Yorqn7yq8KmeQcaVnxq2cg==" + }, + "@vitejs/plugin-vue": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz", + "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==", + "dev": true, + "requires": {} + }, + "@volar/language-core": { + "version": "1.2.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.2.0-alpha.16.tgz", + "integrity": "sha512-aIktWe9Zg0M+u/RIXHCuL+IoLRHTrpsbTib8olrg4etlurHDXahoVhoEnH9wmlliray0iigIo2z5vwueYInp3g==", + "dev": true, + "requires": { + "@volar/source-map": "1.2.0-alpha.16" + } + }, + "@volar/source-map": { + "version": "1.2.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.2.0-alpha.16.tgz", + "integrity": "sha512-/AK3VqnFqONd221COI2ZnEvfgBulfoQkjA/ZjPOXpsOkWri99TLcfZY/NTQRytp7Hx6EP/1p1DDeyGuMCUYjgA==", + "dev": true, + "requires": { + "muggle-string": "^0.2.2" + } + }, + "@volar/typescript": { + "version": "1.2.0-alpha.16", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.2.0-alpha.16.tgz", + "integrity": "sha512-ltlTLHIkLxgmTVBZmOnhmnlNzEj2lpvlBmmaV2GWYTrBUMt0z1OgeCq0Utlj9HjjrGPhwWxZNkv86ZABgrMA3Q==", + "dev": true, + "requires": { + "@volar/language-core": "1.2.0-alpha.16" + } + }, + "@volar/vue-language-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.1.4.tgz", + "integrity": "sha512-2C2CwHvaT5AzNzDbYZQ85lNr4jACZARoZMZBLuU5+JyIwhWeAfxvyAeoE3VbgfgycN5t6X4uBqx/Wzh1QLgD8Q==", + "dev": true, + "requires": { + "@volar/language-core": "1.2.0-alpha.16", + "@volar/source-map": "1.2.0-alpha.16", + "@vue/compiler-dom": "^3.2.47", + "@vue/compiler-sfc": "^3.2.47", + "@vue/reactivity": "^3.2.47", + "@vue/shared": "^3.2.47", + "minimatch": "^6.1.6", + "muggle-string": "^0.2.2", + "vue-template-compiler": "^2.7.14" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@volar/vue-typescript": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.1.4.tgz", + "integrity": "sha512-x5i5TUUXb1PM0rM80Y8XUeMBUcoS3/TjR3WTxvvEUIol9uEOPp6uxxQQ67uSv7ocN6vB0LugJqS6FA7Z93oL0Q==", + "dev": true, + "requires": { + "@volar/typescript": "1.2.0-alpha.16", + "@volar/vue-language-core": "1.1.4" + } + }, + "@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "requires": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "requires": { + "@vue/shared": "3.2.47" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "requires": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "requires": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "requires": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "requires": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "axios": { + "version": "1.18.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/axios/-/axios-1.18.0.tgz", + "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", + "requires": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "requires": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "c12": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.1.2.tgz", + "integrity": "sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA==", + "dev": true, + "requires": { + "defu": "^6.1.2", + "dotenv": "^16.0.3", + "giget": "^1.1.0", + "jiti": "^1.17.1", + "mlly": "^1.1.1", + "pathe": "^1.1.0", + "pkg-types": "^1.0.2", + "rc9": "^2.0.1" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001457", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz", + "integrity": "sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.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" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + }, + "core-js": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz", + "integrity": "sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "danmu.js": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/danmu.js/-/danmu.js-1.1.8.tgz", + "integrity": "sha512-GIFSHqJ+HFTGLLaL2BHMPBaOuPY1bWPwC0Pvi/V06uMIoxNTyEGxMuoO2SzNHsDvKC/r252zR9T/Gwx93AaKfw==", + "peer": true, + "requires": { + "event-emitter": "^0.3.5" + } + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==" + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "defu": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz", + "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "destr": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz", + "integrity": "sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==", + "dev": true + }, + "devtools-detector": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/devtools-detector/-/devtools-detector-2.0.14.tgz", + "integrity": "sha512-lI7zNCDL+a6jusFIYG5zztJSGt6gNV+rtoDAm9Z00MhHKMHQxh58oLYLz0xlv0tFwbzl1S0Qq6P87iznwwEcGw==", + "requires": { + "compare-versions": "^3.6.0" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "dom7": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", + "integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==", + "requires": { + "ssr-window": "^4.0.0" + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true + }, + "downloadjs": { + "version": "1.4.7", + "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz", + "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==", + "peer": true + }, + "draggabilly": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/draggabilly/-/draggabilly-2.4.1.tgz", + "integrity": "sha512-HHHLPEPZqRXIDQDFRFdK7RONZausNlJ4WkA73ST7Z6O2HPWttxFHVwHo8nccuDLzXWwiVKRVuc6fTkW+CQA++A==", + "peer": true, + "requires": { + "get-size": "^2.0.2", + "unidragger": "^2.4.0" + } + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "electron-to-chromium": { + "version": "1.4.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.302.tgz", + "integrity": "sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-module-lexer": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz", + "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "dev": true, + "peer": true + }, + "es-object-atoms": { + "version": "1.1.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", + "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.4.1", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz", + "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-vue": { + "version": "9.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz", + "integrity": "sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==", + "dev": true, + "requires": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", + "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "ev-emitter": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ev-emitter/-/ev-emitter-1.1.1.tgz", + "integrity": "sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q==", + "peer": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "fast-deep-equal": { + "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==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.16.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "form-data": { + "version": "4.0.6", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + } + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "get-size": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/get-size/-/get-size-2.0.3.tgz", + "integrity": "sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q==", + "peer": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "giget": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", + "integrity": "sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==", + "dev": true, + "requires": { + "colorette": "^2.0.19", + "defu": "^6.1.2", + "https-proxy-agent": "^5.0.1", + "mri": "^1.2.0", + "node-fetch-native": "^1.0.2", + "pathe": "^1.1.0", + "tar": "^6.1.13" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "requires": { + "delegate": "^3.1.2" + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "requires": { + "has-symbols": "^1.0.3" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "hasown": { + "version": "2.0.4", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hls.js": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.3.tgz", + "integrity": "sha512-4Efu6g90HfFGDuQrkquhDoRpA/4iVpSMcfK9zguJ2qXEUfo5VknZt6rziwwFPHmC2DU3crZ0NtPD0eUqOhFyqg==" + }, + "hookable": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.4.2.tgz", + "integrity": "sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg==", + "dev": true + }, + "html5-qrcode": { + "version": "2.3.8", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/html5-qrcode/-/html5-qrcode-2.3.8.tgz", + "integrity": "sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==" + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true + }, + "immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "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==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "jiti": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.17.1.tgz", + "integrity": "sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==" + }, + "js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true + }, + "knitwork": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.0.0.tgz", + "integrity": "sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.13" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", + "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mlly": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz", + "integrity": "sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==", + "dev": true, + "requires": { + "acorn": "^8.8.2", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "ufo": "^1.1.0" + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "muggle-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz", + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "dev": true + }, + "mutation-observer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mutation-observer/-/mutation-observer-1.0.3.tgz", + "integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==" + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "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==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node-fetch-native": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz", + "integrity": "sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==", + "dev": true + }, + "node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", + "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pinia": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.0.30.tgz", + "integrity": "sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA==", + "requires": { + "@vue/devtools-api": "^6.4.5", + "vue-demi": "*" + }, + "dependencies": { + "vue-demi": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz", + "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", + "requires": {} + } + } + }, + "pinia-plugin-persistedstate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.1.0.tgz", + "integrity": "sha512-8UN+vYMEPBdgNLwceY08mi5olI0wkYaEb8b6hD6xW7SnBRuPydWHlEhZvUWgNb/ibuf4PvufpvtS+dmhYjJQOw==", + "requires": {} + }, + "pinyin-pro": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/pinyin-pro/-/pinyin-pro-3.13.0.tgz", + "integrity": "sha512-mwXkm0fbNdyBqWMCkpmPDT3by8nAIROpQBtJPd2zCQtYn/ED2KWe42X7gZ96R7jZz8zPzaWk5yq93BnOOucNNw==" + }, + "pkg-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", + "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.1.1", + "pathe": "^1.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-import-resolver": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz", + "integrity": "sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==", + "dev": true, + "requires": { + "enhanced-resolve": "^4.1.1" + } + }, + "postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "requires": {} + }, + "postcss-px-to-viewport-8-plugin": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-px-to-viewport-8-plugin/-/postcss-px-to-viewport-8-plugin-1.2.0.tgz", + "integrity": "sha512-3mbLHcJSb8LymP3zIsvwBkumkyfau5IMEGcn83dzELIRi83yKbIuJCKv3sDZW5XaJs3CntdncYugHWffbubCsg==", + "requires": { + "object-assign": "^4.1.1" + } + }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-from-env": { + "version": "2.1.0", + "resolved": "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "qrcode.vue": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.3.3.tgz", + "integrity": "sha512-OsD4tQjIbxg/K6D5ZkWjBdYI9eg9K2i8qeYILdEAX5mdAydSAxV7xKmmZSP/hA12olLqEMZ9ryqDQrwa9jEMgw==", + "requires": {} + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "rc9": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.0.1.tgz", + "integrity": "sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==", + "dev": true, + "requires": { + "defu": "^6.1.2", + "destr": "^1.2.2", + "flat": "^5.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sass": { + "version": "1.58.3", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz", + "integrity": "sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "schema-utils": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.2.tgz", + "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "scule": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", + "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", + "dev": true + }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ssr-window": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", + "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + } + } + }, + "std-env": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", + "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "requires": { + "acorn": "^8.8.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "swiper": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz", + "integrity": "sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g==", + "requires": { + "dom7": "^4.0.4", + "ssr-window": "^4.0.2" + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terser": { + "version": "5.17.6", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.17.6.tgz", + "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "traverse": { + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", + "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true + }, + "ufo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.0.tgz", + "integrity": "sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q==", + "dev": true + }, + "unctx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.1.2.tgz", + "integrity": "sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg==", + "dev": true, + "requires": { + "acorn": "^8.8.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.27.0", + "unplugin": "^1.0.1" + }, + "dependencies": { + "estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0" + } + } + } + }, + "unidragger": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/unidragger/-/unidragger-2.4.0.tgz", + "integrity": "sha512-MueZK2oXuGE6OAlGKIrSXK2zCq+8yb1QUZgqyTDCSJzvwYL0g2Llrad+TtoQTYxtFnNyxxSw0IMnKNIgEMia1w==", + "peer": true, + "requires": { + "unipointer": "^2.4.0" + } + }, + "unimport": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-2.2.4.tgz", + "integrity": "sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.27.0", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "pkg-types": "^1.0.1", + "scule": "^1.0.0", + "strip-literal": "^1.0.0", + "unplugin": "^1.0.1" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unipointer": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/unipointer/-/unipointer-2.4.0.tgz", + "integrity": "sha512-VjzDLPjGK7aYpQKH7bnDZS8X4axF5AFU/LQi+NQe1oyEHfaz6lWKhaQ7n4o7vJ1iJ4i2T0quCIfrQM139p05Sw==", + "peer": true, + "requires": { + "ev-emitter": "^1.0.1" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unplugin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.1.0.tgz", + "integrity": "sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==", + "dev": true, + "requires": { + "acorn": "^8.8.2", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "unplugin-vue-components": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.23.0.tgz", + "integrity": "sha512-JAJ+BGvjHvi9P7lICwOzDx2Av+OcI6ZTzvySmjXDNGCNVPrt2NQQmbcp7cW027CR1mRugIX5G//awm3doHyqkg==", + "dev": true, + "requires": { + "@antfu/utils": "^0.7.2", + "@nuxt/kit": "^3.1.1", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.27.0", + "minimatch": "^6.1.6", + "resolve": "^1.22.1", + "unplugin": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "untyped": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.2.2.tgz", + "integrity": "sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==", + "dev": true, + "requires": { + "@babel/core": "^7.20.12", + "@babel/standalone": "^7.20.12", + "@babel/types": "^7.20.7", + "scule": "^1.0.0" + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "vant": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/vant/-/vant-4.0.11.tgz", + "integrity": "sha512-axVP6eHH4vGb5FQ2hqNhB5DykMSBQb0KK97HT4bVVFTYM81EJq1YImqOglzsVt3OC98NRoT01DIwt4y2n1iwVw==", + "requires": { + "@vant/popperjs": "^1.3.0", + "@vant/use": "^1.5.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vconsole": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/vconsole/-/vconsole-3.15.0.tgz", + "integrity": "sha512-8hq7wabPcRucSWQyN7/1tthMawP9JPvM95zgtMHpPknMMMCKj+abpoK7P7oKK4B0qw58C24Mdvo9+raUdpHyVQ==", + "requires": { + "@babel/runtime": "^7.17.2", + "copy-text-to-clipboard": "^3.0.1", + "core-js": "^3.11.0", + "mutation-observer": "^1.0.3" + } + }, + "vite": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz", + "integrity": "sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ==", + "dev": true, + "requires": { + "esbuild": "^0.15.9", + "fsevents": "~2.3.2", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + } + }, + "vite-plugin-compression": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz", + "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "debug": "^4.3.3", + "fs-extra": "^10.0.0" + } + }, + "vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "requires": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "dependencies": { + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + } + } + }, + "vite-plugin-vconsole": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vite-plugin-vconsole/-/vite-plugin-vconsole-1.3.1.tgz", + "integrity": "sha512-fSuk+UROXpxIZsQID7/CSvBxIRO4Zug5P+Qv8H2Rdnl4ks9nAhSCzNBE4amyZhJLJE1Rl4z0EMIOomK8sHLugQ==", + "dev": true + }, + "vue": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "vue-clipboard3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz", + "integrity": "sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==", + "requires": { + "clipboard": "^2.0.6" + } + }, + "vue-eslint-parser": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", + "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "dependencies": { + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "vue-router": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "requires": { + "@vue/devtools-api": "^6.4.5" + } + }, + "vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.1.4.tgz", + "integrity": "sha512-CMG8KZsBBPyulYie05XxJCfq/yAPiB/uMMeHmog09aLm2Kml82C6tUSRgQz8ujM4JoCrpDqVCd9G0NuM9aLt1g==", + "dev": true, + "requires": { + "@volar/vue-language-core": "1.1.4", + "@volar/vue-typescript": "1.1.4" + } + }, + "vuedraggable-es": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/vuedraggable-es/-/vuedraggable-es-4.1.1.tgz", + "integrity": "sha512-F35pjSwC8HS/lnaOd+B59nYR4FZmwuhWAzccK9xftRuWds8SU1TZh5myKVM86j5dFOI7S26O64Kwe7LUHnXjlA==", + "requires": { + "sortablejs": "1.14.0" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.84.1", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.84.1.tgz", + "integrity": "sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.14.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.14.1", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xgplayer": { + "version": "2.32.2", + "resolved": "https://registry.npmmirror.com/xgplayer/-/xgplayer-2.32.2.tgz", + "integrity": "sha512-VWK8Hp5K3Fs5YoHadpyCw2zwuiOimRjkPo2PSJZPYKj59VNnL9oLruZp6cy86LHoAgWELRIQj6Nmw5SkQNByWQ==", + "peer": true, + "requires": { + "chalk": "^2.3.2", + "commander": "^2.15.1", + "danmu.js": "^1.1.2", + "downloadjs": "1.4.7", + "draggabilly": "^2.2.0", + "event-emitter": "^0.3.5", + "fs-extra": "^5.0.0", + "xgplayer-subtitles": "^1.0.19" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "peer": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "peer": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "peer": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "peer": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "peer": true + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "peer": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "peer": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "peer": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true + } + } + }, + "xgplayer-hls.js": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/xgplayer-hls.js/-/xgplayer-hls.js-2.6.4.tgz", + "integrity": "sha512-yHIXppRRGWVCZqkI+sAa6lFUXgocd87rk0BhGks04ARh4T8sMrpOBhyNq1PDolPu/mbOvIe8iwG4VwDJFkdwvg==", + "requires": { + "deepmerge": "2.0.1", + "event-emitter": "^0.3.5", + "eventemitter3": "^4.0.7", + "hls.js": "^1.2.9" + } + }, + "xgplayer-subtitles": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-1.1.1.tgz", + "integrity": "sha512-GYzrK/e4ydAATP3Xg06sXYliiSCcyNIqqQSwnWbs7pw+cc5NwyrYXuLfa3Bp9skIxT6pT+A7qTicUps58N3eEQ==", + "peer": true, + "requires": { + "eventemitter3": "^4.0.7" + } + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..eb9ab31 --- /dev/null +++ b/package.json @@ -0,0 +1,63 @@ +{ + "name": "redapricot", + "private": true, + "version": "1.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build:prod": "export NODE_ENV=production && vite build --mode production", + "build:test": "export NODE_ENV=test && vite build --mode test ", + "preview": "vite preview", + "lint": "eslint --ext .js,.vue,.ts src --fix" + }, + "dependencies": { + "autoprefixer": "^10.4.13", + "axios": "^1.3.2", + "buffer": "^6.0.3", + "crypto-js": "^4.1.1", + "devtools-detector": "^2.0.14", + "html5-qrcode": "^2.3.8", + "js-md5": "^0.8.3", + "mitt": "^3.0.1", + "moment": "^2.29.4", + "pinia": "^2.0.30", + "pinia-plugin-persistedstate": "^3.0.2", + "pinyin-pro": "^3.13.0", + "postcss-px-to-viewport-8-plugin": "^1.2.0", + "qrcode.vue": "^3.3.3", + "qs": "^6.11.0", + "spark-md5": "^3.0.2", + "swiper": "^8.4.5", + "terser": "^5.16.3", + "vant": "^4.0.10", + "vconsole": "^3.15.0", + "vue": "^3.2.45", + "vue-clipboard3": "^2.0.0", + "vue-router": "^4.1.6", + "vuedraggable-es": "^4.1.1", + "xgplayer-hls.js": "^2.6.4" + }, + "devDependencies": { + "@types/crypto-js": "^4.1.1", + "@types/node": "^18.13.0", + "@types/qs": "^6.9.7", + "@types/spark-md5": "^3.0.2", + "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/parser": "^5.50.0", + "@vitejs/plugin-vue": "^3.2.0", + "eslint": "^8.33.0", + "eslint-config-prettier": "^8.6.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-vue": "^9.9.0", + "prettier": "^2.8.3", + "sass": "^1.58.0", + "sass-loader": "^13.2.0", + "typescript": "^4.9.3", + "unplugin-vue-components": "^0.23.0", + "vite": "^3.2.5", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-svg-icons": "^2.0.1", + "vite-plugin-vconsole": "^1.3.1", + "vue-tsc": "^1.0.24" + } +} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..26f491c --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,24 @@ +const autoprefixer = require('autoprefixer'); +const px2viewport = require('postcss-px-to-viewport-8-plugin'); + +const basePx2viewport = { + unitToConvert: 'px', // 需要转换的单位,默认为 px + unitPrecision: 3, // 单位转换后保留的精度(很多时候无法整除) + propList: ['*'], // 能转化为vw的属性列表,!font-size表示font-size后面的单位不会被转换 + viewportUnit: 'vw', // 指定需要转换成的视口单位,建议使用 vw + fontViewportUnit: 'vw', // 字体使用的视口单位 + selectorBlackList: ['.ignore', 'keep-px'], + minPixelValue: 1, // 设置最小的转换数值,这里小于或等于 1px 不转换为视口单位 + mediaQuery: false, // 媒体查询里的单位是否需要转换单位 + // exclude: [/node_modules/], // 忽略某些文件夹下的文件或特定文件 + // include: [/src/], // 如果设置了include,那将只有匹配到的文件才会被转换 +}; +module.exports = { + plugins: [ + autoprefixer(), + px2viewport({ + ...basePx2viewport, + viewportWidth: 375, + }), + ], +}; diff --git a/prod_build.sh b/prod_build.sh new file mode 100755 index 0000000..d15b562 --- /dev/null +++ b/prod_build.sh @@ -0,0 +1,7 @@ +# sh 执行打包到正式服上 +npm run build:prod +zip -q -r dist.zip dist +scp dist.zip server@116.212.120.2:/home/server/91porn/h5/pro +ssh server@116.212.120.2 "/home/server/91porn/h5/pro/dist.sh" +rm dist.zip +# https://5w8cj.com?tid=6797250199453562mmpyrwqv \ No newline at end of file diff --git a/project.md b/project.md new file mode 100644 index 0000000..b9cbccb --- /dev/null +++ b/project.md @@ -0,0 +1,169 @@ +--- +项目名称: 91pron H5 客户端 # 与 DMP 或内部命名一致时请自行替换 +一级部门: 北斗 # 请填写一级部门名称 +二级部门: 瑞升 # 请填写二级部门名称,无则留空 + +DMP编码: JHA-204 # 无则留空 + +项目类型: H5 + # 可选值: + # H5 / APP / PC / 服务 / 组件 / 工具 / AI / 中间件 + +开发语言: Node + # 可选值: + # GO / Java / PHP / Node + +项目负责人: DN4929,DN4868 # 员工编号,多个用逗号隔开,这里的负责是这套代码的负责人 + +运维负责人: DN9460,DN9651,DN4792 # 负责部署、监控、K8S、发布、证书等 + +产品负责人: YY1145,YY1208 # 项目产品经理 + +项目成员: DN4929,DN4868 + +项目状态: 开发中 + # 可选值: + # 开发中 / 维护中 / 已停止 / 已归档 + +项目级别: 中 + # 可选值: + # 高 / 中 / 低 + +核心分支: main + +代码仓库: + - https://bd-git.jsyyds.com/ruisheng/jha-204-91pron/frontend/91porn-h5-client.git + +最后审计人: + +最后审计时间: + +告警群: + +备注: + - `package.json` 中 `name` 为 `redapricot`,仓库/目录名为 `91pron-h5-client`。 + - 业务 API 根路径由 **选线得到的 `configStore.baseUrl`** + 环境变量 `VITE_APP_API_BASE_URL`(如 `/api/app`)拼接;选线候选域名见各环境 `.env.*` 中的 `VITE_BASE_URL`(JSON 数组),勿将含密钥、内网地址的未脱敏内容对外发布。 +--- + +# 1. 项目说明 + +本仓库为面向 **移动端 H5 浏览器** 的 **Vue 3 + Vite + TypeScript** 单页应用,UI 基于 **Vant 4**,状态管理为 **Pinia**(`pinia-plugin-persistedstate` 持久化),路由为 **Vue Router 4**,模式为 **`createWebHistory`(HTML5 History)**(见 `src/router/index.ts`)。入口为 `src/main.ts`,挂载 Pinia、Router、埋点插件与 Vant `Lazyload` 等;全局路由前置逻辑见 `src/permission.ts`(含大量 `` 与 Tab 缓存策略)。启动页 `Splash` 负责 **API 选线**(ping)、拉取应用配置并写入 `config`/`global` 等 store,再进入 `MainView` 主导航。 + +业务域在 `src/views/` 下按模块划分,主要包括:**首页与搜索/片库/长短视频播放详情**(`lldhome`、`shortVideo`)、**社区**(帖子、套图、排行、群聊等,`community`)、**直播**(`lldlive`)、**我的**(登录、钱包会员、充值提现、消息、AI 功能、历史收藏等,`lldmine`)、**ACG**(小说/漫画/动漫,`acgModule`)、**暗网**(`darkNet`)、**娱乐**(`entertainment`)、**联合游戏活动**(`jointGamingActivitie`)、**预售**(`lldpresale`)、**免费福利**(`lldfreeBenefits`)等;接口封装在 `src/service/`,按域拆分(如 `home.ts`、`user.ts`、`community.ts`)。 + +**技术栈要点:** + +- 构建:**Vite 3**(`vite.config.ts`),生产使用 **Terser** 压缩,**vite-plugin-compression** 生成 **gzip** 产物;**unplugin-vue-components** + **VantResolver** 按需引入组件;**vite-plugin-svg-icons** 使用 `src/assets/icons`;可按环境开启 **vconsole**(`vite-plugin-vconsole`)。 +- 样式:**Sass**,通过 `css.preprocessorOptions.scss.additionalData` 向各组件注入 `@/assets/styles/main.scss`;存在主题目录 `src/assets/theme/`。 +- 适配:**postcss-px-to-viewport-8-plugin**(见 `postcss` 配置)。 +- 网络:**axios** 封装于 `src/utils/request.ts`,`baseURL = configStore.baseUrl + VITE_APP_API_BASE_URL`;支持 **Authorization**、业务码非 200 时 `showToast`、可选 **请求体/查询参数加密**(`VITE_PARAMETER_ENCRYPTION`)、响应 `hash` 字段时的解密;GET 短缓存与请求去重等逻辑也在该文件中。 +- 播放器与媒体:**xgplayer-hls.js**(HLS),业务中多处拼接 **`/api/app/vid/h5/m3u8/…`** 拉流地址(见 `VideoHls` 等组件)。 +- 其他:**mitt** 事件总线、`moment`、**swiper**、**qrcode.vue**、**html5-qrcode**、**vuedraggable-es**、**devtools-detector**(生产环境非调试参数下启用检测)、`index.html` 引入 **web-sdk** 脚本供设备信息与部分请求头使用等。 + +**Node 版本:** 仓库 `README.md` 建议使用 **16.17.1**。 + +**常用脚本(`package.json`):** + +| 命令 | 说明 | +|------|------| +| `npm run dev` | 本地开发(`vite`,默认见 `vite.config.ts` 中 `server.port` 等) | +| `npm run build:prod` | 生产构建(`--mode production`) | +| `npm run build:test` | 测试环境构建(`--mode test`) | +| `npm run preview` | 预览构建产物(`vite preview`) | +| `npm run lint` | ESLint(`src` 下 `.js` / `.vue` / `.ts`,带 `--fix`) | + +**开发环境代理(`vite.config.ts`):** 本地将 **`/dcserv`** 代理到可配置的 `target`(用于部分接口调试,以文件内实际配置为准)。 + +**项目目录结构(核心):** + +``` +91pron-h5-client/ +├── public/ +├── src/ +│ ├── main.ts # 入口:Pinia、Router、Vant、埋点、devtools 等 +│ ├── App.vue +│ ├── permission.ts # 路由守卫:keep-alive / Tab 缓存策略 +│ ├── router/ +│ │ └── index.ts # Router(History)、_SPLASH_ / 首页集合 / 业务子路由等 +│ ├── stores/ # Pinia(user、config、global、app 等) +│ ├── views/ # 页面:lldhome / community / lldmine / acgModule 等 +│ ├── service/ # 按域拆分的接口方法 +│ ├── components/ # 通用与业务组件(含 VideoHls、瀑布流等) +│ ├── utils/ # request、埋点、加解密、本地存储等 +│ ├── hooks/ # 组合式逻辑 +│ ├── assets/ # 样式、图标、主题等 +│ ├── plugins/ # 如 tracker 等 +│ └── enums/、typings/ # 枚举与类型 +├── vite.config.ts +├── index.html # 入口 HTML,含 web-sdk 脚本引用 +├── .env.development / .env.test / .env.production # VITE_* 与选线域名等 +├── prod_build.sh # 示例打包/发布脚本(环境差异大,使用前请内部确认) +└── project.md # 本文件 +``` + +**接口基址与选线:** + +- **`VITE_APP_API_BASE_URL`**:通常为 **`/api/app`**,作为 axios 路径前缀拼在选线成功的域名之后。 +- **`VITE_BASE_URL`**:各环境文件中为 **JSON 数组字符串**,供启动阶段对多个候选域名做 **ping/选线**,选中的结果写入 **`configStore.baseUrl`**(详见 `Splash` 与 `src/utils/ping.ts` 等逻辑)。 +- 生产部署若使用相对路径,需由 **网关 / Nginx** 将浏览器同源下的 **`/api`** 转发到实际业务后端。 + +--- + +# 2. 基础设施与中间件 + +本仓库为 **纯前端工程**,不内置后端;运行时依赖: + +- **业务 API**:由选线结果 + `VITE_APP_API_BASE_URL` 决定;静态部署时需保证 **`/api/...` 反代** 与 HTTPS 证书策略一致。 +- **静态资源托管**:`build:prod` / `build:test` 产物在 **`dist/`**,由 CDN 或 Web 服务器提供;**History 路由** 需在服务端配置 **单页回退**(如 `try_files` 到 `index.html`)。 +- **媒体与图片域名**:全局配置、资源线与播放线路等由接口与 `config`/`global` store 中的 **`sourceInfo`**、**线路信息** 等共同决定(勿在文档中粘贴未脱敏的内网或密钥配置)。 + +--- + +# 3. 运维部署 + +**构建产物:** 执行 `npm run build:prod` 或 `npm run build:test` 后,在 **`dist/`** 生成静态资源;可能同时生成 **`.gz`**(依赖服务器是否启用 `gzip_static` 或等价能力)。 + +**推荐发布流程(示例):** + +1. 使用约定 **Node** 版本安装依赖:`npm ci` 或 `npm install`。 +2. 确认各环境 **`.env.*`** 中 `VITE_BASE_URL`、`VITE_APP_API_BASE_URL`、加密开关等与当前发布目标一致。 +3. 执行 `npm run build:prod` 或 `npm run build:test`。 +4. 将 **`dist/`** 同步至静态服务器;确认 **History 路由回退** 与 **`/api` 反代**。 +5. 仓库内 **`prod_build.sh`** 为示例流程,**主机与路径以实际运维规范为准**,避免泄露账号与内网信息。 + +**环境变量说明(摘录,完整以 `.env.*` 为准):** + +| 变量 | 作用 | +|------|------| +| `NODE_ENV` | 构建/运行环境标识 | +| `VITE_APP_API_BASE_URL` | 与选线域名拼接,作为 API 路径前缀 | +| `VITE_BASE_URL` | 选线候选 API 域名列表(JSON 数组字符串) | +| `VITE_BUILD_SOURCEMAP` | 是否生成 sourcemap | +| `VITE_BUILD_DROP_CONSOLE` | 生产是否剔除 `console` | +| `VITE_BUILD_VCONSOLE` | 是否打包进 vconsole | +| `VITE_PARAMETER_ENCRYPTION` | 是否开启请求参数加密 | + +--- + +# 4. 风险说明 + +- **强依赖网关反代**:生产使用相对路径时,**`/api` 代理错误会导致整站接口不可用**;History 模式服务器配置错误会导致 **深链 404**。 +- **选线失败**:启动阶段若所有候选域名不可用,用户可能停留在选线或错误态(见 `Splash` 与相关弹层逻辑)。 +- **参数加密与后端约定**:`VITE_PARAMETER_ENCRYPTION` 与各环境必须 **与后端一致**,否则请求体解析失败。 +- **安全与合规**:生产环境开启 **devtools 检测并跳转外部页**(见 `main.ts`),变更前需评估用户体验与合规要求。 +- **配置敏感信息**:`.env`、选线域名、密钥类逻辑 **勿提交到公开仓库**;供应链上锁定 `package-lock.json` 并定期审计依赖。 + +--- + +# 5. 历史事故(可选) + +- 暂无(请运维/研发后续补充) + +--- + +# 6. 交接说明(可选) + +- 路由与缓存策略集中在 **`src/permission.ts`**,新增常驻缓存页面时需同步维护 **keepAliveMap / mainViewKeep** 等映射。 +- 用户信息、配置等与 **`src/stores/`** 及持久化插件相关;**请勿绕过 `src/utils/request.ts` 直接发起业务 axios**(与仓库 `.cursor` 前端规范一致)。 +- 接口目录:**`src/service/`**;类型定义:**`src/typings/`**。 +- **请勿将含密钥、生产内网地址的 `.env` 或未脱敏脚本提交至对外可见仓库**;YAML 头部元数据若与真实组织不一致,请在内部系统中核对后修改。 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..3c2ff5b Binary files /dev/null and b/public/favicon.ico differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..757a019 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,150 @@ + + + + diff --git a/src/assets/css/font.css b/src/assets/css/font.css new file mode 100644 index 0000000..184c59b --- /dev/null +++ b/src/assets/css/font.css @@ -0,0 +1,6 @@ +@font-face { + font-family: 'AaLongYanTi'; + src: url('./../fonts/AaLongYanTi.ttf'); + font-weight: normal; + font-style: normal; +} \ No newline at end of file diff --git a/src/assets/css/reset.css b/src/assets/css/reset.css new file mode 100644 index 0000000..cfff805 --- /dev/null +++ b/src/assets/css/reset.css @@ -0,0 +1,87 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +html { + height: 100%; + background-color: #0f0f0f; +} +body { + height: 100%; + line-height: 1; + overflow: hidden; + /* 与 #appView / 设计稿页面底色一致,刘海/状态栏透出区不会出现色差 */ + background-color: #0f0f0f; +} +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + position: relative; + font-weight: normal; + -webkit-touch-callout: none; /* 系统默认菜单被禁用/ */ + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +#app { + height: 100%; +} +div::-webkit-scrollbar{ + display: none; +} + +.openX{ + overflow-y: hidden; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +.openY{ + overflow-y: auto; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; +} diff --git a/src/assets/css/vant.css b/src/assets/css/vant.css new file mode 100644 index 0000000..cb28856 --- /dev/null +++ b/src/assets/css/vant.css @@ -0,0 +1,36 @@ +/* 覆盖vant 默认样式 */ +:root:root { + --van-tabbar-height: 51px; + --van-tabbar-item-font-size: 10px; + --van-popover-action-width: 108px; + --van-popover-light-text-color: rgb(24,24,24); + --van-popup-background: transparent; +} + +/* 全局loading */ +.global_loading { + width: 100% !important; + max-width: 100% !important; + height: 100% !important; + background-color: rgba(0, 0, 0, 0.7); +} +.global_loading .van-toast__icon img { + font-size: 26px; +} +.van-toast{ + background: rgba(0, 0, 0, .7) !important; + box-sizing: border-box !important; +} + +/* 评论审核中 toast(Figma 20852:80720) */ +.comment-review-toast.van-toast { + background: #000 !important; + border: 0.5px solid #f68804; + border-radius: 99px; + padding: 6px 10px; +} +.comment-review-toast .van-toast__text { + color: #f68804; + font-size: 12px; + line-height: 18px; +} diff --git a/src/assets/fonts/AaLongYanTi.ttf b/src/assets/fonts/AaLongYanTi.ttf new file mode 100644 index 0000000..58ccc13 Binary files /dev/null and b/src/assets/fonts/AaLongYanTi.ttf differ diff --git a/src/assets/gif/ai-new.webp b/src/assets/gif/ai-new.webp new file mode 100644 index 0000000..19000d6 Binary files /dev/null and b/src/assets/gif/ai-new.webp differ diff --git a/src/assets/gif/ai.gif b/src/assets/gif/ai.gif new file mode 100644 index 0000000..e705ae1 Binary files /dev/null and b/src/assets/gif/ai.gif differ diff --git a/src/assets/gif/cartoon-gif.gif b/src/assets/gif/cartoon-gif.gif new file mode 100644 index 0000000..5c1a0e2 Binary files /dev/null and b/src/assets/gif/cartoon-gif.gif differ diff --git a/src/assets/gif/iosAppStoreBtn.gif b/src/assets/gif/iosAppStoreBtn.gif new file mode 100644 index 0000000..fc7e6b2 Binary files /dev/null and b/src/assets/gif/iosAppStoreBtn.gif differ diff --git a/src/assets/gif/loading.gif b/src/assets/gif/loading.gif new file mode 100644 index 0000000..181893c Binary files /dev/null and b/src/assets/gif/loading.gif differ diff --git a/src/assets/gif/lottery.gif b/src/assets/gif/lottery.gif new file mode 100644 index 0000000..a90da64 Binary files /dev/null and b/src/assets/gif/lottery.gif differ diff --git a/src/assets/gif/luckyDraw.gif b/src/assets/gif/luckyDraw.gif new file mode 100644 index 0000000..92d1430 Binary files /dev/null and b/src/assets/gif/luckyDraw.gif differ diff --git a/src/assets/gif/running.gif b/src/assets/gif/running.gif new file mode 100644 index 0000000..9a34c32 Binary files /dev/null and b/src/assets/gif/running.gif differ diff --git a/src/assets/icons/acg-collect-img-0.svg b/src/assets/icons/acg-collect-img-0.svg new file mode 100644 index 0000000..d87d271 --- /dev/null +++ b/src/assets/icons/acg-collect-img-0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg-collect-img-1.svg b/src/assets/icons/acg-collect-img-1.svg new file mode 100644 index 0000000..e6799b9 --- /dev/null +++ b/src/assets/icons/acg-collect-img-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg-collect-star-0.svg b/src/assets/icons/acg-collect-star-0.svg new file mode 100644 index 0000000..205095a --- /dev/null +++ b/src/assets/icons/acg-collect-star-0.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/acg-collect-star-1.svg b/src/assets/icons/acg-collect-star-1.svg new file mode 100644 index 0000000..c720d2a --- /dev/null +++ b/src/assets/icons/acg-collect-star-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/acg-collect-star-text-0.svg b/src/assets/icons/acg-collect-star-text-0.svg new file mode 100644 index 0000000..ce2920d --- /dev/null +++ b/src/assets/icons/acg-collect-star-text-0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg-collect-star-text-1.svg b/src/assets/icons/acg-collect-star-text-1.svg new file mode 100644 index 0000000..0aca17b --- /dev/null +++ b/src/assets/icons/acg-collect-star-text-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg-heart-0.svg b/src/assets/icons/acg-heart-0.svg new file mode 100644 index 0000000..eac73fa --- /dev/null +++ b/src/assets/icons/acg-heart-0.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/acg-heart-1.svg b/src/assets/icons/acg-heart-1.svg new file mode 100644 index 0000000..f855d00 --- /dev/null +++ b/src/assets/icons/acg-heart-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg-heart-2.svg b/src/assets/icons/acg-heart-2.svg new file mode 100644 index 0000000..eac73fa --- /dev/null +++ b/src/assets/icons/acg-heart-2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/acg-like-0.svg b/src/assets/icons/acg-like-0.svg new file mode 100644 index 0000000..2f95358 --- /dev/null +++ b/src/assets/icons/acg-like-0.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/acg-like-1.svg b/src/assets/icons/acg-like-1.svg new file mode 100644 index 0000000..2f187bf --- /dev/null +++ b/src/assets/icons/acg-like-1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/acg-share.svg b/src/assets/icons/acg-share.svg new file mode 100644 index 0000000..64c0e48 --- /dev/null +++ b/src/assets/icons/acg-share.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/acg-share1.svg b/src/assets/icons/acg-share1.svg new file mode 100644 index 0000000..fa3d4da --- /dev/null +++ b/src/assets/icons/acg-share1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg-tab-bookshelf-1.svg b/src/assets/icons/acg-tab-bookshelf-1.svg new file mode 100644 index 0000000..037c103 --- /dev/null +++ b/src/assets/icons/acg-tab-bookshelf-1.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/acg-tab-bookshelf.svg b/src/assets/icons/acg-tab-bookshelf.svg new file mode 100644 index 0000000..19b64f1 --- /dev/null +++ b/src/assets/icons/acg-tab-bookshelf.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/acg-tab-search copy.svg b/src/assets/icons/acg-tab-search copy.svg new file mode 100644 index 0000000..edeb289 --- /dev/null +++ b/src/assets/icons/acg-tab-search copy.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/acg-tab-search-filter.svg b/src/assets/icons/acg-tab-search-filter.svg new file mode 100644 index 0000000..f8d4ab8 --- /dev/null +++ b/src/assets/icons/acg-tab-search-filter.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/acg-tab-search.svg b/src/assets/icons/acg-tab-search.svg new file mode 100644 index 0000000..31f6ed7 --- /dev/null +++ b/src/assets/icons/acg-tab-search.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/acg-tab-topic.svg b/src/assets/icons/acg-tab-topic.svg new file mode 100644 index 0000000..3f9d419 --- /dev/null +++ b/src/assets/icons/acg-tab-topic.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/assets/icons/acg-video-icon-a-collect.svg b/src/assets/icons/acg-video-icon-a-collect.svg new file mode 100644 index 0000000..5659507 --- /dev/null +++ b/src/assets/icons/acg-video-icon-a-collect.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/acg-video-icon-a-video.svg b/src/assets/icons/acg-video-icon-a-video.svg new file mode 100644 index 0000000..006299b --- /dev/null +++ b/src/assets/icons/acg-video-icon-a-video.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/acg_audio_action_mode1.svg b/src/assets/icons/acg_audio_action_mode1.svg new file mode 100644 index 0000000..9aba081 --- /dev/null +++ b/src/assets/icons/acg_audio_action_mode1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg_audio_action_mode2.svg b/src/assets/icons/acg_audio_action_mode2.svg new file mode 100644 index 0000000..6c91d70 --- /dev/null +++ b/src/assets/icons/acg_audio_action_mode2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/acg_audio_action_play.svg b/src/assets/icons/acg_audio_action_play.svg new file mode 100644 index 0000000..7040823 --- /dev/null +++ b/src/assets/icons/acg_audio_action_play.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/acg_audio_action_prev.svg b/src/assets/icons/acg_audio_action_prev.svg new file mode 100644 index 0000000..4f9c894 --- /dev/null +++ b/src/assets/icons/acg_audio_action_prev.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/acg_audio_episode_active.svg b/src/assets/icons/acg_audio_episode_active.svg new file mode 100644 index 0000000..7b0cbc2 --- /dev/null +++ b/src/assets/icons/acg_audio_episode_active.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/acg_audio_feature_rate.svg b/src/assets/icons/acg_audio_feature_rate.svg new file mode 100644 index 0000000..7a58fd1 --- /dev/null +++ b/src/assets/icons/acg_audio_feature_rate.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/acg_audio_feature_time.svg b/src/assets/icons/acg_audio_feature_time.svg new file mode 100644 index 0000000..5ff08a0 --- /dev/null +++ b/src/assets/icons/acg_audio_feature_time.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/acg_audio_pause.svg b/src/assets/icons/acg_audio_pause.svg new file mode 100644 index 0000000..3548ee6 --- /dev/null +++ b/src/assets/icons/acg_audio_pause.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/acg_audio_play.svg b/src/assets/icons/acg_audio_play.svg new file mode 100644 index 0000000..8a6e216 --- /dev/null +++ b/src/assets/icons/acg_audio_play.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/acg_audio_time_seek+10.svg b/src/assets/icons/acg_audio_time_seek+10.svg new file mode 100644 index 0000000..f26c97e --- /dev/null +++ b/src/assets/icons/acg_audio_time_seek+10.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/acg_audio_time_seek-10.svg b/src/assets/icons/acg_audio_time_seek-10.svg new file mode 100644 index 0000000..64e3e73 --- /dev/null +++ b/src/assets/icons/acg_audio_time_seek-10.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/acg_automatic.svg b/src/assets/icons/acg_automatic.svg new file mode 100644 index 0000000..d145f8f --- /dev/null +++ b/src/assets/icons/acg_automatic.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/acg_bookshelf_0.svg b/src/assets/icons/acg_bookshelf_0.svg new file mode 100644 index 0000000..54f0bdc --- /dev/null +++ b/src/assets/icons/acg_bookshelf_0.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg_bookshelf_1.svg b/src/assets/icons/acg_bookshelf_1.svg new file mode 100644 index 0000000..90527a0 --- /dev/null +++ b/src/assets/icons/acg_bookshelf_1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/acg_catalogue.svg b/src/assets/icons/acg_catalogue.svg new file mode 100644 index 0000000..b438c8c --- /dev/null +++ b/src/assets/icons/acg_catalogue.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg_checked.svg b/src/assets/icons/acg_checked.svg new file mode 100644 index 0000000..2cb1f7d --- /dev/null +++ b/src/assets/icons/acg_checked.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/acg_comment.svg b/src/assets/icons/acg_comment.svg new file mode 100644 index 0000000..ceecc19 --- /dev/null +++ b/src/assets/icons/acg_comment.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg_filter.svg b/src/assets/icons/acg_filter.svg new file mode 100644 index 0000000..ab079b6 --- /dev/null +++ b/src/assets/icons/acg_filter.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg_image_setting.svg b/src/assets/icons/acg_image_setting.svg new file mode 100644 index 0000000..a0cb6fb --- /dev/null +++ b/src/assets/icons/acg_image_setting.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/acg_pics.svg b/src/assets/icons/acg_pics.svg new file mode 100644 index 0000000..9bf8dbd --- /dev/null +++ b/src/assets/icons/acg_pics.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/acg_prev.svg b/src/assets/icons/acg_prev.svg new file mode 100644 index 0000000..7333a3b --- /dev/null +++ b/src/assets/icons/acg_prev.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/acg_progress.svg b/src/assets/icons/acg_progress.svg new file mode 100644 index 0000000..368574c --- /dev/null +++ b/src/assets/icons/acg_progress.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/acg_read_mode_0.svg b/src/assets/icons/acg_read_mode_0.svg new file mode 100644 index 0000000..2894408 --- /dev/null +++ b/src/assets/icons/acg_read_mode_0.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/acg_sort.svg b/src/assets/icons/acg_sort.svg new file mode 100644 index 0000000..16d0394 --- /dev/null +++ b/src/assets/icons/acg_sort.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/acg_sort_0.svg b/src/assets/icons/acg_sort_0.svg new file mode 100644 index 0000000..668ad9f --- /dev/null +++ b/src/assets/icons/acg_sort_0.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/acg_sort_1.svg b/src/assets/icons/acg_sort_1.svg new file mode 100644 index 0000000..7181842 --- /dev/null +++ b/src/assets/icons/acg_sort_1.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/acg_text_prev.svg b/src/assets/icons/acg_text_prev.svg new file mode 100644 index 0000000..f818003 --- /dev/null +++ b/src/assets/icons/acg_text_prev.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/acg_video_episode.svg b/src/assets/icons/acg_video_episode.svg new file mode 100644 index 0000000..5d65c80 --- /dev/null +++ b/src/assets/icons/acg_video_episode.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/assets/icons/activity.svg b/src/assets/icons/activity.svg new file mode 100644 index 0000000..9d44060 --- /dev/null +++ b/src/assets/icons/activity.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/add_bank.svg b/src/assets/icons/add_bank.svg new file mode 100644 index 0000000..6509ecb --- /dev/null +++ b/src/assets/icons/add_bank.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/aiAdd.svg b/src/assets/icons/aiAdd.svg new file mode 100644 index 0000000..1764ecf --- /dev/null +++ b/src/assets/icons/aiAdd.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/aiClose.svg b/src/assets/icons/aiClose.svg new file mode 100644 index 0000000..c855f5b --- /dev/null +++ b/src/assets/icons/aiClose.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/aiFail.svg b/src/assets/icons/aiFail.svg new file mode 100644 index 0000000..7ac2495 --- /dev/null +++ b/src/assets/icons/aiFail.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/aiText.svg b/src/assets/icons/aiText.svg new file mode 100644 index 0000000..77fcea5 --- /dev/null +++ b/src/assets/icons/aiText.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/ai_cover_video_down.svg b/src/assets/icons/ai_cover_video_down.svg new file mode 100644 index 0000000..e115f95 --- /dev/null +++ b/src/assets/icons/ai_cover_video_down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/ai_cover_video_item.svg b/src/assets/icons/ai_cover_video_item.svg new file mode 100644 index 0000000..dcace9f --- /dev/null +++ b/src/assets/icons/ai_cover_video_item.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/ai_cover_video_item_active.svg b/src/assets/icons/ai_cover_video_item_active.svg new file mode 100644 index 0000000..90be519 --- /dev/null +++ b/src/assets/icons/ai_cover_video_item_active.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/ai_cover_video_type.svg b/src/assets/icons/ai_cover_video_type.svg new file mode 100644 index 0000000..d781b83 --- /dev/null +++ b/src/assets/icons/ai_cover_video_type.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/ai_cover_video_up.svg b/src/assets/icons/ai_cover_video_up.svg new file mode 100644 index 0000000..869764e --- /dev/null +++ b/src/assets/icons/ai_cover_video_up.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/aicamera.svg b/src/assets/icons/aicamera.svg new file mode 100644 index 0000000..6835f93 --- /dev/null +++ b/src/assets/icons/aicamera.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/aiclothing.svg b/src/assets/icons/aiclothing.svg new file mode 100644 index 0000000..b226465 --- /dev/null +++ b/src/assets/icons/aiclothing.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/aidown.svg b/src/assets/icons/aidown.svg new file mode 100644 index 0000000..ca38049 --- /dev/null +++ b/src/assets/icons/aidown.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/aigallery.svg b/src/assets/icons/aigallery.svg new file mode 100644 index 0000000..61c6be4 --- /dev/null +++ b/src/assets/icons/aigallery.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/aitextCover.svg b/src/assets/icons/aitextCover.svg new file mode 100644 index 0000000..f703cf5 --- /dev/null +++ b/src/assets/icons/aitextCover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/aiup.svg b/src/assets/icons/aiup.svg new file mode 100644 index 0000000..7b97839 --- /dev/null +++ b/src/assets/icons/aiup.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/alipay.svg b/src/assets/icons/alipay.svg new file mode 100644 index 0000000..bdbe784 --- /dev/null +++ b/src/assets/icons/alipay.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/arrow-down1.svg b/src/assets/icons/arrow-down1.svg new file mode 100644 index 0000000..2fd5a0e --- /dev/null +++ b/src/assets/icons/arrow-down1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/arrow-down2.svg b/src/assets/icons/arrow-down2.svg new file mode 100644 index 0000000..64f5543 --- /dev/null +++ b/src/assets/icons/arrow-down2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/arrow-up1.svg b/src/assets/icons/arrow-up1.svg new file mode 100644 index 0000000..6cedbe4 --- /dev/null +++ b/src/assets/icons/arrow-up1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/arrow-up2.svg b/src/assets/icons/arrow-up2.svg new file mode 100644 index 0000000..00c3a72 --- /dev/null +++ b/src/assets/icons/arrow-up2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/audioIcon.svg b/src/assets/icons/audioIcon.svg new file mode 100644 index 0000000..d706fef --- /dev/null +++ b/src/assets/icons/audioIcon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/audioIcon1.svg b/src/assets/icons/audioIcon1.svg new file mode 100644 index 0000000..f998b59 --- /dev/null +++ b/src/assets/icons/audioIcon1.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/audioRandom.svg b/src/assets/icons/audioRandom.svg new file mode 100644 index 0000000..ba1d082 --- /dev/null +++ b/src/assets/icons/audioRandom.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/avActress.svg b/src/assets/icons/avActress.svg new file mode 100644 index 0000000..df64c3c --- /dev/null +++ b/src/assets/icons/avActress.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/avatar_add.svg b/src/assets/icons/avatar_add.svg new file mode 100644 index 0000000..5efa51a --- /dev/null +++ b/src/assets/icons/avatar_add.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/back.svg b/src/assets/icons/back.svg new file mode 100644 index 0000000..b8c83a3 --- /dev/null +++ b/src/assets/icons/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/back1.svg b/src/assets/icons/back1.svg new file mode 100644 index 0000000..c383883 --- /dev/null +++ b/src/assets/icons/back1.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/back2.svg b/src/assets/icons/back2.svg new file mode 100644 index 0000000..c383883 --- /dev/null +++ b/src/assets/icons/back2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/backIcon.svg b/src/assets/icons/backIcon.svg new file mode 100644 index 0000000..fbf79d9 --- /dev/null +++ b/src/assets/icons/backIcon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/back_black.svg b/src/assets/icons/back_black.svg new file mode 100644 index 0000000..10f9e82 --- /dev/null +++ b/src/assets/icons/back_black.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/back_white.svg b/src/assets/icons/back_white.svg new file mode 100644 index 0000000..b8c83a3 --- /dev/null +++ b/src/assets/icons/back_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/back_white_round.svg b/src/assets/icons/back_white_round.svg new file mode 100644 index 0000000..fe6476e --- /dev/null +++ b/src/assets/icons/back_white_round.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/back_white_round1.svg b/src/assets/icons/back_white_round1.svg new file mode 100644 index 0000000..da3bd95 --- /dev/null +++ b/src/assets/icons/back_white_round1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/bankDelIcon.svg b/src/assets/icons/bankDelIcon.svg new file mode 100644 index 0000000..725b254 --- /dev/null +++ b/src/assets/icons/bankDelIcon.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/assets/icons/bank_selected.svg b/src/assets/icons/bank_selected.svg new file mode 100644 index 0000000..0a74f28 --- /dev/null +++ b/src/assets/icons/bank_selected.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/bank_unselect.svg b/src/assets/icons/bank_unselect.svg new file mode 100644 index 0000000..3c3782f --- /dev/null +++ b/src/assets/icons/bank_unselect.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/bankcard.svg b/src/assets/icons/bankcard.svg new file mode 100644 index 0000000..7f46b7d --- /dev/null +++ b/src/assets/icons/bankcard.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/brown-arrow-r.svg b/src/assets/icons/brown-arrow-r.svg new file mode 100644 index 0000000..9d56468 --- /dev/null +++ b/src/assets/icons/brown-arrow-r.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/icons/browse.svg b/src/assets/icons/browse.svg new file mode 100644 index 0000000..3cda589 --- /dev/null +++ b/src/assets/icons/browse.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/buyUnlock.svg b/src/assets/icons/buyUnlock.svg new file mode 100644 index 0000000..9df413f --- /dev/null +++ b/src/assets/icons/buyUnlock.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/calendar.svg b/src/assets/icons/calendar.svg new file mode 100644 index 0000000..e068647 --- /dev/null +++ b/src/assets/icons/calendar.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/icons/cartoon.svg b/src/assets/icons/cartoon.svg new file mode 100644 index 0000000..575dd75 --- /dev/null +++ b/src/assets/icons/cartoon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/certified.svg b/src/assets/icons/certified.svg new file mode 100644 index 0000000..b5b89df --- /dev/null +++ b/src/assets/icons/certified.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/changeLineIcon.svg b/src/assets/icons/changeLineIcon.svg new file mode 100644 index 0000000..273dea3 --- /dev/null +++ b/src/assets/icons/changeLineIcon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/checkbox-0.svg b/src/assets/icons/checkbox-0.svg new file mode 100644 index 0000000..104bd0b --- /dev/null +++ b/src/assets/icons/checkbox-0.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/checkbox-1.svg b/src/assets/icons/checkbox-1.svg new file mode 100644 index 0000000..91059a3 --- /dev/null +++ b/src/assets/icons/checkbox-1.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/classification.svg b/src/assets/icons/classification.svg new file mode 100644 index 0000000..c9aad6e --- /dev/null +++ b/src/assets/icons/classification.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/clear-red.svg b/src/assets/icons/clear-red.svg new file mode 100644 index 0000000..af9c0b1 --- /dev/null +++ b/src/assets/icons/clear-red.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/close.svg b/src/assets/icons/close.svg new file mode 100644 index 0000000..b760956 --- /dev/null +++ b/src/assets/icons/close.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/closeBlack.svg b/src/assets/icons/closeBlack.svg new file mode 100644 index 0000000..0f67879 --- /dev/null +++ b/src/assets/icons/closeBlack.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/closeIosAppStore.svg b/src/assets/icons/closeIosAppStore.svg new file mode 100644 index 0000000..ad6afdb --- /dev/null +++ b/src/assets/icons/closeIosAppStore.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/close_comment.svg b/src/assets/icons/close_comment.svg new file mode 100644 index 0000000..35f7428 --- /dev/null +++ b/src/assets/icons/close_comment.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/assets/icons/collect.svg b/src/assets/icons/collect.svg new file mode 100644 index 0000000..78ecd3a --- /dev/null +++ b/src/assets/icons/collect.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/collectIcon.svg b/src/assets/icons/collectIcon.svg new file mode 100644 index 0000000..7f570bf --- /dev/null +++ b/src/assets/icons/collectIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/comment-expand.svg b/src/assets/icons/comment-expand.svg new file mode 100644 index 0000000..259a12f --- /dev/null +++ b/src/assets/icons/comment-expand.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/comment-reply.svg b/src/assets/icons/comment-reply.svg new file mode 100644 index 0000000..afb5817 --- /dev/null +++ b/src/assets/icons/comment-reply.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/assets/icons/comment-zan-0.svg b/src/assets/icons/comment-zan-0.svg new file mode 100644 index 0000000..cbdf170 --- /dev/null +++ b/src/assets/icons/comment-zan-0.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/comment-zan-1.svg b/src/assets/icons/comment-zan-1.svg new file mode 100644 index 0000000..87e8981 --- /dev/null +++ b/src/assets/icons/comment-zan-1.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/commentMsg.svg b/src/assets/icons/commentMsg.svg new file mode 100644 index 0000000..0a6980d --- /dev/null +++ b/src/assets/icons/commentMsg.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/commentUnZan.svg b/src/assets/icons/commentUnZan.svg new file mode 100644 index 0000000..119761e --- /dev/null +++ b/src/assets/icons/commentUnZan.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/commentZan.svg b/src/assets/icons/commentZan.svg new file mode 100644 index 0000000..a82dd2d --- /dev/null +++ b/src/assets/icons/commentZan.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/commit_huifu.svg b/src/assets/icons/commit_huifu.svg new file mode 100644 index 0000000..81adfb7 --- /dev/null +++ b/src/assets/icons/commit_huifu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/commit_inzan.svg b/src/assets/icons/commit_inzan.svg new file mode 100644 index 0000000..f55a4e0 --- /dev/null +++ b/src/assets/icons/commit_inzan.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/commit_like.svg b/src/assets/icons/commit_like.svg new file mode 100644 index 0000000..0564a86 --- /dev/null +++ b/src/assets/icons/commit_like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/commit_mess.svg b/src/assets/icons/commit_mess.svg new file mode 100644 index 0000000..7db2157 --- /dev/null +++ b/src/assets/icons/commit_mess.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/commit_send.svg b/src/assets/icons/commit_send.svg new file mode 100644 index 0000000..f6f3f0b --- /dev/null +++ b/src/assets/icons/commit_send.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/commit_unlike.svg b/src/assets/icons/commit_unlike.svg new file mode 100644 index 0000000..52172f3 --- /dev/null +++ b/src/assets/icons/commit_unlike.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/commit_zan.svg b/src/assets/icons/commit_zan.svg new file mode 100644 index 0000000..f2e66fc --- /dev/null +++ b/src/assets/icons/commit_zan.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/community_add.svg b/src/assets/icons/community_add.svg new file mode 100644 index 0000000..d9230df --- /dev/null +++ b/src/assets/icons/community_add.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/community_close.svg b/src/assets/icons/community_close.svg new file mode 100644 index 0000000..f9508c2 --- /dev/null +++ b/src/assets/icons/community_close.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/community_info.svg b/src/assets/icons/community_info.svg new file mode 100644 index 0000000..aed0be2 --- /dev/null +++ b/src/assets/icons/community_info.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/community_like.svg b/src/assets/icons/community_like.svg new file mode 100644 index 0000000..0fc0336 --- /dev/null +++ b/src/assets/icons/community_like.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/community_reward.svg b/src/assets/icons/community_reward.svg new file mode 100644 index 0000000..818826e --- /dev/null +++ b/src/assets/icons/community_reward.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/community_search.svg b/src/assets/icons/community_search.svg new file mode 100644 index 0000000..bd01718 --- /dev/null +++ b/src/assets/icons/community_search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/community_select.svg b/src/assets/icons/community_select.svg new file mode 100644 index 0000000..94f2a2e --- /dev/null +++ b/src/assets/icons/community_select.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/icons/community_share.svg b/src/assets/icons/community_share.svg new file mode 100644 index 0000000..01e71e1 --- /dev/null +++ b/src/assets/icons/community_share.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/community_trumpet.svg b/src/assets/icons/community_trumpet.svg new file mode 100644 index 0000000..65b1a49 --- /dev/null +++ b/src/assets/icons/community_trumpet.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/community_unlike.svg b/src/assets/icons/community_unlike.svg new file mode 100644 index 0000000..246277e --- /dev/null +++ b/src/assets/icons/community_unlike.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/community_unselect.svg b/src/assets/icons/community_unselect.svg new file mode 100644 index 0000000..4691bf8 --- /dev/null +++ b/src/assets/icons/community_unselect.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/conis_icon.svg b/src/assets/icons/conis_icon.svg new file mode 100644 index 0000000..ea4ca4c --- /dev/null +++ b/src/assets/icons/conis_icon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/copy.svg b/src/assets/icons/copy.svg new file mode 100644 index 0000000..1070083 --- /dev/null +++ b/src/assets/icons/copy.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/cover_pic.svg b/src/assets/icons/cover_pic.svg new file mode 100644 index 0000000..6ecafe0 --- /dev/null +++ b/src/assets/icons/cover_pic.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/dating.svg b/src/assets/icons/dating.svg new file mode 100644 index 0000000..0d58d52 --- /dev/null +++ b/src/assets/icons/dating.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/ddown.svg b/src/assets/icons/ddown.svg new file mode 100644 index 0000000..f523425 --- /dev/null +++ b/src/assets/icons/ddown.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/delBtn.svg b/src/assets/icons/delBtn.svg new file mode 100644 index 0000000..ec7d8c4 --- /dev/null +++ b/src/assets/icons/delBtn.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/icons/delIconNew.svg b/src/assets/icons/delIconNew.svg new file mode 100644 index 0000000..834319c --- /dev/null +++ b/src/assets/icons/delIconNew.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/delRecord.svg b/src/assets/icons/delRecord.svg new file mode 100644 index 0000000..1f62aa0 --- /dev/null +++ b/src/assets/icons/delRecord.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/down.svg b/src/assets/icons/down.svg new file mode 100644 index 0000000..12606e7 --- /dev/null +++ b/src/assets/icons/down.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/equalSign.svg b/src/assets/icons/equalSign.svg new file mode 100644 index 0000000..9fb966a --- /dev/null +++ b/src/assets/icons/equalSign.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/exchange.svg b/src/assets/icons/exchange.svg new file mode 100644 index 0000000..825a622 --- /dev/null +++ b/src/assets/icons/exchange.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/expand.svg b/src/assets/icons/expand.svg new file mode 100644 index 0000000..f640b53 --- /dev/null +++ b/src/assets/icons/expand.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/eye-open.svg b/src/assets/icons/eye-open.svg new file mode 100644 index 0000000..591f473 --- /dev/null +++ b/src/assets/icons/eye-open.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/eye.svg b/src/assets/icons/eye.svg new file mode 100644 index 0000000..2d5b361 --- /dev/null +++ b/src/assets/icons/eye.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/eyeClose.svg b/src/assets/icons/eyeClose.svg new file mode 100644 index 0000000..dab8605 --- /dev/null +++ b/src/assets/icons/eyeClose.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/eyeOpen.svg b/src/assets/icons/eyeOpen.svg new file mode 100644 index 0000000..3796706 --- /dev/null +++ b/src/assets/icons/eyeOpen.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/eyeWhite.svg b/src/assets/icons/eyeWhite.svg new file mode 100644 index 0000000..5544a34 --- /dev/null +++ b/src/assets/icons/eyeWhite.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/false.svg b/src/assets/icons/false.svg new file mode 100644 index 0000000..d52d11c --- /dev/null +++ b/src/assets/icons/false.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/female.svg b/src/assets/icons/female.svg new file mode 100644 index 0000000..3519deb --- /dev/null +++ b/src/assets/icons/female.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/filmCompanies.svg b/src/assets/icons/filmCompanies.svg new file mode 100644 index 0000000..fca2a4c --- /dev/null +++ b/src/assets/icons/filmCompanies.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/filmLibrary.svg b/src/assets/icons/filmLibrary.svg new file mode 100644 index 0000000..07e49f4 --- /dev/null +++ b/src/assets/icons/filmLibrary.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/icons/fire-top1.svg b/src/assets/icons/fire-top1.svg new file mode 100644 index 0000000..3dfd9e1 --- /dev/null +++ b/src/assets/icons/fire-top1.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/fire-top2.svg b/src/assets/icons/fire-top2.svg new file mode 100644 index 0000000..c75438f --- /dev/null +++ b/src/assets/icons/fire-top2.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/fire-top3.svg b/src/assets/icons/fire-top3.svg new file mode 100644 index 0000000..1ae344f --- /dev/null +++ b/src/assets/icons/fire-top3.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/fire.svg b/src/assets/icons/fire.svg new file mode 100644 index 0000000..bdcd43d --- /dev/null +++ b/src/assets/icons/fire.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/fireIcon.svg b/src/assets/icons/fireIcon.svg new file mode 100644 index 0000000..1f4be64 --- /dev/null +++ b/src/assets/icons/fireIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/follow_add.svg b/src/assets/icons/follow_add.svg new file mode 100644 index 0000000..dd7a1ac --- /dev/null +++ b/src/assets/icons/follow_add.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/follow_add_user.svg b/src/assets/icons/follow_add_user.svg new file mode 100644 index 0000000..ed40479 --- /dev/null +++ b/src/assets/icons/follow_add_user.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/follow_add_yes.svg b/src/assets/icons/follow_add_yes.svg new file mode 100644 index 0000000..7551827 --- /dev/null +++ b/src/assets/icons/follow_add_yes.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/free.svg b/src/assets/icons/free.svg new file mode 100644 index 0000000..9f1c95b --- /dev/null +++ b/src/assets/icons/free.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/freeLabel.svg b/src/assets/icons/freeLabel.svg new file mode 100644 index 0000000..1060e4a --- /dev/null +++ b/src/assets/icons/freeLabel.svg @@ -0,0 +1,6 @@ + + + + 免费 + + diff --git a/src/assets/icons/getVip.svg b/src/assets/icons/getVip.svg new file mode 100644 index 0000000..c5325b7 --- /dev/null +++ b/src/assets/icons/getVip.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/gold.svg b/src/assets/icons/gold.svg new file mode 100644 index 0000000..297aea3 --- /dev/null +++ b/src/assets/icons/gold.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/goldCommentIcon.svg b/src/assets/icons/goldCommentIcon.svg new file mode 100644 index 0000000..1956313 --- /dev/null +++ b/src/assets/icons/goldCommentIcon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/goldLabel.svg b/src/assets/icons/goldLabel.svg new file mode 100644 index 0000000..be6546d --- /dev/null +++ b/src/assets/icons/goldLabel.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/greyRefreshIcon.svg b/src/assets/icons/greyRefreshIcon.svg new file mode 100644 index 0000000..6df1a06 --- /dev/null +++ b/src/assets/icons/greyRefreshIcon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/grey_right_arrow.svg b/src/assets/icons/grey_right_arrow.svg new file mode 100644 index 0000000..75c17d2 --- /dev/null +++ b/src/assets/icons/grey_right_arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/head.svg b/src/assets/icons/head.svg new file mode 100644 index 0000000..7ea0961 --- /dev/null +++ b/src/assets/icons/head.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/heart.svg b/src/assets/icons/heart.svg new file mode 100644 index 0000000..19ae72a --- /dev/null +++ b/src/assets/icons/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/homeVideoCollect.svg b/src/assets/icons/homeVideoCollect.svg new file mode 100644 index 0000000..d5bd199 --- /dev/null +++ b/src/assets/icons/homeVideoCollect.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/homeVideoUnCollect.svg b/src/assets/icons/homeVideoUnCollect.svg new file mode 100644 index 0000000..69547a6 --- /dev/null +++ b/src/assets/icons/homeVideoUnCollect.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/hot.svg b/src/assets/icons/hot.svg new file mode 100644 index 0000000..bf14740 --- /dev/null +++ b/src/assets/icons/hot.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/hotIcon.svg b/src/assets/icons/hotIcon.svg new file mode 100644 index 0000000..e26335e --- /dev/null +++ b/src/assets/icons/hotIcon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/ht_close.svg b/src/assets/icons/ht_close.svg new file mode 100644 index 0000000..9901a3c --- /dev/null +++ b/src/assets/icons/ht_close.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/im-adv-close.svg b/src/assets/icons/im-adv-close.svg new file mode 100644 index 0000000..a857953 --- /dev/null +++ b/src/assets/icons/im-adv-close.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/location.svg b/src/assets/icons/location.svg new file mode 100644 index 0000000..0070c8c --- /dev/null +++ b/src/assets/icons/location.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/lottery.svg b/src/assets/icons/lottery.svg new file mode 100644 index 0000000..e2690c9 --- /dev/null +++ b/src/assets/icons/lottery.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/madAi.svg b/src/assets/icons/madAi.svg new file mode 100644 index 0000000..ce29f13 --- /dev/null +++ b/src/assets/icons/madAi.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/make_money.svg b/src/assets/icons/make_money.svg new file mode 100644 index 0000000..ca91b9a --- /dev/null +++ b/src/assets/icons/make_money.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/male.svg b/src/assets/icons/male.svg new file mode 100644 index 0000000..b5c472c --- /dev/null +++ b/src/assets/icons/male.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/map.svg b/src/assets/icons/map.svg new file mode 100644 index 0000000..25f16c6 --- /dev/null +++ b/src/assets/icons/map.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/marqueeClose.svg b/src/assets/icons/marqueeClose.svg new file mode 100644 index 0000000..d012db4 --- /dev/null +++ b/src/assets/icons/marqueeClose.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/message.svg b/src/assets/icons/message.svg new file mode 100644 index 0000000..0f4a3ae --- /dev/null +++ b/src/assets/icons/message.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/message1.svg b/src/assets/icons/message1.svg new file mode 100644 index 0000000..0a60427 --- /dev/null +++ b/src/assets/icons/message1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/message2.svg b/src/assets/icons/message2.svg new file mode 100644 index 0000000..44aee1a --- /dev/null +++ b/src/assets/icons/message2.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/assets/icons/more.svg b/src/assets/icons/more.svg new file mode 100644 index 0000000..80ad12b --- /dev/null +++ b/src/assets/icons/more.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/moreIcon.svg b/src/assets/icons/moreIcon.svg new file mode 100644 index 0000000..2ee3441 --- /dev/null +++ b/src/assets/icons/moreIcon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/movieCollect.svg b/src/assets/icons/movieCollect.svg new file mode 100644 index 0000000..c720d2a --- /dev/null +++ b/src/assets/icons/movieCollect.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/movieUnCollect.svg b/src/assets/icons/movieUnCollect.svg new file mode 100644 index 0000000..205095a --- /dev/null +++ b/src/assets/icons/movieUnCollect.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/movieUnZan.svg b/src/assets/icons/movieUnZan.svg new file mode 100644 index 0000000..2f95358 --- /dev/null +++ b/src/assets/icons/movieUnZan.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/movieZan.svg b/src/assets/icons/movieZan.svg new file mode 100644 index 0000000..2f187bf --- /dev/null +++ b/src/assets/icons/movieZan.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/msg.svg b/src/assets/icons/msg.svg new file mode 100644 index 0000000..ad78a83 --- /dev/null +++ b/src/assets/icons/msg.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/msg2.svg b/src/assets/icons/msg2.svg new file mode 100644 index 0000000..bb315e9 --- /dev/null +++ b/src/assets/icons/msg2.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/new_search.svg b/src/assets/icons/new_search.svg new file mode 100644 index 0000000..8eca5c2 --- /dev/null +++ b/src/assets/icons/new_search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/not_horn.svg b/src/assets/icons/not_horn.svg new file mode 100644 index 0000000..5f28094 --- /dev/null +++ b/src/assets/icons/not_horn.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/notice.svg b/src/assets/icons/notice.svg new file mode 100644 index 0000000..65b1a49 --- /dev/null +++ b/src/assets/icons/notice.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/novel.svg b/src/assets/icons/novel.svg new file mode 100644 index 0000000..b9181b4 --- /dev/null +++ b/src/assets/icons/novel.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/openDown.svg b/src/assets/icons/openDown.svg new file mode 100644 index 0000000..193cf24 --- /dev/null +++ b/src/assets/icons/openDown.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/payment-guide-close.svg b/src/assets/icons/payment-guide-close.svg new file mode 100644 index 0000000..e6f6222 --- /dev/null +++ b/src/assets/icons/payment-guide-close.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/picture2Video.svg b/src/assets/icons/picture2Video.svg new file mode 100644 index 0000000..848bad3 --- /dev/null +++ b/src/assets/icons/picture2Video.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/playCountIcon.svg b/src/assets/icons/playCountIcon.svg new file mode 100644 index 0000000..987b6b0 --- /dev/null +++ b/src/assets/icons/playCountIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/playIcon.svg b/src/assets/icons/playIcon.svg new file mode 100644 index 0000000..14180a4 --- /dev/null +++ b/src/assets/icons/playIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/playIconCover.svg b/src/assets/icons/playIconCover.svg new file mode 100644 index 0000000..8db1f32 --- /dev/null +++ b/src/assets/icons/playIconCover.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/playIconHollow.svg b/src/assets/icons/playIconHollow.svg new file mode 100644 index 0000000..5f2a00c --- /dev/null +++ b/src/assets/icons/playIconHollow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/playIconSquare.svg b/src/assets/icons/playIconSquare.svg new file mode 100644 index 0000000..f002f2d --- /dev/null +++ b/src/assets/icons/playIconSquare.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/popup_close.svg b/src/assets/icons/popup_close.svg new file mode 100644 index 0000000..0b713aa --- /dev/null +++ b/src/assets/icons/popup_close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/post_commit.svg b/src/assets/icons/post_commit.svg new file mode 100644 index 0000000..1eb4065 --- /dev/null +++ b/src/assets/icons/post_commit.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/post_eye.svg b/src/assets/icons/post_eye.svg new file mode 100644 index 0000000..1588b4a --- /dev/null +++ b/src/assets/icons/post_eye.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/post_eye2.svg b/src/assets/icons/post_eye2.svg new file mode 100644 index 0000000..dfa5d72 --- /dev/null +++ b/src/assets/icons/post_eye2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/post_follow.svg b/src/assets/icons/post_follow.svg new file mode 100644 index 0000000..5aa3dba --- /dev/null +++ b/src/assets/icons/post_follow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/post_followin.svg b/src/assets/icons/post_followin.svg new file mode 100644 index 0000000..8358bf6 --- /dev/null +++ b/src/assets/icons/post_followin.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/post_heart.svg b/src/assets/icons/post_heart.svg new file mode 100644 index 0000000..7233a5e --- /dev/null +++ b/src/assets/icons/post_heart.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/post_inheart.svg b/src/assets/icons/post_inheart.svg new file mode 100644 index 0000000..4700e4a --- /dev/null +++ b/src/assets/icons/post_inheart.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/post_lock.svg b/src/assets/icons/post_lock.svg new file mode 100644 index 0000000..1061a02 --- /dev/null +++ b/src/assets/icons/post_lock.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/post_send.svg b/src/assets/icons/post_send.svg new file mode 100644 index 0000000..e55fae2 --- /dev/null +++ b/src/assets/icons/post_send.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/post_share.svg b/src/assets/icons/post_share.svg new file mode 100644 index 0000000..46699e3 --- /dev/null +++ b/src/assets/icons/post_share.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/post_share2.svg b/src/assets/icons/post_share2.svg new file mode 100644 index 0000000..bffc591 --- /dev/null +++ b/src/assets/icons/post_share2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/preSaleRightArrow.svg b/src/assets/icons/preSaleRightArrow.svg new file mode 100644 index 0000000..f99ca32 --- /dev/null +++ b/src/assets/icons/preSaleRightArrow.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/previewDelete.svg b/src/assets/icons/previewDelete.svg new file mode 100644 index 0000000..a8750d2 --- /dev/null +++ b/src/assets/icons/previewDelete.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/processing.svg b/src/assets/icons/processing.svg new file mode 100644 index 0000000..cd1bb01 --- /dev/null +++ b/src/assets/icons/processing.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/publishRight.svg b/src/assets/icons/publishRight.svg new file mode 100644 index 0000000..7ef01fd --- /dev/null +++ b/src/assets/icons/publishRight.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/publish_#.svg b/src/assets/icons/publish_#.svg new file mode 100644 index 0000000..99b4658 --- /dev/null +++ b/src/assets/icons/publish_#.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/radio-select.svg b/src/assets/icons/radio-select.svg new file mode 100644 index 0000000..f895f32 --- /dev/null +++ b/src/assets/icons/radio-select.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/radio-unselect.svg b/src/assets/icons/radio-unselect.svg new file mode 100644 index 0000000..94dc9bc --- /dev/null +++ b/src/assets/icons/radio-unselect.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/rank-like.svg b/src/assets/icons/rank-like.svg new file mode 100644 index 0000000..1f8d5c3 --- /dev/null +++ b/src/assets/icons/rank-like.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/recruitUp.svg b/src/assets/icons/recruitUp.svg new file mode 100644 index 0000000..e37bc32 --- /dev/null +++ b/src/assets/icons/recruitUp.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + 招 募 UP 主 + + + diff --git a/src/assets/icons/rectangle.svg b/src/assets/icons/rectangle.svg new file mode 100644 index 0000000..39d0665 --- /dev/null +++ b/src/assets/icons/rectangle.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/icons/red_delete.svg b/src/assets/icons/red_delete.svg new file mode 100644 index 0000000..cc6fecc --- /dev/null +++ b/src/assets/icons/red_delete.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/red_right_arrow.svg b/src/assets/icons/red_right_arrow.svg new file mode 100644 index 0000000..fbcdc1b --- /dev/null +++ b/src/assets/icons/red_right_arrow.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/refresh.svg b/src/assets/icons/refresh.svg new file mode 100644 index 0000000..3eee4c0 --- /dev/null +++ b/src/assets/icons/refresh.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/refreshIcon.svg b/src/assets/icons/refreshIcon.svg new file mode 100644 index 0000000..85b14e7 --- /dev/null +++ b/src/assets/icons/refreshIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/reply.svg b/src/assets/icons/reply.svg new file mode 100644 index 0000000..275823f --- /dev/null +++ b/src/assets/icons/reply.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/reward.svg b/src/assets/icons/reward.svg new file mode 100644 index 0000000..818826e --- /dev/null +++ b/src/assets/icons/reward.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/rightArrow.svg b/src/assets/icons/rightArrow.svg new file mode 100644 index 0000000..5a53dc4 --- /dev/null +++ b/src/assets/icons/rightArrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/rightArrow1.svg b/src/assets/icons/rightArrow1.svg new file mode 100644 index 0000000..1c3cb53 --- /dev/null +++ b/src/assets/icons/rightArrow1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/rightArrow3.svg b/src/assets/icons/rightArrow3.svg new file mode 100644 index 0000000..4d0e35a --- /dev/null +++ b/src/assets/icons/rightArrow3.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/right_arrow.svg b/src/assets/icons/right_arrow.svg new file mode 100644 index 0000000..eab7faa --- /dev/null +++ b/src/assets/icons/right_arrow.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/right_arrow_round.svg b/src/assets/icons/right_arrow_round.svg new file mode 100644 index 0000000..2e4b4ae --- /dev/null +++ b/src/assets/icons/right_arrow_round.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/right_arrow_white.svg b/src/assets/icons/right_arrow_white.svg new file mode 100644 index 0000000..92628da --- /dev/null +++ b/src/assets/icons/right_arrow_white.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/search.svg b/src/assets/icons/search.svg new file mode 100644 index 0000000..73bc80b --- /dev/null +++ b/src/assets/icons/search.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/searchClear.svg b/src/assets/icons/searchClear.svg new file mode 100644 index 0000000..2191446 --- /dev/null +++ b/src/assets/icons/searchClear.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/searchHome.svg b/src/assets/icons/searchHome.svg new file mode 100644 index 0000000..0ae2c06 --- /dev/null +++ b/src/assets/icons/searchHome.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/searchMore.svg b/src/assets/icons/searchMore.svg new file mode 100644 index 0000000..8cdf2ca --- /dev/null +++ b/src/assets/icons/searchMore.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/search_new.svg b/src/assets/icons/search_new.svg new file mode 100644 index 0000000..06b94ca --- /dev/null +++ b/src/assets/icons/search_new.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/selectLineBg.png b/src/assets/icons/selectLineBg.png new file mode 100644 index 0000000..b51347e Binary files /dev/null and b/src/assets/icons/selectLineBg.png differ diff --git a/src/assets/icons/send_images.svg b/src/assets/icons/send_images.svg new file mode 100644 index 0000000..e8eb789 --- /dev/null +++ b/src/assets/icons/send_images.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/service.svg b/src/assets/icons/service.svg new file mode 100644 index 0000000..53625bd --- /dev/null +++ b/src/assets/icons/service.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/share.svg b/src/assets/icons/share.svg new file mode 100644 index 0000000..1b9edf2 --- /dev/null +++ b/src/assets/icons/share.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/share1.svg b/src/assets/icons/share1.svg new file mode 100644 index 0000000..64c0e48 --- /dev/null +++ b/src/assets/icons/share1.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/share2.svg b/src/assets/icons/share2.svg new file mode 100644 index 0000000..62f9f9b --- /dev/null +++ b/src/assets/icons/share2.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/shortCommit.svg b/src/assets/icons/shortCommit.svg new file mode 100644 index 0000000..bd30c3b --- /dev/null +++ b/src/assets/icons/shortCommit.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/shortLike.svg b/src/assets/icons/shortLike.svg new file mode 100644 index 0000000..3be6c82 --- /dev/null +++ b/src/assets/icons/shortLike.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/shortLook.svg b/src/assets/icons/shortLook.svg new file mode 100644 index 0000000..d09dc91 --- /dev/null +++ b/src/assets/icons/shortLook.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/shortShare.svg b/src/assets/icons/shortShare.svg new file mode 100644 index 0000000..bb16bba --- /dev/null +++ b/src/assets/icons/shortShare.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/signinBack.svg b/src/assets/icons/signinBack.svg new file mode 100644 index 0000000..4ea7302 --- /dev/null +++ b/src/assets/icons/signinBack.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/sort1.svg b/src/assets/icons/sort1.svg new file mode 100644 index 0000000..c4ac657 --- /dev/null +++ b/src/assets/icons/sort1.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/sort2.svg b/src/assets/icons/sort2.svg new file mode 100644 index 0000000..45885e2 --- /dev/null +++ b/src/assets/icons/sort2.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/sort3.svg b/src/assets/icons/sort3.svg new file mode 100644 index 0000000..db9ddc1 --- /dev/null +++ b/src/assets/icons/sort3.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/icons/square.svg b/src/assets/icons/square.svg new file mode 100644 index 0000000..4cff2df --- /dev/null +++ b/src/assets/icons/square.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/assets/icons/star.svg b/src/assets/icons/star.svg new file mode 100644 index 0000000..e808cd8 --- /dev/null +++ b/src/assets/icons/star.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/tabDarkIcon.svg b/src/assets/icons/tabDarkIcon.svg new file mode 100644 index 0000000..c349f30 --- /dev/null +++ b/src/assets/icons/tabDarkIcon.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/tabDarkIconActived.svg b/src/assets/icons/tabDarkIconActived.svg new file mode 100644 index 0000000..23b489f --- /dev/null +++ b/src/assets/icons/tabDarkIconActived.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/tabDeepIcon.svg b/src/assets/icons/tabDeepIcon.svg new file mode 100644 index 0000000..8edc371 --- /dev/null +++ b/src/assets/icons/tabDeepIcon.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/tabDeepIconActived.svg b/src/assets/icons/tabDeepIconActived.svg new file mode 100644 index 0000000..c3efa87 --- /dev/null +++ b/src/assets/icons/tabDeepIconActived.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/icons/tabMoreIcon.svg b/src/assets/icons/tabMoreIcon.svg new file mode 100644 index 0000000..399cf25 --- /dev/null +++ b/src/assets/icons/tabMoreIcon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/tabMoreIconActived.svg b/src/assets/icons/tabMoreIconActived.svg new file mode 100644 index 0000000..7af42d2 --- /dev/null +++ b/src/assets/icons/tabMoreIconActived.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/tabNewIcon.svg b/src/assets/icons/tabNewIcon.svg new file mode 100644 index 0000000..64a808f --- /dev/null +++ b/src/assets/icons/tabNewIcon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/tabNewIconActived.svg b/src/assets/icons/tabNewIconActived.svg new file mode 100644 index 0000000..9414ed4 --- /dev/null +++ b/src/assets/icons/tabNewIconActived.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/tabTenIcon.svg b/src/assets/icons/tabTenIcon.svg new file mode 100644 index 0000000..efbf4d5 --- /dev/null +++ b/src/assets/icons/tabTenIcon.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/icons/tabTenIconActived.svg b/src/assets/icons/tabTenIconActived.svg new file mode 100644 index 0000000..ee6b34b --- /dev/null +++ b/src/assets/icons/tabTenIconActived.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/icons/tabWeekIcon.svg b/src/assets/icons/tabWeekIcon.svg new file mode 100644 index 0000000..5e8c3a8 --- /dev/null +++ b/src/assets/icons/tabWeekIcon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/tabWeekIconActived.svg b/src/assets/icons/tabWeekIconActived.svg new file mode 100644 index 0000000..952f8ed --- /dev/null +++ b/src/assets/icons/tabWeekIconActived.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/taskGold.svg b/src/assets/icons/taskGold.svg new file mode 100644 index 0000000..157a930 --- /dev/null +++ b/src/assets/icons/taskGold.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/task_integral.svg b/src/assets/icons/task_integral.svg new file mode 100644 index 0000000..cd91766 --- /dev/null +++ b/src/assets/icons/task_integral.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/assets/icons/textCover.svg b/src/assets/icons/textCover.svg new file mode 100644 index 0000000..210392e --- /dev/null +++ b/src/assets/icons/textCover.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/theme-mode-dark.svg b/src/assets/icons/theme-mode-dark.svg new file mode 100644 index 0000000..b096a1e --- /dev/null +++ b/src/assets/icons/theme-mode-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/theme-mode-light.svg b/src/assets/icons/theme-mode-light.svg new file mode 100644 index 0000000..ec72cd0 --- /dev/null +++ b/src/assets/icons/theme-mode-light.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/assets/icons/tick.svg b/src/assets/icons/tick.svg new file mode 100644 index 0000000..b958506 --- /dev/null +++ b/src/assets/icons/tick.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/tikTok.svg b/src/assets/icons/tikTok.svg new file mode 100644 index 0000000..5bae5f5 --- /dev/null +++ b/src/assets/icons/tikTok.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/icons/top1.svg b/src/assets/icons/top1.svg new file mode 100644 index 0000000..5ad3830 --- /dev/null +++ b/src/assets/icons/top1.svg @@ -0,0 +1,12 @@ + + + + + + + + + + 1 + + diff --git a/src/assets/icons/top2.svg b/src/assets/icons/top2.svg new file mode 100644 index 0000000..c6d59c0 --- /dev/null +++ b/src/assets/icons/top2.svg @@ -0,0 +1,12 @@ + + + + + + + + + + 2 + + diff --git a/src/assets/icons/top3.svg b/src/assets/icons/top3.svg new file mode 100644 index 0000000..45f8253 --- /dev/null +++ b/src/assets/icons/top3.svg @@ -0,0 +1,12 @@ + + + + + + + + + + 3 + + diff --git a/src/assets/icons/topic.svg b/src/assets/icons/topic.svg new file mode 100644 index 0000000..8878766 --- /dev/null +++ b/src/assets/icons/topic.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/topicsHot.svg b/src/assets/icons/topicsHot.svg new file mode 100644 index 0000000..cb9ba8a --- /dev/null +++ b/src/assets/icons/topicsHot.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/true.svg b/src/assets/icons/true.svg new file mode 100644 index 0000000..5cc30b7 --- /dev/null +++ b/src/assets/icons/true.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/unZanIcon.svg b/src/assets/icons/unZanIcon.svg new file mode 100644 index 0000000..f2e66fc --- /dev/null +++ b/src/assets/icons/unZanIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/uncollect.svg b/src/assets/icons/uncollect.svg new file mode 100644 index 0000000..91f1dde --- /dev/null +++ b/src/assets/icons/uncollect.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/union.svg b/src/assets/icons/union.svg new file mode 100644 index 0000000..7f46b7d --- /dev/null +++ b/src/assets/icons/union.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/unshortLike.svg b/src/assets/icons/unshortLike.svg new file mode 100644 index 0000000..b3b4aa6 --- /dev/null +++ b/src/assets/icons/unshortLike.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/unzan.svg b/src/assets/icons/unzan.svg new file mode 100644 index 0000000..6e3eb83 --- /dev/null +++ b/src/assets/icons/unzan.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/upload_add.svg b/src/assets/icons/upload_add.svg new file mode 100644 index 0000000..e9e2e92 --- /dev/null +++ b/src/assets/icons/upload_add.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/upload_del.svg b/src/assets/icons/upload_del.svg new file mode 100644 index 0000000..d0f90a6 --- /dev/null +++ b/src/assets/icons/upload_del.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/assets/icons/usdt.svg b/src/assets/icons/usdt.svg new file mode 100644 index 0000000..033b83a --- /dev/null +++ b/src/assets/icons/usdt.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/userFocus.svg b/src/assets/icons/userFocus.svg new file mode 100644 index 0000000..7582cca --- /dev/null +++ b/src/assets/icons/userFocus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/vertica_video_type2.svg b/src/assets/icons/vertica_video_type2.svg new file mode 100644 index 0000000..e1e552d --- /dev/null +++ b/src/assets/icons/vertica_video_type2.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/vertica_video_type3.svg b/src/assets/icons/vertica_video_type3.svg new file mode 100644 index 0000000..6380fc8 --- /dev/null +++ b/src/assets/icons/vertica_video_type3.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/vertica_video_type4.svg b/src/assets/icons/vertica_video_type4.svg new file mode 100644 index 0000000..cc2e616 --- /dev/null +++ b/src/assets/icons/vertica_video_type4.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/viewMore1.svg b/src/assets/icons/viewMore1.svg new file mode 100644 index 0000000..91c047c --- /dev/null +++ b/src/assets/icons/viewMore1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/icons/vipLabel.svg b/src/assets/icons/vipLabel.svg new file mode 100644 index 0000000..359df8e --- /dev/null +++ b/src/assets/icons/vipLabel.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/assets/icons/vip_time.svg b/src/assets/icons/vip_time.svg new file mode 100644 index 0000000..0d4058f --- /dev/null +++ b/src/assets/icons/vip_time.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/vue.svg b/src/assets/icons/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/icons/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/warning.svg b/src/assets/icons/warning.svg new file mode 100644 index 0000000..400dd50 --- /dev/null +++ b/src/assets/icons/warning.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/icons/watch.svg b/src/assets/icons/watch.svg new file mode 100644 index 0000000..3cda589 --- /dev/null +++ b/src/assets/icons/watch.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icons/wechat.svg b/src/assets/icons/wechat.svg new file mode 100644 index 0000000..ae77132 --- /dev/null +++ b/src/assets/icons/wechat.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/assets/icons/whiteStar.svg b/src/assets/icons/whiteStar.svg new file mode 100644 index 0000000..37381c5 --- /dev/null +++ b/src/assets/icons/whiteStar.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/zan.svg b/src/assets/icons/zan.svg new file mode 100644 index 0000000..97295c6 --- /dev/null +++ b/src/assets/icons/zan.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/icons/zanIcon.svg b/src/assets/icons/zanIcon.svg new file mode 100644 index 0000000..f55a4e0 --- /dev/null +++ b/src/assets/icons/zanIcon.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/assets/icons/zeng.svg b/src/assets/icons/zeng.svg new file mode 100644 index 0000000..c0ac207 --- /dev/null +++ b/src/assets/icons/zeng.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/png/AiGirlFriend-bg.png b/src/assets/images/png/AiGirlFriend-bg.png new file mode 100644 index 0000000..513fc56 Binary files /dev/null and b/src/assets/images/png/AiGirlFriend-bg.png differ diff --git a/src/assets/images/png/AiGirlFriend-btn.png b/src/assets/images/png/AiGirlFriend-btn.png new file mode 100644 index 0000000..3a19b9d Binary files /dev/null and b/src/assets/images/png/AiGirlFriend-btn.png differ diff --git a/src/assets/images/png/AiGirlFriend-float-txt.png b/src/assets/images/png/AiGirlFriend-float-txt.png new file mode 100644 index 0000000..22bffcc Binary files /dev/null and b/src/assets/images/png/AiGirlFriend-float-txt.png differ diff --git a/src/assets/images/png/AiGirlFriend-header.png b/src/assets/images/png/AiGirlFriend-header.png new file mode 100644 index 0000000..13fc8e0 Binary files /dev/null and b/src/assets/images/png/AiGirlFriend-header.png differ diff --git a/src/assets/images/png/acg/audio-cd-1.png b/src/assets/images/png/acg/audio-cd-1.png new file mode 100644 index 0000000..e5134cc Binary files /dev/null and b/src/assets/images/png/acg/audio-cd-1.png differ diff --git a/src/assets/images/png/acg/audio-cd-2.png b/src/assets/images/png/acg/audio-cd-2.png new file mode 100644 index 0000000..2753682 Binary files /dev/null and b/src/assets/images/png/acg/audio-cd-2.png differ diff --git a/src/assets/images/png/acg/icon-btn-blue.png b/src/assets/images/png/acg/icon-btn-blue.png new file mode 100644 index 0000000..ac5c2a8 Binary files /dev/null and b/src/assets/images/png/acg/icon-btn-blue.png differ diff --git a/src/assets/images/png/acg/icon-btn-red.png b/src/assets/images/png/acg/icon-btn-red.png new file mode 100644 index 0000000..7101afd Binary files /dev/null and b/src/assets/images/png/acg/icon-btn-red.png differ diff --git a/src/assets/images/png/acg/pay.png b/src/assets/images/png/acg/pay.png new file mode 100644 index 0000000..d0ab464 Binary files /dev/null and b/src/assets/images/png/acg/pay.png differ diff --git a/src/assets/images/png/acg/rank-bg.png b/src/assets/images/png/acg/rank-bg.png new file mode 100644 index 0000000..5f2d7c5 Binary files /dev/null and b/src/assets/images/png/acg/rank-bg.png differ diff --git a/src/assets/images/png/acg/rank-title.png b/src/assets/images/png/acg/rank-title.png new file mode 100644 index 0000000..504ca15 Binary files /dev/null and b/src/assets/images/png/acg/rank-title.png differ diff --git a/src/assets/images/png/acg/rank-top-1.png b/src/assets/images/png/acg/rank-top-1.png new file mode 100644 index 0000000..02207d2 Binary files /dev/null and b/src/assets/images/png/acg/rank-top-1.png differ diff --git a/src/assets/images/png/acg/rank-top-2.png b/src/assets/images/png/acg/rank-top-2.png new file mode 100644 index 0000000..6f2d8e9 Binary files /dev/null and b/src/assets/images/png/acg/rank-top-2.png differ diff --git a/src/assets/images/png/acg/rank-top-3.png b/src/assets/images/png/acg/rank-top-3.png new file mode 100644 index 0000000..4b0789f Binary files /dev/null and b/src/assets/images/png/acg/rank-top-3.png differ diff --git a/src/assets/images/png/acg/tag-name.png b/src/assets/images/png/acg/tag-name.png new file mode 100644 index 0000000..67bd7c0 Binary files /dev/null and b/src/assets/images/png/acg/tag-name.png differ diff --git a/src/assets/images/png/acg/tag-title-1.png b/src/assets/images/png/acg/tag-title-1.png new file mode 100644 index 0000000..0cf9747 Binary files /dev/null and b/src/assets/images/png/acg/tag-title-1.png differ diff --git a/src/assets/images/png/acg/tag-title-2.png b/src/assets/images/png/acg/tag-title-2.png new file mode 100644 index 0000000..5cc21e9 Binary files /dev/null and b/src/assets/images/png/acg/tag-title-2.png differ diff --git a/src/assets/images/png/acg/text-bg.png b/src/assets/images/png/acg/text-bg.png new file mode 100644 index 0000000..22ade46 Binary files /dev/null and b/src/assets/images/png/acg/text-bg.png differ diff --git a/src/assets/images/png/acg/type_text.png b/src/assets/images/png/acg/type_text.png new file mode 100644 index 0000000..e357920 Binary files /dev/null and b/src/assets/images/png/acg/type_text.png differ diff --git a/src/assets/images/png/acg/type_text_1.png b/src/assets/images/png/acg/type_text_1.png new file mode 100644 index 0000000..1d5793e Binary files /dev/null and b/src/assets/images/png/acg/type_text_1.png differ diff --git a/src/assets/images/png/addFile.png b/src/assets/images/png/addFile.png new file mode 100644 index 0000000..4eb07b9 Binary files /dev/null and b/src/assets/images/png/addFile.png differ diff --git a/src/assets/images/png/add_img.png b/src/assets/images/png/add_img.png new file mode 100644 index 0000000..f7dd2f0 Binary files /dev/null and b/src/assets/images/png/add_img.png differ diff --git a/src/assets/images/png/add_post.png b/src/assets/images/png/add_post.png new file mode 100644 index 0000000..4453ce4 Binary files /dev/null and b/src/assets/images/png/add_post.png differ diff --git a/src/assets/images/png/add_text.png b/src/assets/images/png/add_text.png new file mode 100644 index 0000000..d4f5fc0 Binary files /dev/null and b/src/assets/images/png/add_text.png differ diff --git a/src/assets/images/png/add_video.png b/src/assets/images/png/add_video.png new file mode 100644 index 0000000..c315b8c Binary files /dev/null and b/src/assets/images/png/add_video.png differ diff --git a/src/assets/images/png/agent_ad.png b/src/assets/images/png/agent_ad.png new file mode 100644 index 0000000..dd6a7a9 Binary files /dev/null and b/src/assets/images/png/agent_ad.png differ diff --git a/src/assets/images/png/ai-text.png b/src/assets/images/png/ai-text.png new file mode 100644 index 0000000..5cb3c32 Binary files /dev/null and b/src/assets/images/png/ai-text.png differ diff --git a/src/assets/images/png/ai.png b/src/assets/images/png/ai.png new file mode 100644 index 0000000..193ea5a Binary files /dev/null and b/src/assets/images/png/ai.png differ diff --git a/src/assets/images/png/aiClose.png b/src/assets/images/png/aiClose.png new file mode 100644 index 0000000..ff5999a Binary files /dev/null and b/src/assets/images/png/aiClose.png differ diff --git a/src/assets/images/png/aiCouponBg.png b/src/assets/images/png/aiCouponBg.png new file mode 100644 index 0000000..9b1d699 Binary files /dev/null and b/src/assets/images/png/aiCouponBg.png differ diff --git a/src/assets/images/png/aiTip1.png b/src/assets/images/png/aiTip1.png new file mode 100644 index 0000000..e056aa2 Binary files /dev/null and b/src/assets/images/png/aiTip1.png differ diff --git a/src/assets/images/png/aiTip2.png b/src/assets/images/png/aiTip2.png new file mode 100644 index 0000000..087f49b Binary files /dev/null and b/src/assets/images/png/aiTip2.png differ diff --git a/src/assets/images/png/aiTip3.png b/src/assets/images/png/aiTip3.png new file mode 100644 index 0000000..2e012ab Binary files /dev/null and b/src/assets/images/png/aiTip3.png differ diff --git a/src/assets/images/png/aiUndress-bg-1.gif b/src/assets/images/png/aiUndress-bg-1.gif new file mode 100644 index 0000000..9c23e9f Binary files /dev/null and b/src/assets/images/png/aiUndress-bg-1.gif differ diff --git a/src/assets/images/png/aiUndress-bg-2.gif b/src/assets/images/png/aiUndress-bg-2.gif new file mode 100644 index 0000000..f840c7a Binary files /dev/null and b/src/assets/images/png/aiUndress-bg-2.gif differ diff --git a/src/assets/images/png/aiUndress-bg-3.gif b/src/assets/images/png/aiUndress-bg-3.gif new file mode 100644 index 0000000..6ff087f Binary files /dev/null and b/src/assets/images/png/aiUndress-bg-3.gif differ diff --git a/src/assets/images/png/aiUndress-bg-4.gif b/src/assets/images/png/aiUndress-bg-4.gif new file mode 100644 index 0000000..5fe626f Binary files /dev/null and b/src/assets/images/png/aiUndress-bg-4.gif differ diff --git a/src/assets/images/png/aiUndress-bg-5.gif b/src/assets/images/png/aiUndress-bg-5.gif new file mode 100644 index 0000000..bb555b4 Binary files /dev/null and b/src/assets/images/png/aiUndress-bg-5.gif differ diff --git a/src/assets/images/png/aiUndress-bg-6.gif b/src/assets/images/png/aiUndress-bg-6.gif new file mode 100644 index 0000000..786243d Binary files /dev/null and b/src/assets/images/png/aiUndress-bg-6.gif differ diff --git a/src/assets/images/png/aiUndress-icon-1.png b/src/assets/images/png/aiUndress-icon-1.png new file mode 100644 index 0000000..7660a3b Binary files /dev/null and b/src/assets/images/png/aiUndress-icon-1.png differ diff --git a/src/assets/images/png/aiUndress-icon-2.png b/src/assets/images/png/aiUndress-icon-2.png new file mode 100644 index 0000000..4f7a1fc Binary files /dev/null and b/src/assets/images/png/aiUndress-icon-2.png differ diff --git a/src/assets/images/png/aiUndress-icon-3.png b/src/assets/images/png/aiUndress-icon-3.png new file mode 100644 index 0000000..73caa1b Binary files /dev/null and b/src/assets/images/png/aiUndress-icon-3.png differ diff --git a/src/assets/images/png/aiUndress-icon-4.png b/src/assets/images/png/aiUndress-icon-4.png new file mode 100644 index 0000000..d1f7ebc Binary files /dev/null and b/src/assets/images/png/aiUndress-icon-4.png differ diff --git a/src/assets/images/png/aiUndress-icon-5.png b/src/assets/images/png/aiUndress-icon-5.png new file mode 100644 index 0000000..639fb75 Binary files /dev/null and b/src/assets/images/png/aiUndress-icon-5.png differ diff --git a/src/assets/images/png/aiUndress-icon-6.png b/src/assets/images/png/aiUndress-icon-6.png new file mode 100644 index 0000000..dcb5689 Binary files /dev/null and b/src/assets/images/png/aiUndress-icon-6.png differ diff --git a/src/assets/images/png/aiUndress-tag.png b/src/assets/images/png/aiUndress-tag.png new file mode 100644 index 0000000..41501bd Binary files /dev/null and b/src/assets/images/png/aiUndress-tag.png differ diff --git a/src/assets/images/png/appsClose.png b/src/assets/images/png/appsClose.png new file mode 100644 index 0000000..518503b Binary files /dev/null and b/src/assets/images/png/appsClose.png differ diff --git a/src/assets/images/png/arrow.png b/src/assets/images/png/arrow.png new file mode 100644 index 0000000..9c8b335 Binary files /dev/null and b/src/assets/images/png/arrow.png differ diff --git a/src/assets/images/png/arrow2.png b/src/assets/images/png/arrow2.png new file mode 100644 index 0000000..838aaac Binary files /dev/null and b/src/assets/images/png/arrow2.png differ diff --git a/src/assets/images/png/aw_line_active.png b/src/assets/images/png/aw_line_active.png new file mode 100644 index 0000000..5b6c6cf Binary files /dev/null and b/src/assets/images/png/aw_line_active.png differ diff --git a/src/assets/images/png/bindAccountTitle.png b/src/assets/images/png/bindAccountTitle.png new file mode 100644 index 0000000..5e2083d Binary files /dev/null and b/src/assets/images/png/bindAccountTitle.png differ diff --git a/src/assets/images/png/bind_phone_bg.png b/src/assets/images/png/bind_phone_bg.png new file mode 100644 index 0000000..d7a77d8 Binary files /dev/null and b/src/assets/images/png/bind_phone_bg.png differ diff --git a/src/assets/images/png/btn.png b/src/assets/images/png/btn.png new file mode 100644 index 0000000..8a7b410 Binary files /dev/null and b/src/assets/images/png/btn.png differ diff --git a/src/assets/images/png/business1-2.png b/src/assets/images/png/business1-2.png new file mode 100644 index 0000000..13f3b8c Binary files /dev/null and b/src/assets/images/png/business1-2.png differ diff --git a/src/assets/images/png/business1.png b/src/assets/images/png/business1.png new file mode 100644 index 0000000..6c22699 Binary files /dev/null and b/src/assets/images/png/business1.png differ diff --git a/src/assets/images/png/business2-2.png b/src/assets/images/png/business2-2.png new file mode 100644 index 0000000..4599ca2 Binary files /dev/null and b/src/assets/images/png/business2-2.png differ diff --git a/src/assets/images/png/business2.png b/src/assets/images/png/business2.png new file mode 100644 index 0000000..6d444ab Binary files /dev/null and b/src/assets/images/png/business2.png differ diff --git a/src/assets/images/png/business3.png b/src/assets/images/png/business3.png new file mode 100644 index 0000000..655ace0 Binary files /dev/null and b/src/assets/images/png/business3.png differ diff --git a/src/assets/images/png/business4.png b/src/assets/images/png/business4.png new file mode 100644 index 0000000..05174b5 Binary files /dev/null and b/src/assets/images/png/business4.png differ diff --git a/src/assets/images/png/business5.png b/src/assets/images/png/business5.png new file mode 100644 index 0000000..a0a4a59 Binary files /dev/null and b/src/assets/images/png/business5.png differ diff --git a/src/assets/images/png/calendarBg.png b/src/assets/images/png/calendarBg.png new file mode 100644 index 0000000..3012332 Binary files /dev/null and b/src/assets/images/png/calendarBg.png differ diff --git a/src/assets/images/png/caseBand.png b/src/assets/images/png/caseBand.png new file mode 100644 index 0000000..73789b9 Binary files /dev/null and b/src/assets/images/png/caseBand.png differ diff --git a/src/assets/images/png/caseUsdt.png b/src/assets/images/png/caseUsdt.png new file mode 100644 index 0000000..43e0318 Binary files /dev/null and b/src/assets/images/png/caseUsdt.png differ diff --git a/src/assets/images/png/clickfuli.png b/src/assets/images/png/clickfuli.png new file mode 100644 index 0000000..ab2b5ae Binary files /dev/null and b/src/assets/images/png/clickfuli.png differ diff --git a/src/assets/images/png/close.png b/src/assets/images/png/close.png new file mode 100644 index 0000000..fa44777 Binary files /dev/null and b/src/assets/images/png/close.png differ diff --git a/src/assets/images/png/close1.png b/src/assets/images/png/close1.png new file mode 100644 index 0000000..40ca11c Binary files /dev/null and b/src/assets/images/png/close1.png differ diff --git a/src/assets/images/png/closeDialog.png b/src/assets/images/png/closeDialog.png new file mode 100644 index 0000000..1479262 Binary files /dev/null and b/src/assets/images/png/closeDialog.png differ diff --git a/src/assets/images/png/coinbg_new.png b/src/assets/images/png/coinbg_new.png new file mode 100644 index 0000000..f7c59b8 Binary files /dev/null and b/src/assets/images/png/coinbg_new.png differ diff --git a/src/assets/images/png/coins.png b/src/assets/images/png/coins.png new file mode 100644 index 0000000..79f6f44 Binary files /dev/null and b/src/assets/images/png/coins.png differ diff --git a/src/assets/images/png/commentBoxBg.png b/src/assets/images/png/commentBoxBg.png new file mode 100644 index 0000000..a0d1728 Binary files /dev/null and b/src/assets/images/png/commentBoxBg.png differ diff --git a/src/assets/images/png/communityItem_bg.png b/src/assets/images/png/communityItem_bg.png new file mode 100644 index 0000000..838052d Binary files /dev/null and b/src/assets/images/png/communityItem_bg.png differ diff --git a/src/assets/images/png/community_close.png b/src/assets/images/png/community_close.png new file mode 100644 index 0000000..422d5e0 Binary files /dev/null and b/src/assets/images/png/community_close.png differ diff --git a/src/assets/images/png/core_privilege_card_bg.png b/src/assets/images/png/core_privilege_card_bg.png new file mode 100644 index 0000000..c286ac8 Binary files /dev/null and b/src/assets/images/png/core_privilege_card_bg.png differ diff --git a/src/assets/images/png/darkNet/button.png b/src/assets/images/png/darkNet/button.png new file mode 100644 index 0000000..96044cb Binary files /dev/null and b/src/assets/images/png/darkNet/button.png differ diff --git a/src/assets/images/png/darkNet/darkNetBg.png b/src/assets/images/png/darkNet/darkNetBg.png new file mode 100644 index 0000000..6b0ba06 Binary files /dev/null and b/src/assets/images/png/darkNet/darkNetBg.png differ diff --git a/src/assets/images/png/darkNet/darkNet_log.png b/src/assets/images/png/darkNet/darkNet_log.png new file mode 100644 index 0000000..078b68a Binary files /dev/null and b/src/assets/images/png/darkNet/darkNet_log.png differ diff --git a/src/assets/images/png/darkNet/search.png b/src/assets/images/png/darkNet/search.png new file mode 100644 index 0000000..0d9035f Binary files /dev/null and b/src/assets/images/png/darkNet/search.png differ diff --git a/src/assets/images/png/darkNet/tab_line.png b/src/assets/images/png/darkNet/tab_line.png new file mode 100644 index 0000000..286cddf Binary files /dev/null and b/src/assets/images/png/darkNet/tab_line.png differ diff --git a/src/assets/images/png/darkNet/textbg.png b/src/assets/images/png/darkNet/textbg.png new file mode 100644 index 0000000..da44220 Binary files /dev/null and b/src/assets/images/png/darkNet/textbg.png differ diff --git a/src/assets/images/png/default_bg.png b/src/assets/images/png/default_bg.png new file mode 100644 index 0000000..e114f30 Binary files /dev/null and b/src/assets/images/png/default_bg.png differ diff --git a/src/assets/images/png/del.png b/src/assets/images/png/del.png new file mode 100644 index 0000000..da467a1 Binary files /dev/null and b/src/assets/images/png/del.png differ diff --git a/src/assets/images/png/discount-computed.png b/src/assets/images/png/discount-computed.png new file mode 100644 index 0000000..ffc7a16 Binary files /dev/null and b/src/assets/images/png/discount-computed.png differ diff --git a/src/assets/images/png/discount-item-bg.png b/src/assets/images/png/discount-item-bg.png new file mode 100644 index 0000000..5881394 Binary files /dev/null and b/src/assets/images/png/discount-item-bg.png differ diff --git a/src/assets/images/png/duration_badge.png b/src/assets/images/png/duration_badge.png new file mode 100644 index 0000000..9858177 Binary files /dev/null and b/src/assets/images/png/duration_badge.png differ diff --git a/src/assets/images/png/findModule/tab_chat.png b/src/assets/images/png/findModule/tab_chat.png new file mode 100644 index 0000000..309fcf4 Binary files /dev/null and b/src/assets/images/png/findModule/tab_chat.png differ diff --git a/src/assets/images/png/findModule/tab_community.png b/src/assets/images/png/findModule/tab_community.png new file mode 100644 index 0000000..96a96dc Binary files /dev/null and b/src/assets/images/png/findModule/tab_community.png differ diff --git a/src/assets/images/png/findModule/tab_fiction.png b/src/assets/images/png/findModule/tab_fiction.png new file mode 100644 index 0000000..d5f9833 Binary files /dev/null and b/src/assets/images/png/findModule/tab_fiction.png differ diff --git a/src/assets/images/png/findModule/tab_game.png b/src/assets/images/png/findModule/tab_game.png new file mode 100644 index 0000000..5676cf4 Binary files /dev/null and b/src/assets/images/png/findModule/tab_game.png differ diff --git a/src/assets/images/png/findModule/tab_seek.png b/src/assets/images/png/findModule/tab_seek.png new file mode 100644 index 0000000..0c2dbc5 Binary files /dev/null and b/src/assets/images/png/findModule/tab_seek.png differ diff --git a/src/assets/images/png/frame.png b/src/assets/images/png/frame.png new file mode 100644 index 0000000..b7d805e Binary files /dev/null and b/src/assets/images/png/frame.png differ diff --git a/src/assets/images/png/gold.png b/src/assets/images/png/gold.png new file mode 100644 index 0000000..1af892e Binary files /dev/null and b/src/assets/images/png/gold.png differ diff --git a/src/assets/images/png/goldIcon.png b/src/assets/images/png/goldIcon.png new file mode 100644 index 0000000..d6829e5 Binary files /dev/null and b/src/assets/images/png/goldIcon.png differ diff --git a/src/assets/images/png/guessYouLike-bg.png b/src/assets/images/png/guessYouLike-bg.png new file mode 100644 index 0000000..2f834c3 Binary files /dev/null and b/src/assets/images/png/guessYouLike-bg.png differ diff --git a/src/assets/images/png/guessYouLike-title.png b/src/assets/images/png/guessYouLike-title.png new file mode 100644 index 0000000..b95ab7d Binary files /dev/null and b/src/assets/images/png/guessYouLike-title.png differ diff --git a/src/assets/images/png/header_logo.png b/src/assets/images/png/header_logo.png new file mode 100644 index 0000000..41b8b89 Binary files /dev/null and b/src/assets/images/png/header_logo.png differ diff --git a/src/assets/images/png/home/goldComment.png b/src/assets/images/png/home/goldComment.png new file mode 100644 index 0000000..c68485e Binary files /dev/null and b/src/assets/images/png/home/goldComment.png differ diff --git a/src/assets/images/png/home/newUserBg.png b/src/assets/images/png/home/newUserBg.png new file mode 100644 index 0000000..ed5dfbd Binary files /dev/null and b/src/assets/images/png/home/newUserBg.png differ diff --git a/src/assets/images/png/hoome_views.png b/src/assets/images/png/hoome_views.png new file mode 100644 index 0000000..8db8c4d Binary files /dev/null and b/src/assets/images/png/hoome_views.png differ diff --git a/src/assets/images/png/isCenteralNew.png b/src/assets/images/png/isCenteralNew.png new file mode 100644 index 0000000..193bf0e Binary files /dev/null and b/src/assets/images/png/isCenteralNew.png differ diff --git a/src/assets/images/png/isCentral.png b/src/assets/images/png/isCentral.png new file mode 100644 index 0000000..b513e99 Binary files /dev/null and b/src/assets/images/png/isCentral.png differ diff --git a/src/assets/images/png/jiesuoicon.png b/src/assets/images/png/jiesuoicon.png new file mode 100644 index 0000000..e6e71af Binary files /dev/null and b/src/assets/images/png/jiesuoicon.png differ diff --git a/src/assets/images/png/jointGameing/add.png b/src/assets/images/png/jointGameing/add.png new file mode 100644 index 0000000..5170fc9 Binary files /dev/null and b/src/assets/images/png/jointGameing/add.png differ diff --git a/src/assets/images/png/jointGameing/back.png b/src/assets/images/png/jointGameing/back.png new file mode 100644 index 0000000..55826f9 Binary files /dev/null and b/src/assets/images/png/jointGameing/back.png differ diff --git a/src/assets/images/png/jointGameing/bg.png b/src/assets/images/png/jointGameing/bg.png new file mode 100644 index 0000000..c81ca58 Binary files /dev/null and b/src/assets/images/png/jointGameing/bg.png differ diff --git a/src/assets/images/png/jointGameing/blindBox.png b/src/assets/images/png/jointGameing/blindBox.png new file mode 100644 index 0000000..91b89ec Binary files /dev/null and b/src/assets/images/png/jointGameing/blindBox.png differ diff --git a/src/assets/images/png/jointGameing/bottomtitle.png b/src/assets/images/png/jointGameing/bottomtitle.png new file mode 100644 index 0000000..7a85723 Binary files /dev/null and b/src/assets/images/png/jointGameing/bottomtitle.png differ diff --git a/src/assets/images/png/jointGameing/gags.png b/src/assets/images/png/jointGameing/gags.png new file mode 100644 index 0000000..1aadca2 Binary files /dev/null and b/src/assets/images/png/jointGameing/gags.png differ diff --git a/src/assets/images/png/jointGameing/gameTitle.png b/src/assets/images/png/jointGameing/gameTitle.png new file mode 100644 index 0000000..110e546 Binary files /dev/null and b/src/assets/images/png/jointGameing/gameTitle.png differ diff --git a/src/assets/images/png/jointGameing/group.png b/src/assets/images/png/jointGameing/group.png new file mode 100644 index 0000000..584fa43 Binary files /dev/null and b/src/assets/images/png/jointGameing/group.png differ diff --git a/src/assets/images/png/jointGameing/logo.png b/src/assets/images/png/jointGameing/logo.png new file mode 100644 index 0000000..89b497a Binary files /dev/null and b/src/assets/images/png/jointGameing/logo.png differ diff --git a/src/assets/images/png/jointGameing/personalbg.png b/src/assets/images/png/jointGameing/personalbg.png new file mode 100644 index 0000000..0063650 Binary files /dev/null and b/src/assets/images/png/jointGameing/personalbg.png differ diff --git a/src/assets/images/png/jointGameing/play.png b/src/assets/images/png/jointGameing/play.png new file mode 100644 index 0000000..b846a94 Binary files /dev/null and b/src/assets/images/png/jointGameing/play.png differ diff --git a/src/assets/images/png/jointGameing/popup.png b/src/assets/images/png/jointGameing/popup.png new file mode 100644 index 0000000..a0f123d Binary files /dev/null and b/src/assets/images/png/jointGameing/popup.png differ diff --git a/src/assets/images/png/jointGameing/title.png b/src/assets/images/png/jointGameing/title.png new file mode 100644 index 0000000..ce2d75f Binary files /dev/null and b/src/assets/images/png/jointGameing/title.png differ diff --git a/src/assets/images/png/jointGameing/videotitle.png b/src/assets/images/png/jointGameing/videotitle.png new file mode 100644 index 0000000..63ac57a Binary files /dev/null and b/src/assets/images/png/jointGameing/videotitle.png differ diff --git a/src/assets/images/png/kflogo.png b/src/assets/images/png/kflogo.png new file mode 100644 index 0000000..a17f616 Binary files /dev/null and b/src/assets/images/png/kflogo.png differ diff --git a/src/assets/images/png/limitedTime.png b/src/assets/images/png/limitedTime.png new file mode 100644 index 0000000..8185249 Binary files /dev/null and b/src/assets/images/png/limitedTime.png differ diff --git a/src/assets/images/png/live-title.png b/src/assets/images/png/live-title.png new file mode 100644 index 0000000..e2e478f Binary files /dev/null and b/src/assets/images/png/live-title.png differ diff --git a/src/assets/images/png/live/anchor-bg.png b/src/assets/images/png/live/anchor-bg.png new file mode 100644 index 0000000..dd224bb Binary files /dev/null and b/src/assets/images/png/live/anchor-bg.png differ diff --git a/src/assets/images/png/live/anchor-btn.png b/src/assets/images/png/live/anchor-btn.png new file mode 100644 index 0000000..dd31bd7 Binary files /dev/null and b/src/assets/images/png/live/anchor-btn.png differ diff --git a/src/assets/images/png/live/bannerBg.webp b/src/assets/images/png/live/bannerBg.webp new file mode 100644 index 0000000..fd0d409 Binary files /dev/null and b/src/assets/images/png/live/bannerBg.webp differ diff --git a/src/assets/images/png/live/bannerBg1.webp b/src/assets/images/png/live/bannerBg1.webp new file mode 100644 index 0000000..cb38ad5 Binary files /dev/null and b/src/assets/images/png/live/bannerBg1.webp differ diff --git a/src/assets/images/png/live/bannerBg2.webp b/src/assets/images/png/live/bannerBg2.webp new file mode 100644 index 0000000..50aee92 Binary files /dev/null and b/src/assets/images/png/live/bannerBg2.webp differ diff --git a/src/assets/images/png/live/bannerBg3.webp b/src/assets/images/png/live/bannerBg3.webp new file mode 100644 index 0000000..ab76414 Binary files /dev/null and b/src/assets/images/png/live/bannerBg3.webp differ diff --git a/src/assets/images/png/live/liveBgImg.webp b/src/assets/images/png/live/liveBgImg.webp new file mode 100644 index 0000000..953bb8f Binary files /dev/null and b/src/assets/images/png/live/liveBgImg.webp differ diff --git a/src/assets/images/png/live/six_round_item_bg.png b/src/assets/images/png/live/six_round_item_bg.png new file mode 100644 index 0000000..5699bed Binary files /dev/null and b/src/assets/images/png/live/six_round_item_bg.png differ diff --git a/src/assets/images/png/live/title-0.png b/src/assets/images/png/live/title-0.png new file mode 100644 index 0000000..ee9a5d2 Binary files /dev/null and b/src/assets/images/png/live/title-0.png differ diff --git a/src/assets/images/png/live/title-1.png b/src/assets/images/png/live/title-1.png new file mode 100644 index 0000000..26d563b Binary files /dev/null and b/src/assets/images/png/live/title-1.png differ diff --git a/src/assets/images/png/live/title-2.png b/src/assets/images/png/live/title-2.png new file mode 100644 index 0000000..56a9679 Binary files /dev/null and b/src/assets/images/png/live/title-2.png differ diff --git a/src/assets/images/png/live/title-3.png b/src/assets/images/png/live/title-3.png new file mode 100644 index 0000000..b5eccbe Binary files /dev/null and b/src/assets/images/png/live/title-3.png differ diff --git a/src/assets/images/png/live/title-4.png b/src/assets/images/png/live/title-4.png new file mode 100644 index 0000000..561c4da Binary files /dev/null and b/src/assets/images/png/live/title-4.png differ diff --git a/src/assets/images/png/lld-text.png b/src/assets/images/png/lld-text.png new file mode 100644 index 0000000..050e726 Binary files /dev/null and b/src/assets/images/png/lld-text.png differ diff --git a/src/assets/images/png/loadBg.png b/src/assets/images/png/loadBg.png new file mode 100644 index 0000000..2520b99 Binary files /dev/null and b/src/assets/images/png/loadBg.png differ diff --git a/src/assets/images/png/logo.png b/src/assets/images/png/logo.png new file mode 100644 index 0000000..8dc8840 Binary files /dev/null and b/src/assets/images/png/logo.png differ diff --git a/src/assets/images/png/logo_round.png b/src/assets/images/png/logo_round.png new file mode 100644 index 0000000..3c2ff5b Binary files /dev/null and b/src/assets/images/png/logo_round.png differ diff --git a/src/assets/images/png/menu.png b/src/assets/images/png/menu.png new file mode 100644 index 0000000..62f988f Binary files /dev/null and b/src/assets/images/png/menu.png differ diff --git a/src/assets/images/png/messbg.png b/src/assets/images/png/messbg.png new file mode 100644 index 0000000..3a3d729 Binary files /dev/null and b/src/assets/images/png/messbg.png differ diff --git a/src/assets/images/png/mine/account_bg.png b/src/assets/images/png/mine/account_bg.png new file mode 100644 index 0000000..ebf6b2e Binary files /dev/null and b/src/assets/images/png/mine/account_bg.png differ diff --git a/src/assets/images/png/mine/add_post.png b/src/assets/images/png/mine/add_post.png new file mode 100644 index 0000000..1441921 Binary files /dev/null and b/src/assets/images/png/mine/add_post.png differ diff --git a/src/assets/images/png/mine/agent_bg.png b/src/assets/images/png/mine/agent_bg.png new file mode 100644 index 0000000..53fbe5f Binary files /dev/null and b/src/assets/images/png/mine/agent_bg.png differ diff --git a/src/assets/images/png/mine/ai_nvyou_bg.png b/src/assets/images/png/mine/ai_nvyou_bg.png new file mode 100644 index 0000000..475843e Binary files /dev/null and b/src/assets/images/png/mine/ai_nvyou_bg.png differ diff --git a/src/assets/images/png/mine/assets_right.png b/src/assets/images/png/mine/assets_right.png new file mode 100644 index 0000000..fd05d33 Binary files /dev/null and b/src/assets/images/png/mine/assets_right.png differ diff --git a/src/assets/images/png/mine/check.png b/src/assets/images/png/mine/check.png new file mode 100644 index 0000000..04ff0de Binary files /dev/null and b/src/assets/images/png/mine/check.png differ diff --git a/src/assets/images/png/mine/check_in_coin.png b/src/assets/images/png/mine/check_in_coin.png new file mode 100644 index 0000000..ac63ddf Binary files /dev/null and b/src/assets/images/png/mine/check_in_coin.png differ diff --git a/src/assets/images/png/mine/checked.png b/src/assets/images/png/mine/checked.png new file mode 100644 index 0000000..9686387 Binary files /dev/null and b/src/assets/images/png/mine/checked.png differ diff --git a/src/assets/images/png/mine/checked_in_coin.png b/src/assets/images/png/mine/checked_in_coin.png new file mode 100644 index 0000000..e5d841a Binary files /dev/null and b/src/assets/images/png/mine/checked_in_coin.png differ diff --git a/src/assets/images/png/mine/close.png b/src/assets/images/png/mine/close.png new file mode 100644 index 0000000..843025b Binary files /dev/null and b/src/assets/images/png/mine/close.png differ diff --git a/src/assets/images/png/mine/close1.png b/src/assets/images/png/mine/close1.png new file mode 100644 index 0000000..13914b5 Binary files /dev/null and b/src/assets/images/png/mine/close1.png differ diff --git a/src/assets/images/png/mine/coin.png b/src/assets/images/png/mine/coin.png new file mode 100644 index 0000000..12235d2 Binary files /dev/null and b/src/assets/images/png/mine/coin.png differ diff --git a/src/assets/images/png/mine/coin_bg.png b/src/assets/images/png/mine/coin_bg.png new file mode 100644 index 0000000..d2b281b Binary files /dev/null and b/src/assets/images/png/mine/coin_bg.png differ diff --git a/src/assets/images/png/mine/copy.png b/src/assets/images/png/mine/copy.png new file mode 100644 index 0000000..b850f00 Binary files /dev/null and b/src/assets/images/png/mine/copy.png differ diff --git a/src/assets/images/png/mine/exchange-popup-btn.png b/src/assets/images/png/mine/exchange-popup-btn.png new file mode 100644 index 0000000..04ad4fe Binary files /dev/null and b/src/assets/images/png/mine/exchange-popup-btn.png differ diff --git a/src/assets/images/png/mine/exchangeBg.png b/src/assets/images/png/mine/exchangeBg.png new file mode 100644 index 0000000..64ab726 Binary files /dev/null and b/src/assets/images/png/mine/exchangeBg.png differ diff --git a/src/assets/images/png/mine/exchange_page_bg.png b/src/assets/images/png/mine/exchange_page_bg.png new file mode 100644 index 0000000..eedd1db Binary files /dev/null and b/src/assets/images/png/mine/exchange_page_bg.png differ diff --git a/src/assets/images/png/mine/expired.png b/src/assets/images/png/mine/expired.png new file mode 100644 index 0000000..afd014a Binary files /dev/null and b/src/assets/images/png/mine/expired.png differ diff --git a/src/assets/images/png/mine/freeBenefits_bg.png b/src/assets/images/png/mine/freeBenefits_bg.png new file mode 100644 index 0000000..d33a0f9 Binary files /dev/null and b/src/assets/images/png/mine/freeBenefits_bg.png differ diff --git a/src/assets/images/png/mine/icheck-active.png b/src/assets/images/png/mine/icheck-active.png new file mode 100644 index 0000000..4c0bf1d Binary files /dev/null and b/src/assets/images/png/mine/icheck-active.png differ diff --git a/src/assets/images/png/mine/icheck.png b/src/assets/images/png/mine/icheck.png new file mode 100644 index 0000000..5a7141a Binary files /dev/null and b/src/assets/images/png/mine/icheck.png differ diff --git a/src/assets/images/png/mine/isUpgrade-btn.png b/src/assets/images/png/mine/isUpgrade-btn.png new file mode 100644 index 0000000..a668f86 Binary files /dev/null and b/src/assets/images/png/mine/isUpgrade-btn.png differ diff --git a/src/assets/images/png/mine/lock.png b/src/assets/images/png/mine/lock.png new file mode 100644 index 0000000..0ab52f2 Binary files /dev/null and b/src/assets/images/png/mine/lock.png differ diff --git a/src/assets/images/png/mine/makeup_bg.png b/src/assets/images/png/mine/makeup_bg.png new file mode 100644 index 0000000..a983abd Binary files /dev/null and b/src/assets/images/png/mine/makeup_bg.png differ diff --git a/src/assets/images/png/mine/member_bg.png b/src/assets/images/png/mine/member_bg.png new file mode 100644 index 0000000..aee6750 Binary files /dev/null and b/src/assets/images/png/mine/member_bg.png differ diff --git a/src/assets/images/png/mine/msg.png b/src/assets/images/png/mine/msg.png new file mode 100644 index 0000000..bd9196c Binary files /dev/null and b/src/assets/images/png/mine/msg.png differ diff --git a/src/assets/images/png/mine/my_cell0.png b/src/assets/images/png/mine/my_cell0.png new file mode 100644 index 0000000..ed0cd53 Binary files /dev/null and b/src/assets/images/png/mine/my_cell0.png differ diff --git a/src/assets/images/png/mine/my_cell1.png b/src/assets/images/png/mine/my_cell1.png new file mode 100644 index 0000000..0516f43 Binary files /dev/null and b/src/assets/images/png/mine/my_cell1.png differ diff --git a/src/assets/images/png/mine/my_cell10.png b/src/assets/images/png/mine/my_cell10.png new file mode 100644 index 0000000..e19d7a5 Binary files /dev/null and b/src/assets/images/png/mine/my_cell10.png differ diff --git a/src/assets/images/png/mine/my_cell11.png b/src/assets/images/png/mine/my_cell11.png new file mode 100644 index 0000000..834b69b Binary files /dev/null and b/src/assets/images/png/mine/my_cell11.png differ diff --git a/src/assets/images/png/mine/my_cell2.png b/src/assets/images/png/mine/my_cell2.png new file mode 100644 index 0000000..7084e05 Binary files /dev/null and b/src/assets/images/png/mine/my_cell2.png differ diff --git a/src/assets/images/png/mine/my_cell3.png b/src/assets/images/png/mine/my_cell3.png new file mode 100644 index 0000000..6ead578 Binary files /dev/null and b/src/assets/images/png/mine/my_cell3.png differ diff --git a/src/assets/images/png/mine/my_cell4.png b/src/assets/images/png/mine/my_cell4.png new file mode 100644 index 0000000..b2f6f66 Binary files /dev/null and b/src/assets/images/png/mine/my_cell4.png differ diff --git a/src/assets/images/png/mine/my_cell5.png b/src/assets/images/png/mine/my_cell5.png new file mode 100644 index 0000000..7bf6b7c Binary files /dev/null and b/src/assets/images/png/mine/my_cell5.png differ diff --git a/src/assets/images/png/mine/my_cell6.png b/src/assets/images/png/mine/my_cell6.png new file mode 100644 index 0000000..11896b3 Binary files /dev/null and b/src/assets/images/png/mine/my_cell6.png differ diff --git a/src/assets/images/png/mine/my_cell7.png b/src/assets/images/png/mine/my_cell7.png new file mode 100644 index 0000000..7b501f1 Binary files /dev/null and b/src/assets/images/png/mine/my_cell7.png differ diff --git a/src/assets/images/png/mine/my_cell8.png b/src/assets/images/png/mine/my_cell8.png new file mode 100644 index 0000000..f385881 Binary files /dev/null and b/src/assets/images/png/mine/my_cell8.png differ diff --git a/src/assets/images/png/mine/my_cell9.png b/src/assets/images/png/mine/my_cell9.png new file mode 100644 index 0000000..8fc2c85 Binary files /dev/null and b/src/assets/images/png/mine/my_cell9.png differ diff --git a/src/assets/images/png/mine/my_features1.png b/src/assets/images/png/mine/my_features1.png new file mode 100644 index 0000000..b7171c9 Binary files /dev/null and b/src/assets/images/png/mine/my_features1.png differ diff --git a/src/assets/images/png/mine/my_features2.png b/src/assets/images/png/mine/my_features2.png new file mode 100644 index 0000000..c636a8f Binary files /dev/null and b/src/assets/images/png/mine/my_features2.png differ diff --git a/src/assets/images/png/mine/my_features3.png b/src/assets/images/png/mine/my_features3.png new file mode 100644 index 0000000..214ec71 Binary files /dev/null and b/src/assets/images/png/mine/my_features3.png differ diff --git a/src/assets/images/png/mine/my_features4.png b/src/assets/images/png/mine/my_features4.png new file mode 100644 index 0000000..238966b Binary files /dev/null and b/src/assets/images/png/mine/my_features4.png differ diff --git a/src/assets/images/png/mine/no_vip.png b/src/assets/images/png/mine/no_vip.png new file mode 100644 index 0000000..a8c432d Binary files /dev/null and b/src/assets/images/png/mine/no_vip.png differ diff --git a/src/assets/images/png/mine/on_assets_right.png b/src/assets/images/png/mine/on_assets_right.png new file mode 100644 index 0000000..46f1d7d Binary files /dev/null and b/src/assets/images/png/mine/on_assets_right.png differ diff --git a/src/assets/images/png/mine/privilege_bg.png b/src/assets/images/png/mine/privilege_bg.png new file mode 100644 index 0000000..daeb281 Binary files /dev/null and b/src/assets/images/png/mine/privilege_bg.png differ diff --git a/src/assets/images/png/mine/privilege_text.png b/src/assets/images/png/mine/privilege_text.png new file mode 100644 index 0000000..0d064f7 Binary files /dev/null and b/src/assets/images/png/mine/privilege_text.png differ diff --git a/src/assets/images/png/mine/progress-icon.png b/src/assets/images/png/mine/progress-icon.png new file mode 100644 index 0000000..a163e2e Binary files /dev/null and b/src/assets/images/png/mine/progress-icon.png differ diff --git a/src/assets/images/png/mine/promotion_btn_bg.png b/src/assets/images/png/mine/promotion_btn_bg.png new file mode 100644 index 0000000..54a1071 Binary files /dev/null and b/src/assets/images/png/mine/promotion_btn_bg.png differ diff --git a/src/assets/images/png/mine/qiandao-free.png b/src/assets/images/png/mine/qiandao-free.png new file mode 100644 index 0000000..80022be Binary files /dev/null and b/src/assets/images/png/mine/qiandao-free.png differ diff --git a/src/assets/images/png/mine/qiandao-vip.png b/src/assets/images/png/mine/qiandao-vip.png new file mode 100644 index 0000000..b700231 Binary files /dev/null and b/src/assets/images/png/mine/qiandao-vip.png differ diff --git a/src/assets/images/png/mine/qrbg.png b/src/assets/images/png/mine/qrbg.png new file mode 100644 index 0000000..a1e8bf6 Binary files /dev/null and b/src/assets/images/png/mine/qrbg.png differ diff --git a/src/assets/images/png/mine/right-icon.png b/src/assets/images/png/mine/right-icon.png new file mode 100644 index 0000000..c3b4923 Binary files /dev/null and b/src/assets/images/png/mine/right-icon.png differ diff --git a/src/assets/images/png/mine/section_bg.png b/src/assets/images/png/mine/section_bg.png new file mode 100644 index 0000000..f4722ee Binary files /dev/null and b/src/assets/images/png/mine/section_bg.png differ diff --git a/src/assets/images/png/mine/section_bg1.png b/src/assets/images/png/mine/section_bg1.png new file mode 100644 index 0000000..14a3f87 Binary files /dev/null and b/src/assets/images/png/mine/section_bg1.png differ diff --git a/src/assets/images/png/mine/selected.png b/src/assets/images/png/mine/selected.png new file mode 100644 index 0000000..4c0bf1d Binary files /dev/null and b/src/assets/images/png/mine/selected.png differ diff --git a/src/assets/images/png/mine/server.png b/src/assets/images/png/mine/server.png new file mode 100644 index 0000000..5107d29 Binary files /dev/null and b/src/assets/images/png/mine/server.png differ diff --git a/src/assets/images/png/mine/setting.png b/src/assets/images/png/mine/setting.png new file mode 100644 index 0000000..645e1c6 Binary files /dev/null and b/src/assets/images/png/mine/setting.png differ diff --git a/src/assets/images/png/mine/seven-sign-title.png b/src/assets/images/png/mine/seven-sign-title.png new file mode 100644 index 0000000..fe6a293 Binary files /dev/null and b/src/assets/images/png/mine/seven-sign-title.png differ diff --git a/src/assets/images/png/mine/seven-sign.gif b/src/assets/images/png/mine/seven-sign.gif new file mode 100644 index 0000000..09be920 Binary files /dev/null and b/src/assets/images/png/mine/seven-sign.gif differ diff --git a/src/assets/images/png/mine/share_bg.png b/src/assets/images/png/mine/share_bg.png new file mode 100644 index 0000000..f5cc43c Binary files /dev/null and b/src/assets/images/png/mine/share_bg.png differ diff --git a/src/assets/images/png/mine/share_bg_new.png b/src/assets/images/png/mine/share_bg_new.png new file mode 100644 index 0000000..267b758 Binary files /dev/null and b/src/assets/images/png/mine/share_bg_new.png differ diff --git a/src/assets/images/png/mine/share_line.png b/src/assets/images/png/mine/share_line.png new file mode 100644 index 0000000..96fd13f Binary files /dev/null and b/src/assets/images/png/mine/share_line.png differ diff --git a/src/assets/images/png/mine/sign-free-bg.png b/src/assets/images/png/mine/sign-free-bg.png new file mode 100644 index 0000000..66acd32 Binary files /dev/null and b/src/assets/images/png/mine/sign-free-bg.png differ diff --git a/src/assets/images/png/mine/sign-vip-bg.png b/src/assets/images/png/mine/sign-vip-bg.png new file mode 100644 index 0000000..7ff8bc7 Binary files /dev/null and b/src/assets/images/png/mine/sign-vip-bg.png differ diff --git a/src/assets/images/png/mine/sign_top_bg.png b/src/assets/images/png/mine/sign_top_bg.png new file mode 100644 index 0000000..f498128 Binary files /dev/null and b/src/assets/images/png/mine/sign_top_bg.png differ diff --git a/src/assets/images/png/mine/task_sign.png b/src/assets/images/png/mine/task_sign.png new file mode 100644 index 0000000..5e8b919 Binary files /dev/null and b/src/assets/images/png/mine/task_sign.png differ diff --git a/src/assets/images/png/mine/tuig_bg.png b/src/assets/images/png/mine/tuig_bg.png new file mode 100644 index 0000000..7b278c1 Binary files /dev/null and b/src/assets/images/png/mine/tuig_bg.png differ diff --git a/src/assets/images/png/mine/unselect.png b/src/assets/images/png/mine/unselect.png new file mode 100644 index 0000000..33e7170 Binary files /dev/null and b/src/assets/images/png/mine/unselect.png differ diff --git a/src/assets/images/png/mine/vip-tips.png b/src/assets/images/png/mine/vip-tips.png new file mode 100644 index 0000000..4ad8495 Binary files /dev/null and b/src/assets/images/png/mine/vip-tips.png differ diff --git a/src/assets/images/png/mine/vip.png b/src/assets/images/png/mine/vip.png new file mode 100644 index 0000000..7e80037 Binary files /dev/null and b/src/assets/images/png/mine/vip.png differ diff --git a/src/assets/images/png/mine/vip1.png b/src/assets/images/png/mine/vip1.png new file mode 100644 index 0000000..cf4cd64 Binary files /dev/null and b/src/assets/images/png/mine/vip1.png differ diff --git a/src/assets/images/png/mine/vip_bg.png b/src/assets/images/png/mine/vip_bg.png new file mode 100644 index 0000000..65f259d Binary files /dev/null and b/src/assets/images/png/mine/vip_bg.png differ diff --git a/src/assets/images/png/mine/vip_icon.png b/src/assets/images/png/mine/vip_icon.png new file mode 100644 index 0000000..ac22314 Binary files /dev/null and b/src/assets/images/png/mine/vip_icon.png differ diff --git a/src/assets/images/png/mine/withdraw_btn_bg.png b/src/assets/images/png/mine/withdraw_btn_bg.png new file mode 100644 index 0000000..88b8d3d Binary files /dev/null and b/src/assets/images/png/mine/withdraw_btn_bg.png differ diff --git a/src/assets/images/png/mine/work-sign-popup-title.png b/src/assets/images/png/mine/work-sign-popup-title.png new file mode 100644 index 0000000..0653ead Binary files /dev/null and b/src/assets/images/png/mine/work-sign-popup-title.png differ diff --git a/src/assets/images/png/my_cell0.png b/src/assets/images/png/my_cell0.png new file mode 100644 index 0000000..4db34c4 Binary files /dev/null and b/src/assets/images/png/my_cell0.png differ diff --git a/src/assets/images/png/my_cell1.png b/src/assets/images/png/my_cell1.png new file mode 100644 index 0000000..9825d04 Binary files /dev/null and b/src/assets/images/png/my_cell1.png differ diff --git a/src/assets/images/png/my_cell3.png b/src/assets/images/png/my_cell3.png new file mode 100644 index 0000000..26cb69c Binary files /dev/null and b/src/assets/images/png/my_cell3.png differ diff --git a/src/assets/images/png/my_cell4.png b/src/assets/images/png/my_cell4.png new file mode 100644 index 0000000..38062c1 Binary files /dev/null and b/src/assets/images/png/my_cell4.png differ diff --git a/src/assets/images/png/my_cell5.png b/src/assets/images/png/my_cell5.png new file mode 100644 index 0000000..1b84b27 Binary files /dev/null and b/src/assets/images/png/my_cell5.png differ diff --git a/src/assets/images/png/my_cell6.png b/src/assets/images/png/my_cell6.png new file mode 100644 index 0000000..2339176 Binary files /dev/null and b/src/assets/images/png/my_cell6.png differ diff --git a/src/assets/images/png/my_cell7.png b/src/assets/images/png/my_cell7.png new file mode 100644 index 0000000..9480491 Binary files /dev/null and b/src/assets/images/png/my_cell7.png differ diff --git a/src/assets/images/png/my_delete.png b/src/assets/images/png/my_delete.png new file mode 100644 index 0000000..0987e69 Binary files /dev/null and b/src/assets/images/png/my_delete.png differ diff --git a/src/assets/images/png/my_edit.png b/src/assets/images/png/my_edit.png new file mode 100644 index 0000000..7a41a59 Binary files /dev/null and b/src/assets/images/png/my_edit.png differ diff --git a/src/assets/images/png/my_features1.png b/src/assets/images/png/my_features1.png new file mode 100644 index 0000000..6d2b1e4 Binary files /dev/null and b/src/assets/images/png/my_features1.png differ diff --git a/src/assets/images/png/my_features2.png b/src/assets/images/png/my_features2.png new file mode 100644 index 0000000..f07a068 Binary files /dev/null and b/src/assets/images/png/my_features2.png differ diff --git a/src/assets/images/png/my_features3.png b/src/assets/images/png/my_features3.png new file mode 100644 index 0000000..bd60295 Binary files /dev/null and b/src/assets/images/png/my_features3.png differ diff --git a/src/assets/images/png/my_features4.png b/src/assets/images/png/my_features4.png new file mode 100644 index 0000000..1c94763 Binary files /dev/null and b/src/assets/images/png/my_features4.png differ diff --git a/src/assets/images/png/navBarIcon.png b/src/assets/images/png/navBarIcon.png new file mode 100644 index 0000000..73b4c97 Binary files /dev/null and b/src/assets/images/png/navBarIcon.png differ diff --git a/src/assets/images/png/new-discount-title.png b/src/assets/images/png/new-discount-title.png new file mode 100644 index 0000000..b44747f Binary files /dev/null and b/src/assets/images/png/new-discount-title.png differ diff --git a/src/assets/images/png/newUserBg.png b/src/assets/images/png/newUserBg.png new file mode 100644 index 0000000..b3c6375 Binary files /dev/null and b/src/assets/images/png/newUserBg.png differ diff --git a/src/assets/images/png/newUserBg2.png b/src/assets/images/png/newUserBg2.png new file mode 100644 index 0000000..edfbd39 Binary files /dev/null and b/src/assets/images/png/newUserBg2.png differ diff --git a/src/assets/images/png/newUserBg3.png b/src/assets/images/png/newUserBg3.png new file mode 100644 index 0000000..54711ae Binary files /dev/null and b/src/assets/images/png/newUserBg3.png differ diff --git a/src/assets/images/png/nodata3.png b/src/assets/images/png/nodata3.png new file mode 100644 index 0000000..b219c60 Binary files /dev/null and b/src/assets/images/png/nodata3.png differ diff --git a/src/assets/images/png/official-website.png b/src/assets/images/png/official-website.png new file mode 100644 index 0000000..3fe09a8 Binary files /dev/null and b/src/assets/images/png/official-website.png differ diff --git a/src/assets/images/png/pay_img.jpg b/src/assets/images/png/pay_img.jpg new file mode 100644 index 0000000..9660b05 Binary files /dev/null and b/src/assets/images/png/pay_img.jpg differ diff --git a/src/assets/images/png/payment/me-tab-banner-vip200.png b/src/assets/images/png/payment/me-tab-banner-vip200.png new file mode 100644 index 0000000..0ae9226 Binary files /dev/null and b/src/assets/images/png/payment/me-tab-banner-vip200.png differ diff --git a/src/assets/images/png/payment/payment-banner-vip200.png b/src/assets/images/png/payment/payment-banner-vip200.png new file mode 100644 index 0000000..9134275 Binary files /dev/null and b/src/assets/images/png/payment/payment-banner-vip200.png differ diff --git a/src/assets/images/png/payment/payment-banner-vip300.png b/src/assets/images/png/payment/payment-banner-vip300.png new file mode 100644 index 0000000..1169adc Binary files /dev/null and b/src/assets/images/png/payment/payment-banner-vip300.png differ diff --git a/src/assets/images/png/payment/payment-banner-vip500.png b/src/assets/images/png/payment/payment-banner-vip500.png new file mode 100644 index 0000000..b175798 Binary files /dev/null and b/src/assets/images/png/payment/payment-banner-vip500.png differ diff --git a/src/assets/images/png/payment/payment-home-popup.png b/src/assets/images/png/payment/payment-home-popup.png new file mode 100644 index 0000000..4fadbd6 Binary files /dev/null and b/src/assets/images/png/payment/payment-home-popup.png differ diff --git a/src/assets/images/png/payment/payment-homepage-float.png b/src/assets/images/png/payment/payment-homepage-float.png new file mode 100644 index 0000000..3949520 Binary files /dev/null and b/src/assets/images/png/payment/payment-homepage-float.png differ diff --git a/src/assets/images/png/payment/payment-me-tab.png b/src/assets/images/png/payment/payment-me-tab.png new file mode 100644 index 0000000..4eb4c50 Binary files /dev/null and b/src/assets/images/png/payment/payment-me-tab.png differ diff --git a/src/assets/images/png/payment/payment-status-popup.png b/src/assets/images/png/payment/payment-status-popup.png new file mode 100644 index 0000000..1f61611 Binary files /dev/null and b/src/assets/images/png/payment/payment-status-popup.png differ diff --git a/src/assets/images/png/paymentGuide/hot-tag.png b/src/assets/images/png/paymentGuide/hot-tag.png new file mode 100644 index 0000000..d6563e8 Binary files /dev/null and b/src/assets/images/png/paymentGuide/hot-tag.png differ diff --git a/src/assets/images/png/paymentGuide/vip-card.png b/src/assets/images/png/paymentGuide/vip-card.png new file mode 100644 index 0000000..d4f24be Binary files /dev/null and b/src/assets/images/png/paymentGuide/vip-card.png differ diff --git a/src/assets/images/png/placeholder.png b/src/assets/images/png/placeholder.png new file mode 100644 index 0000000..172e409 Binary files /dev/null and b/src/assets/images/png/placeholder.png differ diff --git a/src/assets/images/png/popBtn.png b/src/assets/images/png/popBtn.png new file mode 100644 index 0000000..d18ec16 Binary files /dev/null and b/src/assets/images/png/popBtn.png differ diff --git a/src/assets/images/png/popBtn2.png b/src/assets/images/png/popBtn2.png new file mode 100644 index 0000000..d1bf85d Binary files /dev/null and b/src/assets/images/png/popBtn2.png differ diff --git a/src/assets/images/png/popGold.png b/src/assets/images/png/popGold.png new file mode 100644 index 0000000..10a28e0 Binary files /dev/null and b/src/assets/images/png/popGold.png differ diff --git a/src/assets/images/png/popVip.png b/src/assets/images/png/popVip.png new file mode 100644 index 0000000..1dbbf22 Binary files /dev/null and b/src/assets/images/png/popVip.png differ diff --git a/src/assets/images/png/pop_account.png b/src/assets/images/png/pop_account.png new file mode 100644 index 0000000..ab3eece Binary files /dev/null and b/src/assets/images/png/pop_account.png differ diff --git a/src/assets/images/png/pop_close.png b/src/assets/images/png/pop_close.png new file mode 100644 index 0000000..a0ce8aa Binary files /dev/null and b/src/assets/images/png/pop_close.png differ diff --git a/src/assets/images/png/post_back.png b/src/assets/images/png/post_back.png new file mode 100644 index 0000000..1a7cc0d Binary files /dev/null and b/src/assets/images/png/post_back.png differ diff --git a/src/assets/images/png/presale/active.png b/src/assets/images/png/presale/active.png new file mode 100644 index 0000000..b0d5079 Binary files /dev/null and b/src/assets/images/png/presale/active.png differ diff --git a/src/assets/images/png/presale/btn.png b/src/assets/images/png/presale/btn.png new file mode 100644 index 0000000..89c3a2f Binary files /dev/null and b/src/assets/images/png/presale/btn.png differ diff --git a/src/assets/images/png/presale/btnBg.png b/src/assets/images/png/presale/btnBg.png new file mode 100644 index 0000000..bfdddd2 Binary files /dev/null and b/src/assets/images/png/presale/btnBg.png differ diff --git a/src/assets/images/png/presale/go.png b/src/assets/images/png/presale/go.png new file mode 100644 index 0000000..dbb2ea4 Binary files /dev/null and b/src/assets/images/png/presale/go.png differ diff --git a/src/assets/images/png/presale/payBananen.png b/src/assets/images/png/presale/payBananen.png new file mode 100644 index 0000000..72585b6 Binary files /dev/null and b/src/assets/images/png/presale/payBananen.png differ diff --git a/src/assets/images/png/presale/payPopup.png b/src/assets/images/png/presale/payPopup.png new file mode 100644 index 0000000..fb059c1 Binary files /dev/null and b/src/assets/images/png/presale/payPopup.png differ diff --git a/src/assets/images/png/presale/paybtn.png b/src/assets/images/png/presale/paybtn.png new file mode 100644 index 0000000..dd56237 Binary files /dev/null and b/src/assets/images/png/presale/paybtn.png differ diff --git a/src/assets/images/png/presale/paypop.png b/src/assets/images/png/presale/paypop.png new file mode 100644 index 0000000..386e247 Binary files /dev/null and b/src/assets/images/png/presale/paypop.png differ diff --git a/src/assets/images/png/presale/persalepop.png b/src/assets/images/png/presale/persalepop.png new file mode 100644 index 0000000..689faed Binary files /dev/null and b/src/assets/images/png/presale/persalepop.png differ diff --git a/src/assets/images/png/presale/preSaleAlPreBg.webp b/src/assets/images/png/presale/preSaleAlPreBg.webp new file mode 100644 index 0000000..898ffc8 Binary files /dev/null and b/src/assets/images/png/presale/preSaleAlPreBg.webp differ diff --git a/src/assets/images/png/presale/preSaleNoBuyBg.webp b/src/assets/images/png/presale/preSaleNoBuyBg.webp new file mode 100644 index 0000000..725ee78 Binary files /dev/null and b/src/assets/images/png/presale/preSaleNoBuyBg.webp differ diff --git a/src/assets/images/png/presale/presaleBananen.png b/src/assets/images/png/presale/presaleBananen.png new file mode 100644 index 0000000..ff01c4a Binary files /dev/null and b/src/assets/images/png/presale/presaleBananen.png differ diff --git a/src/assets/images/png/presale/tip.png b/src/assets/images/png/presale/tip.png new file mode 100644 index 0000000..f8ba7e5 Binary files /dev/null and b/src/assets/images/png/presale/tip.png differ diff --git a/src/assets/images/png/presale/title.png b/src/assets/images/png/presale/title.png new file mode 100644 index 0000000..4f6f0be Binary files /dev/null and b/src/assets/images/png/presale/title.png differ diff --git a/src/assets/images/png/presale/vidItemBg.png b/src/assets/images/png/presale/vidItemBg.png new file mode 100644 index 0000000..32b046c Binary files /dev/null and b/src/assets/images/png/presale/vidItemBg.png differ diff --git a/src/assets/images/png/presale/videobg.png b/src/assets/images/png/presale/videobg.png new file mode 100644 index 0000000..63603f5 Binary files /dev/null and b/src/assets/images/png/presale/videobg.png differ diff --git a/src/assets/images/png/presale/ysPopup.webp b/src/assets/images/png/presale/ysPopup.webp new file mode 100644 index 0000000..3cb62a2 Binary files /dev/null and b/src/assets/images/png/presale/ysPopup.webp differ diff --git a/src/assets/images/png/privilege_bg.png b/src/assets/images/png/privilege_bg.png new file mode 100644 index 0000000..b78aecf Binary files /dev/null and b/src/assets/images/png/privilege_bg.png differ diff --git a/src/assets/images/png/qRCodeBorder.png b/src/assets/images/png/qRCodeBorder.png new file mode 100644 index 0000000..5f16285 Binary files /dev/null and b/src/assets/images/png/qRCodeBorder.png differ diff --git a/src/assets/images/png/qrbg.png b/src/assets/images/png/qrbg.png new file mode 100644 index 0000000..252780c Binary files /dev/null and b/src/assets/images/png/qrbg.png differ diff --git a/src/assets/images/png/rank_four.png b/src/assets/images/png/rank_four.png new file mode 100644 index 0000000..1a1fb84 Binary files /dev/null and b/src/assets/images/png/rank_four.png differ diff --git a/src/assets/images/png/rank_one.png b/src/assets/images/png/rank_one.png new file mode 100644 index 0000000..edb0fd7 Binary files /dev/null and b/src/assets/images/png/rank_one.png differ diff --git a/src/assets/images/png/rank_other.png b/src/assets/images/png/rank_other.png new file mode 100644 index 0000000..6a33929 Binary files /dev/null and b/src/assets/images/png/rank_other.png differ diff --git a/src/assets/images/png/rank_three.png b/src/assets/images/png/rank_three.png new file mode 100644 index 0000000..0bbd75e Binary files /dev/null and b/src/assets/images/png/rank_three.png differ diff --git a/src/assets/images/png/rank_two.png b/src/assets/images/png/rank_two.png new file mode 100644 index 0000000..093101a Binary files /dev/null and b/src/assets/images/png/rank_two.png differ diff --git a/src/assets/images/png/recharge-bg.png b/src/assets/images/png/recharge-bg.png new file mode 100644 index 0000000..7b9f1b5 Binary files /dev/null and b/src/assets/images/png/recharge-bg.png differ diff --git a/src/assets/images/png/return-discount-title.png b/src/assets/images/png/return-discount-title.png new file mode 100644 index 0000000..1892c23 Binary files /dev/null and b/src/assets/images/png/return-discount-title.png differ diff --git a/src/assets/images/png/right.png b/src/assets/images/png/right.png new file mode 100644 index 0000000..9de65bc Binary files /dev/null and b/src/assets/images/png/right.png differ diff --git a/src/assets/images/png/search.png b/src/assets/images/png/search.png new file mode 100644 index 0000000..767cc30 Binary files /dev/null and b/src/assets/images/png/search.png differ diff --git a/src/assets/images/png/selectCoupon.png b/src/assets/images/png/selectCoupon.png new file mode 100644 index 0000000..92b22d8 Binary files /dev/null and b/src/assets/images/png/selectCoupon.png differ diff --git a/src/assets/images/png/selectLineBg.png b/src/assets/images/png/selectLineBg.png new file mode 100644 index 0000000..b51347e Binary files /dev/null and b/src/assets/images/png/selectLineBg.png differ diff --git a/src/assets/images/png/selectedCoupon.png b/src/assets/images/png/selectedCoupon.png new file mode 100644 index 0000000..4eba8ea Binary files /dev/null and b/src/assets/images/png/selectedCoupon.png differ diff --git a/src/assets/images/png/sendBtn.png b/src/assets/images/png/sendBtn.png new file mode 100644 index 0000000..0b11393 Binary files /dev/null and b/src/assets/images/png/sendBtn.png differ diff --git a/src/assets/images/png/sendComment.png b/src/assets/images/png/sendComment.png new file mode 100644 index 0000000..29d8e5a Binary files /dev/null and b/src/assets/images/png/sendComment.png differ diff --git a/src/assets/images/png/sendimg.png b/src/assets/images/png/sendimg.png new file mode 100644 index 0000000..45c247e Binary files /dev/null and b/src/assets/images/png/sendimg.png differ diff --git a/src/assets/images/png/sendimg1.png b/src/assets/images/png/sendimg1.png new file mode 100644 index 0000000..ae3dad6 Binary files /dev/null and b/src/assets/images/png/sendimg1.png differ diff --git a/src/assets/images/png/sends.png b/src/assets/images/png/sends.png new file mode 100644 index 0000000..27cb64d Binary files /dev/null and b/src/assets/images/png/sends.png differ diff --git a/src/assets/images/png/server_new.png b/src/assets/images/png/server_new.png new file mode 100644 index 0000000..7db500a Binary files /dev/null and b/src/assets/images/png/server_new.png differ diff --git a/src/assets/images/png/set_new.png b/src/assets/images/png/set_new.png new file mode 100644 index 0000000..97a646a Binary files /dev/null and b/src/assets/images/png/set_new.png differ diff --git a/src/assets/images/png/shareStep.png b/src/assets/images/png/shareStep.png new file mode 100644 index 0000000..ea8a1ff Binary files /dev/null and b/src/assets/images/png/shareStep.png differ diff --git a/src/assets/images/png/shareStep_new.png b/src/assets/images/png/shareStep_new.png new file mode 100644 index 0000000..c4da7fd Binary files /dev/null and b/src/assets/images/png/shareStep_new.png differ diff --git a/src/assets/images/png/shareStep_new1.png b/src/assets/images/png/shareStep_new1.png new file mode 100644 index 0000000..eaf9b8e Binary files /dev/null and b/src/assets/images/png/shareStep_new1.png differ diff --git a/src/assets/images/png/share_bg.png b/src/assets/images/png/share_bg.png new file mode 100644 index 0000000..afcd9c6 Binary files /dev/null and b/src/assets/images/png/share_bg.png differ diff --git a/src/assets/images/png/share_bg1_new.png b/src/assets/images/png/share_bg1_new.png new file mode 100644 index 0000000..6996065 Binary files /dev/null and b/src/assets/images/png/share_bg1_new.png differ diff --git a/src/assets/images/png/share_bg1_new1.png b/src/assets/images/png/share_bg1_new1.png new file mode 100644 index 0000000..9b7f930 Binary files /dev/null and b/src/assets/images/png/share_bg1_new1.png differ diff --git a/src/assets/images/png/sharebg_new.png b/src/assets/images/png/sharebg_new.png new file mode 100644 index 0000000..ea59559 Binary files /dev/null and b/src/assets/images/png/sharebg_new.png differ diff --git a/src/assets/images/png/short-drama/ai-drama-cover-mock.png b/src/assets/images/png/short-drama/ai-drama-cover-mock.png new file mode 100644 index 0000000..f8d8d1f Binary files /dev/null and b/src/assets/images/png/short-drama/ai-drama-cover-mock.png differ diff --git a/src/assets/images/png/short-drama/drama-chevron-up.svg b/src/assets/images/png/short-drama/drama-chevron-up.svg new file mode 100644 index 0000000..8753984 --- /dev/null +++ b/src/assets/images/png/short-drama/drama-chevron-up.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/png/short-drama/drama-episodes-icon.svg b/src/assets/images/png/short-drama/drama-episodes-icon.svg new file mode 100644 index 0000000..b2d041b --- /dev/null +++ b/src/assets/images/png/short-drama/drama-episodes-icon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/src/assets/images/png/short-drama/drama-fullscreen-icon.svg b/src/assets/images/png/short-drama/drama-fullscreen-icon.svg new file mode 100644 index 0000000..1e97c3e --- /dev/null +++ b/src/assets/images/png/short-drama/drama-fullscreen-icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/assets/images/png/short-drama/drama-speed-check.svg b/src/assets/images/png/short-drama/drama-speed-check.svg new file mode 100644 index 0000000..cdab4cd --- /dev/null +++ b/src/assets/images/png/short-drama/drama-speed-check.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/png/short-drama/drama-speed-chevron-down.svg b/src/assets/images/png/short-drama/drama-speed-chevron-down.svg new file mode 100644 index 0000000..8dfe9ec --- /dev/null +++ b/src/assets/images/png/short-drama/drama-speed-chevron-down.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/png/short-drama/drama-speed-stopwatch.svg b/src/assets/images/png/short-drama/drama-speed-stopwatch.svg new file mode 100644 index 0000000..f931016 --- /dev/null +++ b/src/assets/images/png/short-drama/drama-speed-stopwatch.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/png/short-drama/hot-drama-cover-mock.png b/src/assets/images/png/short-drama/hot-drama-cover-mock.png new file mode 100644 index 0000000..2a50a5a Binary files /dev/null and b/src/assets/images/png/short-drama/hot-drama-cover-mock.png differ diff --git a/src/assets/images/png/signInBg.png b/src/assets/images/png/signInBg.png new file mode 100644 index 0000000..607b9d6 Binary files /dev/null and b/src/assets/images/png/signInBg.png differ diff --git a/src/assets/images/png/signInIcon.png b/src/assets/images/png/signInIcon.png new file mode 100644 index 0000000..8b1c592 Binary files /dev/null and b/src/assets/images/png/signInIcon.png differ diff --git a/src/assets/images/png/store.png b/src/assets/images/png/store.png new file mode 100644 index 0000000..d6f3bcb Binary files /dev/null and b/src/assets/images/png/store.png differ diff --git a/src/assets/images/png/sysPopup-title-gg.png b/src/assets/images/png/sysPopup-title-gg.png new file mode 100644 index 0000000..0f11f54 Binary files /dev/null and b/src/assets/images/png/sysPopup-title-gg.png differ diff --git a/src/assets/images/png/sysPopup-title-wx.png b/src/assets/images/png/sysPopup-title-wx.png new file mode 100644 index 0000000..789123c Binary files /dev/null and b/src/assets/images/png/sysPopup-title-wx.png differ diff --git a/src/assets/images/png/systemPromptBg.png b/src/assets/images/png/systemPromptBg.png new file mode 100644 index 0000000..6c492bb Binary files /dev/null and b/src/assets/images/png/systemPromptBg.png differ diff --git a/src/assets/images/png/systemPromptTitle.png b/src/assets/images/png/systemPromptTitle.png new file mode 100644 index 0000000..bec26db Binary files /dev/null and b/src/assets/images/png/systemPromptTitle.png differ diff --git a/src/assets/images/png/tab_chat.png b/src/assets/images/png/tab_chat.png new file mode 100644 index 0000000..e265db4 Binary files /dev/null and b/src/assets/images/png/tab_chat.png differ diff --git a/src/assets/images/png/tab_community.png b/src/assets/images/png/tab_community.png new file mode 100644 index 0000000..836dcd6 Binary files /dev/null and b/src/assets/images/png/tab_community.png differ diff --git a/src/assets/images/png/tab_fiction.png b/src/assets/images/png/tab_fiction.png new file mode 100644 index 0000000..ee21759 Binary files /dev/null and b/src/assets/images/png/tab_fiction.png differ diff --git a/src/assets/images/png/tab_seek.png b/src/assets/images/png/tab_seek.png new file mode 100644 index 0000000..dec8d89 Binary files /dev/null and b/src/assets/images/png/tab_seek.png differ diff --git a/src/assets/images/png/task-vip-recommend-1.png b/src/assets/images/png/task-vip-recommend-1.png new file mode 100644 index 0000000..e65960d Binary files /dev/null and b/src/assets/images/png/task-vip-recommend-1.png differ diff --git a/src/assets/images/png/task-vip-recommend-2.png b/src/assets/images/png/task-vip-recommend-2.png new file mode 100644 index 0000000..4ebd9d2 Binary files /dev/null and b/src/assets/images/png/task-vip-recommend-2.png differ diff --git a/src/assets/images/png/task-vip-recommend-3.png b/src/assets/images/png/task-vip-recommend-3.png new file mode 100644 index 0000000..a000b49 Binary files /dev/null and b/src/assets/images/png/task-vip-recommend-3.png differ diff --git a/src/assets/images/png/task_bg.png b/src/assets/images/png/task_bg.png new file mode 100644 index 0000000..964baff Binary files /dev/null and b/src/assets/images/png/task_bg.png differ diff --git a/src/assets/images/png/task_vip_bg.png b/src/assets/images/png/task_vip_bg.png new file mode 100644 index 0000000..ba6c5c8 Binary files /dev/null and b/src/assets/images/png/task_vip_bg.png differ diff --git a/src/assets/images/png/task_vip_btn.png b/src/assets/images/png/task_vip_btn.png new file mode 100644 index 0000000..975499a Binary files /dev/null and b/src/assets/images/png/task_vip_btn.png differ diff --git a/src/assets/images/png/tip_bg.png b/src/assets/images/png/tip_bg.png new file mode 100644 index 0000000..75fc95e Binary files /dev/null and b/src/assets/images/png/tip_bg.png differ diff --git a/src/assets/images/png/tuigbg_new.png b/src/assets/images/png/tuigbg_new.png new file mode 100644 index 0000000..1200cb4 Binary files /dev/null and b/src/assets/images/png/tuigbg_new.png differ diff --git a/src/assets/images/png/up_vip_bg.png b/src/assets/images/png/up_vip_bg.png new file mode 100644 index 0000000..e1758c7 Binary files /dev/null and b/src/assets/images/png/up_vip_bg.png differ diff --git a/src/assets/images/png/up_vip_btn.png b/src/assets/images/png/up_vip_btn.png new file mode 100644 index 0000000..186254b Binary files /dev/null and b/src/assets/images/png/up_vip_btn.png differ diff --git a/src/assets/images/png/up_vip_icon.png b/src/assets/images/png/up_vip_icon.png new file mode 100644 index 0000000..3370a36 Binary files /dev/null and b/src/assets/images/png/up_vip_icon.png differ diff --git a/src/assets/images/png/userInfo_bg.png b/src/assets/images/png/userInfo_bg.png new file mode 100644 index 0000000..8ec9e16 Binary files /dev/null and b/src/assets/images/png/userInfo_bg.png differ diff --git a/src/assets/images/png/vector_aw.png b/src/assets/images/png/vector_aw.png new file mode 100644 index 0000000..3551f4e Binary files /dev/null and b/src/assets/images/png/vector_aw.png differ diff --git a/src/assets/images/png/vector_aw_active.png b/src/assets/images/png/vector_aw_active.png new file mode 100644 index 0000000..5747ff6 Binary files /dev/null and b/src/assets/images/png/vector_aw_active.png differ diff --git a/src/assets/images/png/video.png b/src/assets/images/png/video.png new file mode 100644 index 0000000..088e9ea Binary files /dev/null and b/src/assets/images/png/video.png differ diff --git a/src/assets/images/png/vipLv/lv1.png b/src/assets/images/png/vipLv/lv1.png new file mode 100644 index 0000000..3a6977f Binary files /dev/null and b/src/assets/images/png/vipLv/lv1.png differ diff --git a/src/assets/images/png/vipLv/lv2.png b/src/assets/images/png/vipLv/lv2.png new file mode 100644 index 0000000..ecde502 Binary files /dev/null and b/src/assets/images/png/vipLv/lv2.png differ diff --git a/src/assets/images/png/vipLv/lv3.png b/src/assets/images/png/vipLv/lv3.png new file mode 100644 index 0000000..d5ac9f2 Binary files /dev/null and b/src/assets/images/png/vipLv/lv3.png differ diff --git a/src/assets/images/png/vipLv/lv4.png b/src/assets/images/png/vipLv/lv4.png new file mode 100644 index 0000000..78a632d Binary files /dev/null and b/src/assets/images/png/vipLv/lv4.png differ diff --git a/src/assets/images/png/vipLv/lv5.png b/src/assets/images/png/vipLv/lv5.png new file mode 100644 index 0000000..fbbe4dc Binary files /dev/null and b/src/assets/images/png/vipLv/lv5.png differ diff --git a/src/assets/images/png/vipboxsbg_new.png b/src/assets/images/png/vipboxsbg_new.png new file mode 100644 index 0000000..ee8437e Binary files /dev/null and b/src/assets/images/png/vipboxsbg_new.png differ diff --git a/src/assets/images/png/workRight.png b/src/assets/images/png/workRight.png new file mode 100644 index 0000000..4362b3f Binary files /dev/null and b/src/assets/images/png/workRight.png differ diff --git a/src/assets/images/png/yuan_wei_icon.png b/src/assets/images/png/yuan_wei_icon.png new file mode 100644 index 0000000..c0c295c Binary files /dev/null and b/src/assets/images/png/yuan_wei_icon.png differ diff --git a/src/assets/images/webp/place_holder_logo.webp b/src/assets/images/webp/place_holder_logo.webp new file mode 100644 index 0000000..2745bd3 Binary files /dev/null and b/src/assets/images/webp/place_holder_logo.webp differ diff --git a/src/assets/images/webp/placeholder.webp b/src/assets/images/webp/placeholder.webp new file mode 100644 index 0000000..b143d35 Binary files /dev/null and b/src/assets/images/webp/placeholder.webp differ diff --git a/src/assets/images/webp/splash.webp b/src/assets/images/webp/splash.webp new file mode 100644 index 0000000..4b39285 Binary files /dev/null and b/src/assets/images/webp/splash.webp differ diff --git a/src/assets/images/webp/vipAreaBg.webp b/src/assets/images/webp/vipAreaBg.webp new file mode 100644 index 0000000..252ddf7 Binary files /dev/null and b/src/assets/images/webp/vipAreaBg.webp differ diff --git a/src/assets/images/webp/zml.webp b/src/assets/images/webp/zml.webp new file mode 100644 index 0000000..8abe55c Binary files /dev/null and b/src/assets/images/webp/zml.webp differ diff --git a/src/assets/js/inobounce.min.js b/src/assets/js/inobounce.min.js new file mode 100644 index 0000000..99e6d8d --- /dev/null +++ b/src/assets/js/inobounce.min.js @@ -0,0 +1,100 @@ +var startY = 0; +var enabled = false; +var supportsPassiveOption = false; +try { + var opts = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function () { + supportsPassiveOption = true; + }, + }); + window.addEventListener('test', null, opts); +} catch (e) { + console.log(e); +} +var handleTouchmove = function (evt) { + var el = evt.target; + var zoom = window.innerWidth / window.document.documentElement.clientWidth; + if (evt.touches.length > 1 || zoom !== 1) { + return; + } + while (el !== document.body && el !== document) { + var style = window.getComputedStyle(el); + if (!style) { + break; + } + if (el.nodeName === 'INPUT' && el.getAttribute('type') === 'range') { + return; + } + if (el.querySelector('.oepnX')) { + return; + } + var scrolling = style.getPropertyValue('-webkit-overflow-scrolling'); + var overflowY = style.getPropertyValue('overflow-y'); + var height = parseInt(style.getPropertyValue('height'), 10); + var isScrollable = scrolling === 'touch' && (overflowY === 'auto' || overflowY === 'scroll'); + var canScroll = el.scrollHeight > el.offsetHeight; + if (isScrollable && canScroll) { + var curY = evt.touches ? evt.touches[0].screenY : evt.screenY; + var isAtTop = startY <= curY && el.scrollTop === 0; + var isAtBottom = startY >= curY && el.scrollHeight - el.scrollTop - 10 <= height; + if (isAtTop || isAtBottom) { + evt.preventDefault(); + } + return; + } + el = el.parentNode; + } + evt.preventDefault(); +}; +var handleTouchstart = function (evt) { + startY = evt.touches ? evt.touches[0].screenY : evt.screenY; +}; +var enable = function () { + window.addEventListener( + 'touchstart', + handleTouchstart, + supportsPassiveOption + ? { + passive: false, + } + : false, + ); + window.addEventListener( + 'touchmove', + handleTouchmove, + supportsPassiveOption + ? { + passive: false, + } + : false, + ); + enabled = true; +}; +var disable = function () { + window.removeEventListener('touchstart', handleTouchstart, false); + window.removeEventListener('touchmove', handleTouchmove, false); + enabled = false; +}; +var isEnabled = function () { + return enabled; +}; +var testDiv = document.createElement('div'); +document.documentElement.appendChild(testDiv); +testDiv.style.WebkitOverflowScrolling = 'touch'; +var isScrollSupported = + 'getComputedStyle' in window && window.getComputedStyle(testDiv)['-webkit-overflow-scrolling'] === 'touch'; +document.documentElement.removeChild(testDiv); +if (isScrollSupported) { + enable(); +} +var iNoBounce = { + enable: enable, + disable: disable, + isEnabled: isEnabled, + isScrollSupported: isScrollSupported, +}; +if (typeof module !== 'undefined' && module.exports) { + module.exports = iNoBounce; +} +export default iNoBounce; diff --git a/src/assets/js/llqrcode.js b/src/assets/js/llqrcode.js new file mode 100644 index 0000000..5b4668a --- /dev/null +++ b/src/assets/js/llqrcode.js @@ -0,0 +1,2518 @@ +var _aa = {}; +_aa._ab = function (f, e) { + var d = qrcode.width; + var b = qrcode.height; + var c = true; + for (var g = 0; g < e.length && c; g += 2) { + var a = Math.floor(e[g]); + var h = Math.floor(e[g + 1]); + if (a < -1 || a > d || h < -1 || h > b) { + throw"Error._ab " + } + c = false; + if (a == -1) { + e[g] = 0; + c = true + } else { + if (a == d) { + e[g] = d - 1; + c = true + } + } + if (h == -1) { + e[g + 1] = 0; + c = true + } else { + if (h == b) { + e[g + 1] = b - 1; + c = true + } + } + } + c = true; + for (var g = e.length - 2; g >= 0 && c; g -= 2) { + var a = Math.floor(e[g]); + var h = Math.floor(e[g + 1]); + if (a < -1 || a > d || h < -1 || h > b) { + throw"Error._ab " + } + c = false; + if (a == -1) { + e[g] = 0; + c = true + } else { + if (a == d) { + e[g] = d - 1; + c = true + } + } + if (h == -1) { + e[g + 1] = 0; + c = true + } else { + if (h == b) { + e[g + 1] = b - 1; + c = true + } + } + } +}; +_aa._af = function (b, d, a) { + var k = new _ac(d); + var j = new Array(d << 1); + for (var f = 0; f < d; f++) { + var g = j.length; + var i = f + 0.5; + for (var h = 0; h < g; h += 2) { + j[h] = (h >> 1) + 0.5; + j[h + 1] = i + } + a._ad(j); + _aa._ab(b, j); + try { + for (var h = 0; h < g; h += 2) { + var e = b[Math.floor(j[h]) + qrcode.width * Math.floor(j[h + 1])]; + if (e) { + k._dq(h >> 1, f) + } + } + } catch (c) { + throw"Error._ab" + } + } + return k +}; +_aa._ah = function (h, o, l, k, q, p, b, a, f, e, n, m, s, r, d, c, j, i) { + var g = _ae._ag(l, k, q, p, b, a, f, e, n, m, s, r, d, c, j, i); + return _aa._af(h, o, g) +}; + +function _a1(b, a) { + this.count = b; + this._fc = a; + this.__defineGetter__("Count", function () { + return this.count + }); + this.__defineGetter__("_dm", function () { + return this._fc + }) +} + +function _a2(a, c, b) { + this._bm = a; + if (b) { + this._do = new Array(c, b) + } else { + this._do = new Array(c) + } + this.__defineGetter__("_bo", function () { + return this._bm + }); + this.__defineGetter__("_dn", function () { + return this._bm * this._fo + }); + this.__defineGetter__("_fo", function () { + var e = 0; + for (var d = 0; d < this._do.length; d++) { + e += this._do[d].length + } + return e + }); + this._fb = function () { + return this._do + } +} + +function _a3(k, l, h, g, f, e) { + this._bs = k; + this._ar = l; + this._do = new Array(h, g, f, e); + var j = 0; + var b = h._bo; + var a = h._fb(); + for (var d = 0; d < a.length; d++) { + var c = a[d]; + j += c.Count * (c._dm + b) + } + this._br = j; + this.__defineGetter__("_fd", function () { + return this._bs + }); + this.__defineGetter__("_as", function () { + return this._ar + }); + this.__defineGetter__("_dp", function () { + return this._br + }); + this.__defineGetter__("_cr", function () { + return 17 + 4 * this._bs + }); + this._aq = function () { + var q = this._cr; + var o = new _ac(q); + o._bq(0, 0, 9, 9); + o._bq(q - 8, 0, 8, 9); + o._bq(0, q - 8, 9, 8); + var n = this._ar.length; + for (var m = 0; m < n; m++) { + var p = this._ar[m] - 2; + for (var r = 0; r < n; r++) { + if ((m == 0 && (r == 0 || r == n - 1)) || (m == n - 1 && r == 0)) { + continue + } + o._bq(this._ar[r] - 2, p, 5, 5) + } + } + o._bq(6, 9, 1, q - 17); + o._bq(9, 6, q - 17, 1); + if (this._bs > 6) { + o._bq(q - 11, 0, 3, 6); + o._bq(0, q - 11, 6, 3) + } + return o + }; + this._bu = function (i) { + return this._do[i.ordinal()] + } +} + +_a3._bv = new Array(31892, 34236, 39577, 42195, 48118, 51042, 55367, 58893, 63784, 68472, 70749, 76311, 79154, 84390, 87683, 92361, 96236, 102084, 102881, 110507, 110734, 117786, 119615, 126325, 127568, 133589, 136944, 141498, 145311, 150283, 152622, 158308, 161089, 167017); +_a3.VERSIONS = _ay(); +_a3._av = function (a) { + if (a < 1 || a > 40) { + throw"bad arguments" + } + return _a3.VERSIONS[a - 1] +}; +_a3._at = function (b) { + if (b % 4 != 1) { + throw"Error _at" + } + try { + return _a3._av((b - 17) >> 2) + } catch (a) { + throw"Error _av" + } +}; +_a3._aw = function (d) { + var b = 4294967295; + var f = 0; + for (var c = 0; c < _a3._bv.length; c++) { + var a = _a3._bv[c]; + if (a == d) { + return this._av(c + 7) + } + var e = _ax._gj(d, a); + if (e < b) { + f = c + 7; + b = e + } + } + if (b <= 3) { + return this._av(f) + } + return null +}; + +function _ay() { + return new Array(new _a3(1, new Array(), new _a2(7, new _a1(1, 19)), new _a2(10, new _a1(1, 16)), new _a2(13, new _a1(1, 13)), new _a2(17, new _a1(1, 9))), new _a3(2, new Array(6, 18), new _a2(10, new _a1(1, 34)), new _a2(16, new _a1(1, 28)), new _a2(22, new _a1(1, 22)), new _a2(28, new _a1(1, 16))), new _a3(3, new Array(6, 22), new _a2(15, new _a1(1, 55)), new _a2(26, new _a1(1, 44)), new _a2(18, new _a1(2, 17)), new _a2(22, new _a1(2, 13))), new _a3(4, new Array(6, 26), new _a2(20, new _a1(1, 80)), new _a2(18, new _a1(2, 32)), new _a2(26, new _a1(2, 24)), new _a2(16, new _a1(4, 9))), new _a3(5, new Array(6, 30), new _a2(26, new _a1(1, 108)), new _a2(24, new _a1(2, 43)), new _a2(18, new _a1(2, 15), new _a1(2, 16)), new _a2(22, new _a1(2, 11), new _a1(2, 12))), new _a3(6, new Array(6, 34), new _a2(18, new _a1(2, 68)), new _a2(16, new _a1(4, 27)), new _a2(24, new _a1(4, 19)), new _a2(28, new _a1(4, 15))), new _a3(7, new Array(6, 22, 38), new _a2(20, new _a1(2, 78)), new _a2(18, new _a1(4, 31)), new _a2(18, new _a1(2, 14), new _a1(4, 15)), new _a2(26, new _a1(4, 13), new _a1(1, 14))), new _a3(8, new Array(6, 24, 42), new _a2(24, new _a1(2, 97)), new _a2(22, new _a1(2, 38), new _a1(2, 39)), new _a2(22, new _a1(4, 18), new _a1(2, 19)), new _a2(26, new _a1(4, 14), new _a1(2, 15))), new _a3(9, new Array(6, 26, 46), new _a2(30, new _a1(2, 116)), new _a2(22, new _a1(3, 36), new _a1(2, 37)), new _a2(20, new _a1(4, 16), new _a1(4, 17)), new _a2(24, new _a1(4, 12), new _a1(4, 13))), new _a3(10, new Array(6, 28, 50), new _a2(18, new _a1(2, 68), new _a1(2, 69)), new _a2(26, new _a1(4, 43), new _a1(1, 44)), new _a2(24, new _a1(6, 19), new _a1(2, 20)), new _a2(28, new _a1(6, 15), new _a1(2, 16))), new _a3(11, new Array(6, 30, 54), new _a2(20, new _a1(4, 81)), new _a2(30, new _a1(1, 50), new _a1(4, 51)), new _a2(28, new _a1(4, 22), new _a1(4, 23)), new _a2(24, new _a1(3, 12), new _a1(8, 13))), new _a3(12, new Array(6, 32, 58), new _a2(24, new _a1(2, 92), new _a1(2, 93)), new _a2(22, new _a1(6, 36), new _a1(2, 37)), new _a2(26, new _a1(4, 20), new _a1(6, 21)), new _a2(28, new _a1(7, 14), new _a1(4, 15))), new _a3(13, new Array(6, 34, 62), new _a2(26, new _a1(4, 107)), new _a2(22, new _a1(8, 37), new _a1(1, 38)), new _a2(24, new _a1(8, 20), new _a1(4, 21)), new _a2(22, new _a1(12, 11), new _a1(4, 12))), new _a3(14, new Array(6, 26, 46, 66), new _a2(30, new _a1(3, 115), new _a1(1, 116)), new _a2(24, new _a1(4, 40), new _a1(5, 41)), new _a2(20, new _a1(11, 16), new _a1(5, 17)), new _a2(24, new _a1(11, 12), new _a1(5, 13))), new _a3(15, new Array(6, 26, 48, 70), new _a2(22, new _a1(5, 87), new _a1(1, 88)), new _a2(24, new _a1(5, 41), new _a1(5, 42)), new _a2(30, new _a1(5, 24), new _a1(7, 25)), new _a2(24, new _a1(11, 12), new _a1(7, 13))), new _a3(16, new Array(6, 26, 50, 74), new _a2(24, new _a1(5, 98), new _a1(1, 99)), new _a2(28, new _a1(7, 45), new _a1(3, 46)), new _a2(24, new _a1(15, 19), new _a1(2, 20)), new _a2(30, new _a1(3, 15), new _a1(13, 16))), new _a3(17, new Array(6, 30, 54, 78), new _a2(28, new _a1(1, 107), new _a1(5, 108)), new _a2(28, new _a1(10, 46), new _a1(1, 47)), new _a2(28, new _a1(1, 22), new _a1(15, 23)), new _a2(28, new _a1(2, 14), new _a1(17, 15))), new _a3(18, new Array(6, 30, 56, 82), new _a2(30, new _a1(5, 120), new _a1(1, 121)), new _a2(26, new _a1(9, 43), new _a1(4, 44)), new _a2(28, new _a1(17, 22), new _a1(1, 23)), new _a2(28, new _a1(2, 14), new _a1(19, 15))), new _a3(19, new Array(6, 30, 58, 86), new _a2(28, new _a1(3, 113), new _a1(4, 114)), new _a2(26, new _a1(3, 44), new _a1(11, 45)), new _a2(26, new _a1(17, 21), new _a1(4, 22)), new _a2(26, new _a1(9, 13), new _a1(16, 14))), new _a3(20, new Array(6, 34, 62, 90), new _a2(28, new _a1(3, 107), new _a1(5, 108)), new _a2(26, new _a1(3, 41), new _a1(13, 42)), new _a2(30, new _a1(15, 24), new _a1(5, 25)), new _a2(28, new _a1(15, 15), new _a1(10, 16))), new _a3(21, new Array(6, 28, 50, 72, 94), new _a2(28, new _a1(4, 116), new _a1(4, 117)), new _a2(26, new _a1(17, 42)), new _a2(28, new _a1(17, 22), new _a1(6, 23)), new _a2(30, new _a1(19, 16), new _a1(6, 17))), new _a3(22, new Array(6, 26, 50, 74, 98), new _a2(28, new _a1(2, 111), new _a1(7, 112)), new _a2(28, new _a1(17, 46)), new _a2(30, new _a1(7, 24), new _a1(16, 25)), new _a2(24, new _a1(34, 13))), new _a3(23, new Array(6, 30, 54, 78, 102), new _a2(30, new _a1(4, 121), new _a1(5, 122)), new _a2(28, new _a1(4, 47), new _a1(14, 48)), new _a2(30, new _a1(11, 24), new _a1(14, 25)), new _a2(30, new _a1(16, 15), new _a1(14, 16))), new _a3(24, new Array(6, 28, 54, 80, 106), new _a2(30, new _a1(6, 117), new _a1(4, 118)), new _a2(28, new _a1(6, 45), new _a1(14, 46)), new _a2(30, new _a1(11, 24), new _a1(16, 25)), new _a2(30, new _a1(30, 16), new _a1(2, 17))), new _a3(25, new Array(6, 32, 58, 84, 110), new _a2(26, new _a1(8, 106), new _a1(4, 107)), new _a2(28, new _a1(8, 47), new _a1(13, 48)), new _a2(30, new _a1(7, 24), new _a1(22, 25)), new _a2(30, new _a1(22, 15), new _a1(13, 16))), new _a3(26, new Array(6, 30, 58, 86, 114), new _a2(28, new _a1(10, 114), new _a1(2, 115)), new _a2(28, new _a1(19, 46), new _a1(4, 47)), new _a2(28, new _a1(28, 22), new _a1(6, 23)), new _a2(30, new _a1(33, 16), new _a1(4, 17))), new _a3(27, new Array(6, 34, 62, 90, 118), new _a2(30, new _a1(8, 122), new _a1(4, 123)), new _a2(28, new _a1(22, 45), new _a1(3, 46)), new _a2(30, new _a1(8, 23), new _a1(26, 24)), new _a2(30, new _a1(12, 15), new _a1(28, 16))), new _a3(28, new Array(6, 26, 50, 74, 98, 122), new _a2(30, new _a1(3, 117), new _a1(10, 118)), new _a2(28, new _a1(3, 45), new _a1(23, 46)), new _a2(30, new _a1(4, 24), new _a1(31, 25)), new _a2(30, new _a1(11, 15), new _a1(31, 16))), new _a3(29, new Array(6, 30, 54, 78, 102, 126), new _a2(30, new _a1(7, 116), new _a1(7, 117)), new _a2(28, new _a1(21, 45), new _a1(7, 46)), new _a2(30, new _a1(1, 23), new _a1(37, 24)), new _a2(30, new _a1(19, 15), new _a1(26, 16))), new _a3(30, new Array(6, 26, 52, 78, 104, 130), new _a2(30, new _a1(5, 115), new _a1(10, 116)), new _a2(28, new _a1(19, 47), new _a1(10, 48)), new _a2(30, new _a1(15, 24), new _a1(25, 25)), new _a2(30, new _a1(23, 15), new _a1(25, 16))), new _a3(31, new Array(6, 30, 56, 82, 108, 134), new _a2(30, new _a1(13, 115), new _a1(3, 116)), new _a2(28, new _a1(2, 46), new _a1(29, 47)), new _a2(30, new _a1(42, 24), new _a1(1, 25)), new _a2(30, new _a1(23, 15), new _a1(28, 16))), new _a3(32, new Array(6, 34, 60, 86, 112, 138), new _a2(30, new _a1(17, 115)), new _a2(28, new _a1(10, 46), new _a1(23, 47)), new _a2(30, new _a1(10, 24), new _a1(35, 25)), new _a2(30, new _a1(19, 15), new _a1(35, 16))), new _a3(33, new Array(6, 30, 58, 86, 114, 142), new _a2(30, new _a1(17, 115), new _a1(1, 116)), new _a2(28, new _a1(14, 46), new _a1(21, 47)), new _a2(30, new _a1(29, 24), new _a1(19, 25)), new _a2(30, new _a1(11, 15), new _a1(46, 16))), new _a3(34, new Array(6, 34, 62, 90, 118, 146), new _a2(30, new _a1(13, 115), new _a1(6, 116)), new _a2(28, new _a1(14, 46), new _a1(23, 47)), new _a2(30, new _a1(44, 24), new _a1(7, 25)), new _a2(30, new _a1(59, 16), new _a1(1, 17))), new _a3(35, new Array(6, 30, 54, 78, 102, 126, 150), new _a2(30, new _a1(12, 121), new _a1(7, 122)), new _a2(28, new _a1(12, 47), new _a1(26, 48)), new _a2(30, new _a1(39, 24), new _a1(14, 25)), new _a2(30, new _a1(22, 15), new _a1(41, 16))), new _a3(36, new Array(6, 24, 50, 76, 102, 128, 154), new _a2(30, new _a1(6, 121), new _a1(14, 122)), new _a2(28, new _a1(6, 47), new _a1(34, 48)), new _a2(30, new _a1(46, 24), new _a1(10, 25)), new _a2(30, new _a1(2, 15), new _a1(64, 16))), new _a3(37, new Array(6, 28, 54, 80, 106, 132, 158), new _a2(30, new _a1(17, 122), new _a1(4, 123)), new _a2(28, new _a1(29, 46), new _a1(14, 47)), new _a2(30, new _a1(49, 24), new _a1(10, 25)), new _a2(30, new _a1(24, 15), new _a1(46, 16))), new _a3(38, new Array(6, 32, 58, 84, 110, 136, 162), new _a2(30, new _a1(4, 122), new _a1(18, 123)), new _a2(28, new _a1(13, 46), new _a1(32, 47)), new _a2(30, new _a1(48, 24), new _a1(14, 25)), new _a2(30, new _a1(42, 15), new _a1(32, 16))), new _a3(39, new Array(6, 26, 54, 82, 110, 138, 166), new _a2(30, new _a1(20, 117), new _a1(4, 118)), new _a2(28, new _a1(40, 47), new _a1(7, 48)), new _a2(30, new _a1(43, 24), new _a1(22, 25)), new _a2(30, new _a1(10, 15), new _a1(67, 16))), new _a3(40, new Array(6, 30, 58, 86, 114, 142, 170), new _a2(30, new _a1(19, 118), new _a1(6, 119)), new _a2(28, new _a1(18, 47), new _a1(31, 48)), new _a2(30, new _a1(34, 24), new _a1(34, 25)), new _a2(30, new _a1(20, 15), new _a1(61, 16)))) +} + +function _ae(i, f, c, h, e, b, g, d, a) { + this.a11 = i; + this.a12 = h; + this.a13 = g; + this.a21 = f; + this.a22 = e; + this.a23 = d; + this.a31 = c; + this.a32 = b; + this.a33 = a; + this._ad = function (v) { + var s = v.length; + var z = this.a11; + var w = this.a12; + var u = this.a13; + var q = this.a21; + var p = this.a22; + var o = this.a23; + var m = this.a31; + var k = this.a32; + var j = this.a33; + for (var n = 0; n < s; n += 2) { + var t = v[n]; + var r = v[n + 1]; + var l = u * t + o * r + j; + v[n] = (z * t + q * r + m) / l; + v[n + 1] = (w * t + p * r + k) / l + } + }; + this._fp = function (m, k) { + var q = m.length; + for (var l = 0; l < q; l++) { + var j = m[l]; + var p = k[l]; + var o = this.a13 * j + this.a23 * p + this.a33; + m[l] = (this.a11 * j + this.a21 * p + this.a31) / o; + k[l] = (this.a12 * j + this.a22 * p + this.a32) / o + } + }; + this._fr = function () { + return new _ae(this.a22 * this.a33 - this.a23 * this.a32, this.a23 * this.a31 - this.a21 * this.a33, this.a21 * this.a32 - this.a22 * this.a31, this.a13 * this.a32 - this.a12 * this.a33, this.a11 * this.a33 - this.a13 * this.a31, this.a12 * this.a31 - this.a11 * this.a32, this.a12 * this.a23 - this.a13 * this.a22, this.a13 * this.a21 - this.a11 * this.a23, this.a11 * this.a22 - this.a12 * this.a21) + }; + this.times = function (j) { + return new _ae(this.a11 * j.a11 + this.a21 * j.a12 + this.a31 * j.a13, this.a11 * j.a21 + this.a21 * j.a22 + this.a31 * j.a23, this.a11 * j.a31 + this.a21 * j.a32 + this.a31 * j.a33, this.a12 * j.a11 + this.a22 * j.a12 + this.a32 * j.a13, this.a12 * j.a21 + this.a22 * j.a22 + this.a32 * j.a23, this.a12 * j.a31 + this.a22 * j.a32 + this.a32 * j.a33, this.a13 * j.a11 + this.a23 * j.a12 + this.a33 * j.a13, this.a13 * j.a21 + this.a23 * j.a22 + this.a33 * j.a23, this.a13 * j.a31 + this.a23 * j.a32 + this.a33 * j.a33) + } +} + +_ae._ag = function (p, e, o, d, n, c, m, b, h, q, l, f, a, j, i, r) { + var g = this._be(p, e, o, d, n, c, m, b); + var k = this._bf(h, q, l, f, a, j, i, r); + return k.times(g) +}; +_ae._bf = function (d, p, c, m, b, k, a, j) { + var h = j - k; + var f = p - m + k - j; + if (h == 0 && f == 0) { + return new _ae(c - d, b - c, d, m - p, k - m, p, 0, 0, 1) + } else { + var q = c - b; + var o = a - b; + var l = d - c + b - a; + var i = m - k; + var e = q * h - o * i; + var n = (l * h - o * f) / e; + var g = (q * f - l * i) / e; + return new _ae(c - d + n * c, a - d + g * a, d, m - p + n * m, j - p + g * j, p, n, g, 1) + } +}; +_ae._be = function (f, h, d, g, b, e, a, c) { + return this._bf(f, h, d, g, b, e, a, c)._fr() +}; + +function _bg(b, a) { + this.bits = b; + this.points = a +} + +function Detector(a) { + this.image = a; + this._am = null; + this._bi = function (m, l, c, b) { + var d = Math.abs(b - l) > Math.abs(c - m); + if (d) { + var r = m; + m = l; + l = r; + r = c; + c = b; + b = r + } + var j = Math.abs(c - m); + var i = Math.abs(b - l); + var p = -j >> 1; + var u = l < b ? 1 : -1; + var f = m < c ? 1 : -1; + var e = 0; + for (var h = m, g = l; h != c; h += f) { + var t = d ? g : h; + var s = d ? h : g; + if (e == 1) { + if (this.image[t + s * qrcode.width]) { + e++ + } + } else { + if (!this.image[t + s * qrcode.width]) { + e++ + } + } + if (e == 3) { + var o = h - m; + var n = g - l; + return Math.sqrt((o * o + n * n)) + } + p += i; + if (p > 0) { + if (g == b) { + break + } + g += u; + p -= j + } + } + var k = c - m; + var q = b - l; + return Math.sqrt((k * k + q * q)) + }; + this._bh = function (i, g, h, f) { + var b = this._bi(i, g, h, f); + var e = 1; + var d = i - (h - i); + if (d < 0) { + e = i / (i - d); + d = 0 + } else { + if (d >= qrcode.width) { + e = (qrcode.width - 1 - i) / (d - i); + d = qrcode.width - 1 + } + } + var c = Math.floor(g - (f - g) * e); + e = 1; + if (c < 0) { + e = g / (g - c); + c = 0 + } else { + if (c >= qrcode.height) { + e = (qrcode.height - 1 - g) / (c - g); + c = qrcode.height - 1 + } + } + d = Math.floor(i + (d - i) * e); + b += this._bi(i, g, d, c); + return b - 1 + }; + this._bj = function (c, d) { + var b = this._bh(Math.floor(c.X), Math.floor(c.Y), Math.floor(d.X), Math.floor(d.Y)); + var e = this._bh(Math.floor(d.X), Math.floor(d.Y), Math.floor(c.X), Math.floor(c.Y)); + if (isNaN(b)) { + return e / 7 + } + if (isNaN(e)) { + return b / 7 + } + return (b + e) / 14 + }; + this._bk = function (d, c, b) { + return (this._bj(d, c) + this._bj(d, b)) / 2 + }; + this.distance = function (d, b) { + var e = d.X - b.X; + var c = d.Y - b.Y; + return Math.sqrt((e * e + c * c)) + }; + this._bx = function (g, f, d, e) { + var b = Math.round(this.distance(g, f) / e); + var c = Math.round(this.distance(g, d) / e); + var h = ((b + c) >> 1) + 7; + switch (h & 3) { + case 0: + h++; + break; + case 2: + h--; + break; + case 3: + throw"Error" + } + return h + }; + this._bl = function (g, f, d, j) { + var k = Math.floor(j * g); + var h = Math.max(0, f - k); + var i = Math.min(qrcode.width - 1, f + k); + if (i - h < g * 3) { + throw"Error" + } + var b = Math.max(0, d - k); + var c = Math.min(qrcode.height - 1, d + k); + var e = new _ak(this.image, h, b, i - h, c - b, g, this._am); + return e.find() + }; + this.createTransform = function (l, h, k, b, g) { + var j = g - 3.5; + var i; + var f; + var e; + var c; + if (b != null) { + i = b.X; + f = b.Y; + e = c = j - 3 + } else { + i = (h.X - l.X) + k.X; + f = (h.Y - l.Y) + k.Y; + e = c = j + } + var d = _ae._ag(3.5, 3.5, j, 3.5, e, c, 3.5, j, l.X, l.Y, h.X, h.Y, i, f, k.X, k.Y); + return d + }; + this._bz = function (e, b, d) { + var c = _aa; + return c._af(e, d, b) + }; + this._cd = function (q) { + var j = q._gq; + var h = q._gs; + var n = q._gp; + var d = this._bk(j, h, n); + if (d < 1) { + throw"Error" + } + var r = this._bx(j, h, n, d); + var b = _a3._at(r); + var k = b._cr - 7; + var l = null; + if (b._as.length > 0) { + var f = h.X - j.X + n.X; + var e = h.Y - j.Y + n.Y; + var c = 1 - 3 / k; + var t = Math.floor(j.X + c * (f - j.X)); + var s = Math.floor(j.Y + c * (e - j.Y)); + for (var p = 4; p <= 16; p <<= 1) { + l = this._bl(d, t, s, p); + break + } + } + var g = this.createTransform(j, h, n, l, r); + var m = this._bz(this.image, g, r); + var o; + if (l == null) { + o = new Array(n, j, h) + } else { + o = new Array(n, j, h, l) + } + return new _bg(m, o) + }; + this.detect = function () { + var b = new _cc()._ce(this.image); + return this._cd(b) + } +} + +var _ca = 21522; +var _cb = new Array(new Array(21522, 0), new Array(20773, 1), new Array(24188, 2), new Array(23371, 3), new Array(17913, 4), new Array(16590, 5), new Array(20375, 6), new Array(19104, 7), new Array(30660, 8), new Array(29427, 9), new Array(32170, 10), new Array(30877, 11), new Array(26159, 12), new Array(25368, 13), new Array(27713, 14), new Array(26998, 15), new Array(5769, 16), new Array(5054, 17), new Array(7399, 18), new Array(6608, 19), new Array(1890, 20), new Array(597, 21), new Array(3340, 22), new Array(2107, 23), new Array(13663, 24), new Array(12392, 25), new Array(16177, 26), new Array(14854, 27), new Array(9396, 28), new Array(8579, 29), new Array(11994, 30), new Array(11245, 31)); +var _ch = new Array(0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4); + +function _ax(a) { + this._cf = _cg.forBits((a >> 3) & 3); + this._fe = (a & 7); + this.__defineGetter__("_cg", function () { + return this._cf + }); + this.__defineGetter__("_dx", function () { + return this._fe + }); + this.GetHashCode = function () { + return (this._cf.ordinal() << 3) | this._fe + }; + this.Equals = function (c) { + var b = c; + return this._cf == b._cf && this._fe == b._fe + } +} + +_ax._gj = function (d, c) { + d ^= c; + return _ch[d & 15] + _ch[(_ew(d, 4) & 15)] + _ch[(_ew(d, 8) & 15)] + _ch[(_ew(d, 12) & 15)] + _ch[(_ew(d, 16) & 15)] + _ch[(_ew(d, 20) & 15)] + _ch[(_ew(d, 24) & 15)] + _ch[(_ew(d, 28) & 15)] +}; +_ax._ci = function (a) { + var b = _ax._cj(a); + if (b != null) { + return b + } + return _ax._cj(a ^ _ca) +}; +_ax._cj = function (d) { + var b = 4294967295; + var a = 0; + for (var c = 0; c < _cb.length; c++) { + var g = _cb[c]; + var f = g[0]; + if (f == d) { + return new _ax(g[1]) + } + var e = this._gj(d, f); + if (e < b) { + a = g[1]; + b = e + } + } + if (b <= 3) { + return new _ax(a) + } + return null +}; + +function _cg(a, c, b) { + this._ff = a; + this.bits = c; + this.name = b; + this.__defineGetter__("Bits", function () { + return this.bits + }); + this.__defineGetter__("Name", function () { + return this.name + }); + this.ordinal = function () { + return this._ff + } +} + +_cg.forBits = function (a) { + if (a < 0 || a >= FOR_BITS.length) { + throw"bad arguments" + } + return FOR_BITS[a] +}; +var L = new _cg(0, 1, "L"); +var M = new _cg(1, 0, "M"); +var Q = new _cg(2, 3, "Q"); +var H = new _cg(3, 2, "H"); +var FOR_BITS = new Array(M, L, H, Q); + +function _ac(d, a) { + if (!a) { + a = d + } + if (d < 1 || a < 1) { + throw"Both dimensions must be greater than 0" + } + this.width = d; + this.height = a; + var c = d >> 5; + if ((d & 31) != 0) { + c++ + } + this.rowSize = c; + this.bits = new Array(c * a); + for (var b = 0; b < this.bits.length; b++) { + this.bits[b] = 0 + } + this.__defineGetter__("Width", function () { + return this.width + }); + this.__defineGetter__("Height", function () { + return this.height + }); + this.__defineGetter__("Dimension", function () { + if (this.width != this.height) { + throw"Can't call getDimension() on a non-square matrix" + } + return this.width + }); + this._ds = function (e, g) { + var f = g * this.rowSize + (e >> 5); + return ((_ew(this.bits[f], (e & 31))) & 1) != 0 + }; + this._dq = function (e, g) { + var f = g * this.rowSize + (e >> 5); + this.bits[f] |= 1 << (e & 31) + }; + this.flip = function (e, g) { + var f = g * this.rowSize + (e >> 5); + this.bits[f] ^= 1 << (e & 31) + }; + this.clear = function () { + var e = this.bits.length; + for (var f = 0; f < e; f++) { + this.bits[f] = 0 + } + }; + this._bq = function (g, j, f, m) { + if (j < 0 || g < 0) { + throw"Left and top must be nonnegative" + } + if (m < 1 || f < 1) { + throw"Height and width must be at least 1" + } + var l = g + f; + var e = j + m; + if (e > this.height || l > this.width) { + throw"The region must fit inside the matrix" + } + for (var i = j; i < e; i++) { + var h = i * this.rowSize; + for (var k = g; k < l; k++) { + this.bits[h + (k >> 5)] |= 1 << (k & 31) + } + } + } +} + +function _dl(a, b) { + this._dv = a; + this._dw = b; + this.__defineGetter__("_du", function () { + return this._dv + }); + this.__defineGetter__("Codewords", function () { + return this._dw + }) +} + +_dl._gn = function (c, h, r) { + if (c.length != h._dp) { + throw"bad arguments" + } + var k = h._bu(r); + var e = 0; + var d = k._fb(); + for (var q = 0; q < d.length; q++) { + e += d[q].Count + } + var l = new Array(e); + var n = 0; + for (var o = 0; o < d.length; o++) { + var f = d[o]; + for (var q = 0; q < f.Count; q++) { + var m = f._dm; + var s = k._bo + m; + l[n++] = new _dl(m, new Array(s)) + } + } + var t = l[0]._dw.length; + var b = l.length - 1; + while (b >= 0) { + var v = l[b]._dw.length; + if (v == t) { + break + } + b-- + } + b++; + var g = t - k._bo; + var a = 0; + for (var q = 0; q < g; q++) { + for (var o = 0; o < n; o++) { + l[o]._dw[q] = c[a++] + } + } + for (var o = b; o < n; o++) { + l[o]._dw[g] = c[a++] + } + var p = l[0]._dw.length; + for (var q = g; q < p; q++) { + for (var o = 0; o < n; o++) { + var u = o < b ? q : q + 1; + l[o]._dw[u] = c[a++] + } + } + return l +}; + +function _cl(a) { + var b = a.Dimension; + if (b < 21 || (b & 3) != 1) { + throw"Error _cl" + } + this._au = a; + this._cp = null; + this._co = null; + this._dk = function (d, c, e) { + return this._au._ds(d, c) ? (e << 1) | 1 : e << 1 + }; + this._cm = function () { + if (this._co != null) { + return this._co + } + var g = 0; + for (var e = 0; e < 6; e++) { + g = this._dk(e, 8, g) + } + g = this._dk(7, 8, g); + g = this._dk(8, 8, g); + g = this._dk(8, 7, g); + for (var c = 5; c >= 0; c--) { + g = this._dk(8, c, g) + } + this._co = _ax._ci(g); + if (this._co != null) { + return this._co + } + var f = this._au.Dimension; + g = 0; + var d = f - 8; + for (var e = f - 1; e >= d; e--) { + g = this._dk(e, 8, g) + } + for (var c = f - 7; c < f; c++) { + g = this._dk(8, c, g) + } + this._co = _ax._ci(g); + if (this._co != null) { + return this._co + } + throw"Error _cm" + }; + this._cq = function () { + if (this._cp != null) { + return this._cp + } + var h = this._au.Dimension; + var f = (h - 17) >> 2; + if (f <= 6) { + return _a3._av(f) + } + var g = 0; + var e = h - 11; + for (var c = 5; c >= 0; c--) { + for (var d = h - 9; d >= e; d--) { + g = this._dk(d, c, g) + } + } + this._cp = _a3._aw(g); + if (this._cp != null && this._cp._cr == h) { + return this._cp + } + g = 0; + for (var d = 5; d >= 0; d--) { + for (var c = h - 9; c >= e; c--) { + g = this._dk(d, c, g) + } + } + this._cp = _a3._aw(g); + if (this._cp != null && this._cp._cr == h) { + return this._cp + } + throw"Error _cq" + }; + this._gk = function () { + var q = this._cm(); + var o = this._cq(); + var c = _dx._gl(q._dx); + var f = this._au.Dimension; + c._dj(this._au, f); + var k = o._aq(); + var n = true; + var r = new Array(o._dp); + var m = 0; + var p = 0; + var h = 0; + for (var e = f - 1; e > 0; e -= 2) { + if (e == 6) { + e-- + } + for (var l = 0; l < f; l++) { + var g = n ? f - 1 - l : l; + for (var d = 0; d < 2; d++) { + if (!k._ds(e - d, g)) { + h++; + p <<= 1; + if (this._au._ds(e - d, g)) { + p |= 1 + } + if (h == 8) { + r[m++] = p; + h = 0; + p = 0 + } + } + } + } + n ^= true + } + if (m != o._dp) { + throw"Error _gk" + } + return r + } +} + +var _dx = {}; +_dx._gl = function (a) { + if (a < 0 || a > 7) { + throw"bad arguments" + } + return _dx._dy[a] +}; + +function _fg() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (b, a) { + return ((b + a) & 1) == 0 + } +} + +function _fh() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (b, a) { + return (b & 1) == 0 + } +} + +function _fi() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (b, a) { + return a % 3 == 0 + } +} + +function _fj() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (b, a) { + return (b + a) % 3 == 0 + } +} + +function _fk() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (b, a) { + return (((_ew(b, 1)) + (a / 3)) & 1) == 0 + } +} + +function _fl() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (c, b) { + var a = c * b; + return (a & 1) + (a % 3) == 0 + } +} + +function _fm() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (c, b) { + var a = c * b; + return (((a & 1) + (a % 3)) & 1) == 0 + } +} + +function _fn() { + this._dj = function (c, d) { + for (var b = 0; b < d; b++) { + for (var a = 0; a < d; a++) { + if (this._fw(b, a)) { + c.flip(a, b) + } + } + } + }; + this._fw = function (b, a) { + return ((((b + a) & 1) + ((b * a) % 3)) & 1) == 0 + } +} + +_dx._dy = new Array(new _fg(), new _fh(), new _fi(), new _fj(), new _fk(), new _fl(), new _fm(), new _fn()); + +function _db(a) { + this._fa = a; + this.decode = function (j, f) { + var c = new _bp(this._fa, j); + var p = new Array(f); + for (var g = 0; g < p.length; g++) { + p[g] = 0 + } + var m = false; + var d = true; + for (var g = 0; g < f; g++) { + var q = c.evaluateAt(this._fa.exp(m ? g + 1 : g)); + p[p.length - 1 - g] = q; + if (q != 0) { + d = false + } + } + if (d) { + return + } + var b = new _bp(this._fa, p); + var l = this._eb(this._fa._ba(f, 1), b, f); + var o = l[0]; + var n = l[1]; + var k = this._ey(o); + var e = this._di(n, k, m); + for (var g = 0; g < k.length; g++) { + var h = j.length - 1 - this._fa.log(k[g]); + if (h < 0) { + throw"ReedSolomonException Bad error location" + } + j[h] = _az._bd(j[h], e[g]) + } + }; + this._eb = function (z, y, f) { + if (z._ec < y._ec) { + var w = z; + z = y; + y = w + } + var B = z; + var k = y; + var o = this._fa.One; + var j = this._fa.Zero; + var e = this._fa.Zero; + var i = this._fa.One; + while (k._ec >= Math.floor(f / 2)) { + var x = B; + var g = o; + var v = e; + B = k; + o = j; + e = i; + if (B.Zero) { + throw"r_{i-1} was zero" + } + k = x; + var m = this._fa.Zero; + var p = B._ex(B._ec); + var h = this._fa.inverse(p); + while (k._ec >= B._ec && !k.Zero) { + var c = k._ec - B._ec; + var A = this._fa.multiply(k._ex(k._ec), h); + m = m._bd(this._fa._ba(c, A)); + k = k._bd(B._dc(c, A)) + } + j = m.multiply1(o)._bd(g); + i = m.multiply1(e)._bd(v) + } + var u = i._ex(0); + if (u == 0) { + throw"ReedSolomonException sigmaTilde(0) was zero" + } + var d = this._fa.inverse(u); + var n = i.multiply2(d); + var l = k.multiply2(d); + return new Array(n, l) + }; + this._ey = function (f) { + var g = f._ec; + if (g == 1) { + return new Array(f._ex(1)) + } + var b = new Array(g); + var d = 0; + for (var c = 1; c < 256 && d < g; c++) { + if (f.evaluateAt(c) == 0) { + b[d] = this._fa.inverse(c); + d++ + } + } + if (d != g) { + throw"Error locator degree does not match number of roots" + } + return b + }; + this._di = function (f, h, g) { + var k = h.length; + var l = new Array(k); + for (var e = 0; e < k; e++) { + var b = this._fa.inverse(h[e]); + var c = 1; + for (var d = 0; d < k; d++) { + if (e != d) { + c = this._fa.multiply(c, _az._bd(1, this._fa.multiply(h[d], b))) + } + } + l[e] = this._fa.multiply(f.evaluateAt(b), this._fa.inverse(c)); + if (g) { + l[e] = this._fa.multiply(l[e], b) + } + } + return l + } +} + +function _bp(f, e) { + if (e == null || e.length == 0) { + throw"bad arguments" + } + this._fa = f; + var c = e.length; + if (c > 1 && e[0] == 0) { + var d = 1; + while (d < c && e[d] == 0) { + d++ + } + if (d == c) { + this._dd = f.Zero._dd + } else { + this._dd = new Array(c - d); + for (var b = 0; b < this._dd.length; b++) { + this._dd[b] = 0 + } + for (var a = 0; a < this._dd.length; a++) { + this._dd[a] = e[d + a] + } + } + } else { + this._dd = e + } + this.__defineGetter__("Zero", function () { + return this._dd[0] == 0 + }); + this.__defineGetter__("_ec", function () { + return this._dd.length - 1 + }); + this.__defineGetter__("Coefficients", function () { + return this._dd + }); + this._ex = function (g) { + return this._dd[this._dd.length - 1 - g] + }; + this.evaluateAt = function (h) { + if (h == 0) { + return this._ex(0) + } + var l = this._dd.length; + if (h == 1) { + var g = 0; + for (var k = 0; k < l; k++) { + g = _az._bd(g, this._dd[k]) + } + return g + } + var j = this._dd[0]; + for (var k = 1; k < l; k++) { + j = _az._bd(this._fa.multiply(h, j), this._dd[k]) + } + return j + }; + this._bd = function (g) { + if (this._fa != g._fa) { + throw"GF256Polys do not have same _az _fa" + } + if (this.Zero) { + return g + } + if (g.Zero) { + return this + } + var o = this._dd; + var n = g._dd; + if (o.length > n.length) { + var j = o; + o = n; + n = j + } + var h = new Array(n.length); + var k = n.length - o.length; + for (var m = 0; m < k; m++) { + h[m] = n[m] + } + for (var l = k; l < n.length; l++) { + h[l] = _az._bd(o[l - k], n[l]) + } + return new _bp(f, h) + }; + this.multiply1 = function (o) { + if (this._fa != o._fa) { + throw"GF256Polys do not have same _az _fa" + } + if (this.Zero || o.Zero) { + return this._fa.Zero + } + var q = this._dd; + var g = q.length; + var l = o._dd; + var n = l.length; + var p = new Array(g + n - 1); + for (var m = 0; m < g; m++) { + var h = q[m]; + for (var k = 0; k < n; k++) { + p[m + k] = _az._bd(p[m + k], this._fa.multiply(h, l[k])) + } + } + return new _bp(this._fa, p) + }; + this.multiply2 = function (g) { + if (g == 0) { + return this._fa.Zero + } + if (g == 1) { + return this + } + var j = this._dd.length; + var k = new Array(j); + for (var h = 0; h < j; h++) { + k[h] = this._fa.multiply(this._dd[h], g) + } + return new _bp(this._fa, k) + }; + this._dc = function (l, g) { + if (l < 0) { + throw"bad arguments" + } + if (g == 0) { + return this._fa.Zero + } + var j = this._dd.length; + var k = new Array(j + l); + for (var h = 0; h < k.length; h++) { + k[h] = 0 + } + for (var h = 0; h < j; h++) { + k[h] = this._fa.multiply(this._dd[h], g) + } + return new _bp(this._fa, k) + }; + this.divide = function (l) { + if (this._fa != l._fa) { + throw"GF256Polys do not have same _az _fa" + } + if (l.Zero) { + throw"Divide by 0" + } + var j = this._fa.Zero; + var o = this; + var g = l._ex(l._ec); + var n = this._fa.inverse(g); + while (o._ec >= l._ec && !o.Zero) { + var m = o._ec - l._ec; + var h = this._fa.multiply(o._ex(o._ec), n); + var i = l._dc(m, h); + var k = this._fa._ba(m, h); + j = j._bd(k); + o = o._bd(i) + } + return new Array(j, o) + } +} + +function _az(b) { + this._gh = new Array(256); + this._gi = new Array(256); + var a = 1; + for (var e = 0; e < 256; e++) { + this._gh[e] = a; + a <<= 1; + if (a >= 256) { + a ^= b + } + } + for (var e = 0; e < 255; e++) { + this._gi[this._gh[e]] = e + } + var d = new Array(1); + d[0] = 0; + this.zero = new _bp(this, new Array(d)); + var c = new Array(1); + c[0] = 1; + this.one = new _bp(this, new Array(c)); + this.__defineGetter__("Zero", function () { + return this.zero + }); + this.__defineGetter__("One", function () { + return this.one + }); + this._ba = function (j, f) { + if (j < 0) { + throw"bad arguments" + } + if (f == 0) { + return this.zero + } + var h = new Array(j + 1); + for (var g = 0; g < h.length; g++) { + h[g] = 0 + } + h[0] = f; + return new _bp(this, h) + }; + this.exp = function (f) { + return this._gh[f] + }; + this.log = function (f) { + if (f == 0) { + throw"bad arguments" + } + return this._gi[f] + }; + this.inverse = function (f) { + if (f == 0) { + throw"System.ArithmeticException" + } + return this._gh[255 - this._gi[f]] + }; + this.multiply = function (g, f) { + if (g == 0 || f == 0) { + return 0 + } + if (g == 1) { + return f + } + if (f == 1) { + return g + } + return this._gh[(this._gi[g] + this._gi[f]) % 255] + } +} + +_az._bb = new _az(285); +_az._bc = new _az(301); +_az._bd = function (d, c) { + return d ^ c +}; +var Decoder = {}; +Decoder.rsDecoder = new _db(_az._bb); +Decoder.correctErrors = function (g, b) { + var d = g.length; + var f = new Array(d); + for (var e = 0; e < d; e++) { + f[e] = g[e] & 255 + } + var a = g.length - b; + // eslint-disable-next-line no-useless-catch + try { + Decoder.rsDecoder.decode(f, a) + } catch (c) { + throw c + } + for (var e = 0; e < b; e++) { + g[e] = f[e] + } +}; +Decoder.decode = function (q) { + var b = new _cl(q); + var o = b._cq(); + var c = b._cm()._cg; + var p = b._gk(); + var a = _dl._gn(p, o, c); + var f = 0; + for (var k = 0; k < a.length; k++) { + f += a[k]._du + } + var e = new Array(f); + var n = 0; + for (var h = 0; h < a.length; h++) { + var m = a[h]; + var d = m.Codewords; + var g = m._du; + Decoder.correctErrors(d, g); + for (var k = 0; k < g; k++) { + e[n++] = d[k] + } + } + var l = new QRCodeDataBlockReader(e, o._fd, c.Bits); + return l +}; +var qrcode = {}; +qrcode.imagedata = null; +qrcode.width = 0; +qrcode.height = 0; +qrcode.qrCodeSymbol = null; +qrcode.debug = false; +qrcode.maxImgSize = 1024 * 1024; +qrcode._eo = [[10, 9, 8, 8], [12, 11, 16, 10], [14, 13, 16, 12]]; +qrcode.callback = null; +qrcode.vidSuccess = function (a) { + qrcode.localstream = a; + if (qrcode.webkit) { + qrcode.video.src = window.webkitURL.createObjectURL(a) + } else { + if (qrcode.moz) { + qrcode.video.mozSrcObject = a; + qrcode.video.play() + } else { + qrcode.video.src = a + } + } + qrcode.gUM = true; + qrcode.canvas_qr2 = document.createElement("canvas"); + qrcode.canvas_qr2.id = "qr-canvas"; + qrcode.qrcontext2 = qrcode.canvas_qr2.getContext("2d"); + qrcode.canvas_qr2.width = qrcode.video.videoWidth; + qrcode.canvas_qr2.height = qrcode.video.videoHeight; + setTimeout(qrcode.captureToCanvas, 500) +}; +qrcode.vidError = function (a) { + qrcode.gUM = false; + return +}; +qrcode.captureToCanvas = function () { + if (qrcode.gUM) { + try { + if (qrcode.video.videoWidth == 0) { + setTimeout(qrcode.captureToCanvas, 500); + return + } else { + qrcode.canvas_qr2.width = qrcode.video.videoWidth; + qrcode.canvas_qr2.height = qrcode.video.videoHeight + } + qrcode.qrcontext2.drawImage(qrcode.video, 0, 0); + try { + qrcode.decode() + } catch (a) { + console.log(a); + setTimeout(qrcode.captureToCanvas, 500) + } + } catch (a) { + console.log(a); + setTimeout(qrcode.captureToCanvas, 500) + } + } +}; +qrcode.setWebcam = function (c) { + var d = navigator; + qrcode.video = document.getElementById(c); + var a = true; + if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) { + try { + navigator.mediaDevices.enumerateDevices().then(function (e) { + e.forEach(function (f) { + console.log("deb1"); + if (f.kind === "videoinput") { + if (f.label.toLowerCase().search("back") > -1) { + a = [{sourceId: f.deviceId}] + } + } + console.log(f.kind + ": " + f.label + " id = " + f.deviceId) + }) + }) + } catch (b) { + console.log(b) + } + } else { + console.log("no navigator.mediaDevices.enumerateDevices") + } + if (d.getUserMedia) { + d.getUserMedia({video: a, audio: false}, qrcode.vidSuccess, qrcode.vidError) + } else { + if (d.webkitGetUserMedia) { + qrcode.webkit = true; + d.webkitGetUserMedia({video: a, audio: false}, qrcode.vidSuccess, qrcode.vidError) + } else { + if (d.mozGetUserMedia) { + qrcode.moz = true; + d.mozGetUserMedia({video: a, audio: false}, qrcode.vidSuccess, qrcode.vidError) + } + } + } +}; +qrcode.decode = function (d) { + if (arguments.length == 0) { + if (qrcode.canvas_qr2) { + var b = qrcode.canvas_qr2; + var a = qrcode.qrcontext2 + } else { + var b = document.getElementById("qr-canvas"); + var a = b.getContext("2d") + } + qrcode.width = b.width; + qrcode.height = b.height; + qrcode.imagedata = a.getImageData(0, 0, qrcode.width, qrcode.height); + qrcode.result = qrcode.process(a); + if (qrcode.callback != null) { + qrcode.callback(qrcode.result) + } + return qrcode.result + } else { + var c = new Image(); + c.crossOrigin = "Anonymous"; + c.onload = function () { + var g = document.getElementById("out-canvas"); + if (g != null) { + var j = g.getContext("2d"); + j.clearRect(0, 0, 320, 240); + j.drawImage(c, 0, 0, 320, 240) + } + var i = document.createElement("canvas"); + var h = i.getContext("2d"); + var f = c.height; + var l = c.width; + if (c.width * c.height > qrcode.maxImgSize) { + var k = c.width / c.height; + f = Math.sqrt(qrcode.maxImgSize / k); + l = k * f + } + i.width = l; + i.height = f; + h.drawImage(c, 0, 0, i.width, i.height); + qrcode.width = i.width; + qrcode.height = i.height; + try { + qrcode.imagedata = h.getImageData(0, 0, i.width, i.height) + } catch (m) { + qrcode.result = "Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!"; + if (qrcode.callback != null) { + qrcode.callback(qrcode.result) + } + return + } + try { + qrcode.result = qrcode.process(h) + } catch (m) { + console.log(m); + qrcode.result = "error decoding QR Code" + } + if (qrcode.callback != null) { + qrcode.callback(qrcode.result) + } + }; + c.onerror = function () { + if (qrcode.callback != null) { + qrcode.callback("Failed to load the image") + } + }; + c.src = d + } +}; +qrcode.isUrl = function (a) { + var b = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-/]))?/; + return b.test(a) +}; +qrcode.decode_url = function (b) { + var d = ""; + try { + d = escape(b) + } catch (c) { + console.log(c); + d = b + } + var a = ""; + try { + a = decodeURIComponent(d) + } catch (c) { + console.log(c); + a = d + } + return a +}; +qrcode.decode_utf8 = function (a) { + if (qrcode.isUrl(a)) { + return qrcode.decode_url(a) + } else { + return a + } +}; +qrcode.process = function (q) { + var a = new Date().getTime(); + var c = qrcode.grayScaleToBitmap(qrcode.grayscale()); + if (qrcode.debug) { + for (var m = 0; m < qrcode.height; m++) { + for (var n = 0; n < qrcode.width; n++) { + var o = (n * 4) + (m * qrcode.width * 4); + qrcode.imagedata.data[o] = c[n + m * qrcode.width] ? 0 : 0; + qrcode.imagedata.data[o + 1] = c[n + m * qrcode.width] ? 0 : 0; + qrcode.imagedata.data[o + 2] = c[n + m * qrcode.width] ? 255 : 0 + } + } + q.putImageData(qrcode.imagedata, 0, 0) + } + var h = new Detector(c); + var p = h.detect(); + if (qrcode.debug) { + for (var m = 0; m < p.bits.Height; m++) { + for (var n = 0; n < p.bits.Width; n++) { + var o = (n * 4 * 2) + (m * 2 * qrcode.width * 4); + qrcode.imagedata.data[o] = p.bits._ds(n, m) ? 0 : 0; + qrcode.imagedata.data[o + 1] = p.bits._ds(n, m) ? 0 : 0; + qrcode.imagedata.data[o + 2] = p.bits._ds(n, m) ? 255 : 0 + } + } + q.putImageData(qrcode.imagedata, 0, 0) + } + var k = Decoder.decode(p.bits); + var g = k.DataByte; + var l = ""; + for (var f = 0; f < g.length; f++) { + for (var e = 0; e < g[f].length; e++) { + l += String.fromCharCode(g[f][e]) + } + } + var d = new Date().getTime(); + var b = d - a; + console.log(b); + return qrcode.decode_utf8(l) +}; +qrcode.getPixel = function (b, d) { + if (qrcode.width < b) { + throw"point error" + } + if (qrcode.height < d) { + throw"point error" + } + var a = (b * 4) + (d * qrcode.width * 4); + var c = (qrcode.imagedata.data[a] * 33 + qrcode.imagedata.data[a + 1] * 34 + qrcode.imagedata.data[a + 2] * 33) / 100; + return c +}; +qrcode.binarize = function (d) { + var c = new Array(qrcode.width * qrcode.height); + for (var e = 0; e < qrcode.height; e++) { + for (var b = 0; b < qrcode.width; b++) { + var a = qrcode.getPixel(b, e); + c[b + e * qrcode.width] = a <= d ? true : false + } + } + return c +}; +qrcode._em = function (d) { + var c = 4; + var k = Math.floor(qrcode.width / c); + var j = Math.floor(qrcode.height / c); + var f = new Array(c); + for (var g = 0; g < c; g++) { + f[g] = new Array(c); + for (var e = 0; e < c; e++) { + f[g][e] = new Array(0, 0) + } + } + for (var o = 0; o < c; o++) { + for (var a = 0; a < c; a++) { + f[a][o][0] = 255; + for (var l = 0; l < j; l++) { + for (var n = 0; n < k; n++) { + var h = d[k * a + n + (j * o + l) * qrcode.width]; + if (h < f[a][o][0]) { + f[a][o][0] = h + } + if (h > f[a][o][1]) { + f[a][o][1] = h + } + } + } + } + } + var m = new Array(c); + for (var b = 0; b < c; b++) { + m[b] = new Array(c) + } + for (var o = 0; o < c; o++) { + for (var a = 0; a < c; a++) { + m[a][o] = Math.floor((f[a][o][0] + f[a][o][1]) / 2) + } + } + return m +}; +qrcode.grayScaleToBitmap = function (f) { + var k = qrcode._em(f); + var b = k.length; + var e = Math.floor(qrcode.width / b); + var d = Math.floor(qrcode.height / b); + var h = new ArrayBuffer(qrcode.width * qrcode.height); + var c = new Uint8Array(h); + for (var j = 0; j < b; j++) { + for (var a = 0; a < b; a++) { + for (var g = 0; g < d; g++) { + for (var i = 0; i < e; i++) { + c[e * a + i + (d * j + g) * qrcode.width] = (f[e * a + i + (d * j + g) * qrcode.width] < k[a][j]) ? true : false + } + } + } + } + return c +}; +qrcode.grayscale = function () { + var e = new ArrayBuffer(qrcode.width * qrcode.height); + var c = new Uint8Array(e); + for (var d = 0; d < qrcode.height; d++) { + for (var b = 0; b < qrcode.width; b++) { + var a = qrcode.getPixel(b, d); + c[b + d * qrcode.width] = a + } + } + return c +}; + +function _ew(a, b) { + if (a >= 0) { + return a >> b + } else { + return (a >> b) + (2 << ~b) + } +} + +var _gf = 3; +var _eh = 57; +var _el = 8; +var _eg = 2; +qrcode._er = function (c) { + function b(m, k) { + var n = m.X - k.X; + var l = m.Y - k.Y; + return Math.sqrt((n * n + l * l)) + } + + function d(k, o, n) { + var m = o.x; + var l = o.y; + return ((n.x - m) * (k.y - l)) - ((n.y - l) * (k.x - m)) + } + + var i = b(c[0], c[1]); + var f = b(c[1], c[2]); + var e = b(c[0], c[2]); + var a, j, h; + if (f >= i && f >= e) { + j = c[0]; + a = c[1]; + h = c[2] + } else { + if (e >= f && e >= i) { + j = c[1]; + a = c[0]; + h = c[2] + } else { + j = c[2]; + a = c[0]; + h = c[1] + } + } + if (d(a, j, h) < 0) { + var g = a; + a = h; + h = g + } + c[0] = a; + c[1] = j; + c[2] = h +}; + +function _cz(c, a, b) { + this.x = c; + this.y = a; + this.count = 1; + this._aj = b; + this.__defineGetter__("_ei", function () { + return this._aj + }); + this.__defineGetter__("Count", function () { + return this.count + }); + this.__defineGetter__("X", function () { + return this.x + }); + this.__defineGetter__("Y", function () { + return this.y + }); + this._ek = function () { + this.count++ + }; + this._ev = function (f, e, d) { + if (Math.abs(e - this.y) <= f && Math.abs(d - this.x) <= f) { + var g = Math.abs(f - this._aj); + return g <= 1 || g / this._aj <= 1 + } + return false + } +} + +function _es(a) { + this._go = a[0]; + this._gu = a[1]; + this._gr = a[2]; + this.__defineGetter__("_gp", function () { + return this._go + }); + this.__defineGetter__("_gq", function () { + return this._gu + }); + this.__defineGetter__("_gs", function () { + return this._gr + }) +} + +function _cc() { + this.image = null; + this._cv = []; + this._ge = false; + this._al = new Array(0, 0, 0, 0, 0); + this._am = null; + this.__defineGetter__("_da", function () { + this._al[0] = 0; + this._al[1] = 0; + this._al[2] = 0; + this._al[3] = 0; + this._al[4] = 0; + return this._al + }); + this._ao = function (f) { + var b = 0; + for (var d = 0; d < 5; d++) { + var e = f[d]; + if (e == 0) { + return false + } + b += e + } + if (b < 7) { + return false + } + var c = Math.floor((b << _el) / 7); + var a = Math.floor(c / 2); + return Math.abs(c - (f[0] << _el)) < a && Math.abs(c - (f[1] << _el)) < a && Math.abs(3 * c - (f[2] << _el)) < 3 * a && Math.abs(c - (f[3] << _el)) < a && Math.abs(c - (f[4] << _el)) < a + }; + this._an = function (b, a) { + return (a - b[4] - b[3]) - b[2] / 2 + }; + this._ap = function (a, j, d, g) { + var c = this.image; + var h = qrcode.height; + var b = this._da; + var f = a; + while (f >= 0 && c[j + f * qrcode.width]) { + b[2]++; + f-- + } + if (f < 0) { + return NaN + } + while (f >= 0 && !c[j + f * qrcode.width] && b[1] <= d) { + b[1]++; + f-- + } + if (f < 0 || b[1] > d) { + return NaN + } + while (f >= 0 && c[j + f * qrcode.width] && b[0] <= d) { + b[0]++; + f-- + } + if (b[0] > d) { + return NaN + } + f = a + 1; + while (f < h && c[j + f * qrcode.width]) { + b[2]++; + f++ + } + if (f == h) { + return NaN + } + while (f < h && !c[j + f * qrcode.width] && b[3] < d) { + b[3]++; + f++ + } + if (f == h || b[3] >= d) { + return NaN + } + while (f < h && c[j + f * qrcode.width] && b[4] < d) { + b[4]++; + f++ + } + if (b[4] >= d) { + return NaN + } + var e = b[0] + b[1] + b[2] + b[3] + b[4]; + if (5 * Math.abs(e - g) >= 2 * g) { + return NaN + } + return this._ao(b) ? this._an(b, f) : NaN + }; + this._ej = function (b, a, e, h) { + var d = this.image; + var i = qrcode.width; + var c = this._da; + var g = b; + while (g >= 0 && d[g + a * qrcode.width]) { + c[2]++; + g-- + } + if (g < 0) { + return NaN + } + while (g >= 0 && !d[g + a * qrcode.width] && c[1] <= e) { + c[1]++; + g-- + } + if (g < 0 || c[1] > e) { + return NaN + } + while (g >= 0 && d[g + a * qrcode.width] && c[0] <= e) { + c[0]++; + g-- + } + if (c[0] > e) { + return NaN + } + g = b + 1; + while (g < i && d[g + a * qrcode.width]) { + c[2]++; + g++ + } + if (g == i) { + return NaN + } + while (g < i && !d[g + a * qrcode.width] && c[3] < e) { + c[3]++; + g++ + } + if (g == i || c[3] >= e) { + return NaN + } + while (g < i && d[g + a * qrcode.width] && c[4] < e) { + c[4]++; + g++ + } + if (c[4] >= e) { + return NaN + } + var f = c[0] + c[1] + c[2] + c[3] + c[4]; + if (5 * Math.abs(f - h) >= h) { + return NaN + } + return this._ao(c) ? this._an(c, g) : NaN + }; + this._cu = function (c, f, e) { + var d = c[0] + c[1] + c[2] + c[3] + c[4]; + var n = this._an(c, e); + var b = this._ap(f, Math.floor(n), c[2], d); + if (!isNaN(b)) { + n = this._ej(Math.floor(n), Math.floor(b), c[2], d); + if (!isNaN(n)) { + var l = d / 7; + var m = false; + var h = this._cv.length; + for (var g = 0; g < h; g++) { + var a = this._cv[g]; + if (a._ev(l, b, n)) { + a._ek(); + m = true; + break + } + } + if (!m) { + var k = new _cz(n, b, l); + this._cv.push(k); + if (this._am != null) { + this._am._ep(k) + } + } + return true + } + } + return false + }; + this._ee = function () { + var h = this._cv.length; + if (h < 3) { + throw"Couldn't find enough finder patterns (found " + h + ")" + } + if (h > 3) { + var b = 0; + var j = 0; + for (var d = 0; d < h; d++) { + var g = this._cv[d]._ei; + b += g; + j += (g * g) + } + var a = b / h; + this._cv.sort(function (m, l) { + var k = Math.abs(l._ei - a); + var i = Math.abs(m._ei - a); + if (k < i) { + return (-1) + } else { + if (k == i) { + return 0 + } else { + return 1 + } + } + }); + var e = Math.sqrt(j / h - a * a); + var c = Math.max(0.2 * a, e); + for (var d = this._cv.length - 1; d >= 0; d--) { + var f = this._cv[d]; + if (Math.abs(f._ei - a) > c) { + this._cv.splice(d, 1) + } + } + } + if (this._cv.length > 3) { + this._cv.sort(function (k, i) { + if (k.count > i.count) { + return -1 + } + if (k.count < i.count) { + return 1 + } + return 0 + }) + } + return new Array(this._cv[0], this._cv[1], this._cv[2]) + }; + this._eq = function () { + var b = this._cv.length; + if (b <= 1) { + return 0 + } + var c = null; + for (var d = 0; d < b; d++) { + var a = this._cv[d]; + if (a.Count >= _eg) { + if (c == null) { + c = a + } else { + this._ge = true; + return Math.floor((Math.abs(c.X - a.X) - Math.abs(c.Y - a.Y)) / 2) + } + } + } + return 0 + }; + this._cx = function () { + var g = 0; + var c = 0; + var a = this._cv.length; + for (var d = 0; d < a; d++) { + var f = this._cv[d]; + if (f.Count >= _eg) { + g++; + c += f._ei + } + } + if (g < 3) { + return false + } + var e = c / a; + var b = 0; + for (var d = 0; d < a; d++) { + f = this._cv[d]; + b += Math.abs(f._ei - e) + } + return b <= 0.05 * c + }; + this._ce = function (e) { + var o = false; + this.image = e; + var n = qrcode.height; + var k = qrcode.width; + var a = Math.floor((3 * n) / (4 * _eh)); + if (a < _gf || o) { + a = _gf + } + var g = false; + var d = new Array(5); + for (var h = a - 1; h < n && !g; h += a) { + d[0] = 0; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0; + var b = 0; + for (var f = 0; f < k; f++) { + if (e[f + h * qrcode.width]) { + if ((b & 1) == 1) { + b++ + } + d[b]++ + } else { + if ((b & 1) == 0) { + if (b == 4) { + if (this._ao(d)) { + var c = this._cu(d, h, f); + if (c) { + a = 2; + if (this._ge) { + g = this._cx() + } else { + var m = this._eq(); + if (m > d[2]) { + h += m - d[2] - a; + f = k - 1 + } + } + } else { + do { + f++ + } while (f < k && !e[f + h * qrcode.width]); + f-- + } + b = 0; + d[0] = 0; + d[1] = 0; + d[2] = 0; + d[3] = 0; + d[4] = 0 + } else { + d[0] = d[2]; + d[1] = d[3]; + d[2] = d[4]; + d[3] = 1; + d[4] = 0; + b = 3 + } + } else { + d[++b]++ + } + } else { + d[b]++ + } + } + } + if (this._ao(d)) { + var c = this._cu(d, h, k); + if (c) { + a = d[0]; + if (this._ge) { + g = this._cx() + } + } + } + } + var l = this._ee(); + qrcode._er(l); + return new _es(l) + } +} + +function _ai(c, a, b) { + this.x = c; + this.y = a; + this.count = 1; + this._aj = b; + this.__defineGetter__("_ei", function () { + return this._aj + }); + this.__defineGetter__("Count", function () { + return this.count + }); + this.__defineGetter__("X", function () { + return Math.floor(this.x) + }); + this.__defineGetter__("Y", function () { + return Math.floor(this.y) + }); + this._ek = function () { + this.count++ + }; + this._ev = function (f, e, d) { + if (Math.abs(e - this.y) <= f && Math.abs(d - this.x) <= f) { + var g = Math.abs(f - this._aj); + return g <= 1 || g / this._aj <= 1 + } + return false + } +} + +function _ak(g, c, b, f, a, e, d) { + this.image = g; + this._cv = new Array(); + this.startX = c; + this.startY = b; + this.width = f; + this.height = a; + this._ef = e; + this._al = new Array(0, 0, 0); + this._am = d; + this._an = function (i, h) { + return (h - i[2]) - i[1] / 2 + }; + this._ao = function (l) { + var k = this._ef; + var h = k / 2; + for (var j = 0; j < 3; j++) { + if (Math.abs(k - l[j]) >= h) { + return false + } + } + return true + }; + this._ap = function (h, q, l, o) { + var k = this.image; + var p = qrcode.height; + var j = this._al; + j[0] = 0; + j[1] = 0; + j[2] = 0; + var n = h; + while (n >= 0 && k[q + n * qrcode.width] && j[1] <= l) { + j[1]++; + n-- + } + if (n < 0 || j[1] > l) { + return NaN + } + while (n >= 0 && !k[q + n * qrcode.width] && j[0] <= l) { + j[0]++; + n-- + } + if (j[0] > l) { + return NaN + } + n = h + 1; + while (n < p && k[q + n * qrcode.width] && j[1] <= l) { + j[1]++; + n++ + } + if (n == p || j[1] > l) { + return NaN + } + while (n < p && !k[q + n * qrcode.width] && j[2] <= l) { + j[2]++; + n++ + } + if (j[2] > l) { + return NaN + } + var m = j[0] + j[1] + j[2]; + if (5 * Math.abs(m - o) >= 2 * o) { + return NaN + } + return this._ao(j) ? this._an(j, n) : NaN + }; + this._cu = function (l, o, n) { + var m = l[0] + l[1] + l[2]; + var t = this._an(l, n); + var k = this._ap(o, Math.floor(t), 2 * l[1], m); + if (!isNaN(k)) { + var s = (l[0] + l[1] + l[2]) / 3; + var q = this._cv.length; + for (var p = 0; p < q; p++) { + var h = this._cv[p]; + if (h._ev(s, k, t)) { + return new _ai(t, k, s) + } + } + var r = new _ai(t, k, s); + this._cv.push(r); + if (this._am != null) { + this._am._ep(r) + } + } + return null + }; + this.find = function () { + var p = this.startX; + var s = this.height; + var q = p + f; + var r = b + (s >> 1); + var m = new Array(0, 0, 0); + for (var k = 0; k < s; k++) { + var o = r + ((k & 1) == 0 ? ((k + 1) >> 1) : -((k + 1) >> 1)); + m[0] = 0; + m[1] = 0; + m[2] = 0; + var n = p; + while (n < q && !g[n + qrcode.width * o]) { + n++ + } + var h = 0; + while (n < q) { + if (g[n + o * qrcode.width]) { + if (h == 1) { + m[h]++ + } else { + if (h == 2) { + if (this._ao(m)) { + var l = this._cu(m, o, n); + if (l != null) { + return l + } + } + m[0] = m[2]; + m[1] = 1; + m[2] = 0; + h = 1 + } else { + m[++h]++ + } + } + } else { + if (h == 1) { + h++ + } + m[h]++ + } + n++ + } + if (this._ao(m)) { + var l = this._cu(m, o, q); + if (l != null) { + return l + } + } + } + if (!(this._cv.length == 0)) { + return this._cv[0] + } + throw"Couldn't find enough alignment patterns" + } +} + +function QRCodeDataBlockReader(c, a, b) { + this._ed = 0; + this._cw = 7; + this.dataLength = 0; + this.blocks = c; + this._en = b; + if (a <= 9) { + this.dataLengthMode = 0 + } else { + if (a >= 10 && a <= 26) { + this.dataLengthMode = 1 + } else { + if (a >= 27 && a <= 40) { + this.dataLengthMode = 2 + } + } + } + this._gd = function (f) { + var k = 0; + if (f < this._cw + 1) { + var m = 0; + for (var e = 0; e < f; e++) { + m += (1 << e) + } + m <<= (this._cw - f + 1); + k = (this.blocks[this._ed] & m) >> (this._cw - f + 1); + this._cw -= f; + return k + } else { + if (f < this._cw + 1 + 8) { + var j = 0; + for (var e = 0; e < this._cw + 1; e++) { + j += (1 << e) + } + k = (this.blocks[this._ed] & j) << (f - (this._cw + 1)); + this._ed++; + k += ((this.blocks[this._ed]) >> (8 - (f - (this._cw + 1)))); + this._cw = this._cw - f % 8; + if (this._cw < 0) { + this._cw = 8 + this._cw + } + return k + } else { + if (f < this._cw + 1 + 16) { + var j = 0; + var h = 0; + for (var e = 0; e < this._cw + 1; e++) { + j += (1 << e) + } + var g = (this.blocks[this._ed] & j) << (f - (this._cw + 1)); + this._ed++; + var d = this.blocks[this._ed] << (f - (this._cw + 1 + 8)); + this._ed++; + for (var e = 0; e < f - (this._cw + 1 + 8); e++) { + h += (1 << e) + } + h <<= 8 - (f - (this._cw + 1 + 8)); + var l = (this.blocks[this._ed] & h) >> (8 - (f - (this._cw + 1 + 8))); + k = g + d + l; + this._cw = this._cw - (f - 8) % 8; + if (this._cw < 0) { + this._cw = 8 + this._cw + } + return k + } else { + return 0 + } + } + } + }; + this.NextMode = function () { + if ((this._ed > this.blocks.length - this._en - 2)) { + return 0 + } else { + return this._gd(4) + } + }; + this.getDataLength = function (d) { + var e = 0; + // eslint-disable-next-line no-constant-condition + while (true) { + if ((d >> e) == 1) { + break + } + e++ + } + return this._gd(qrcode._eo[this.dataLengthMode][e]) + }; + this.getRomanAndFigureString = function (h) { + var f = h; + var g = 0; + var j = ""; + var d = new Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", " ", "$", "%", "*", "+", "-", ".", "/", ":"); + do { + if (f > 1) { + g = this._gd(11); + var i = Math.floor(g / 45); + var e = g % 45; + j += d[i]; + j += d[e]; + f -= 2 + } else { + if (f == 1) { + g = this._gd(6); + j += d[g]; + f -= 1 + } + } + } while (f > 0); + return j + }; + this.getFigureString = function (f) { + var d = f; + var e = 0; + var g = ""; + do { + if (d >= 3) { + e = this._gd(10); + if (e < 100) { + g += "0" + } + if (e < 10) { + g += "0" + } + d -= 3 + } else { + if (d == 2) { + e = this._gd(7); + if (e < 10) { + g += "0" + } + d -= 2 + } else { + if (d == 1) { + e = this._gd(4); + d -= 1 + } + } + } + g += e + } while (d > 0); + return g + }; + this.get8bitByteArray = function (g) { + var e = g; + var f = 0; + var d = new Array(); + do { + f = this._gd(8); + d.push(f); + e-- + } while (e > 0); + return d + }; + this.getKanjiString = function (j) { + var g = j; + var i = 0; + var h = ""; + do { + i = this._gd(13); + var e = i % 192; + var f = i / 192; + var k = (f << 8) + e; + var d = 0; + if (k + 33088 <= 40956) { + d = k + 33088 + } else { + d = k + 49472 + } + h += String.fromCharCode(d); + g-- + } while (g > 0); + return h + }; + this.parseECIValue = function () { + var f = 0; + var e = this._gd(8); + if ((e & 128) == 0) { + f = e & 127 + } + if ((e & 192) == 128) { + var d = this._gd(8); + f = ((e & 63) << 8) | d + } + if ((e & 224) == 192) { + var g = this._gd(8); + f = ((e & 31) << 16) | g + } + return f + }; + this.__defineGetter__("DataByte", function () { + var h = new Array(); + var e = 1; + var f = 2; + var d = 4; + var n = 7; + var p = 8; + do { + var l = this.NextMode(); + if (l == 0) { + if (h.length > 0) { + break + } else { + throw"Empty data block" + } + } + if (l != e && l != f && l != d && l != p && l != n) { + throw"Invalid mode: " + l + " in (block:" + this._ed + " bit:" + this._cw + ")" + } + if (l == n) { + var o = this.parseECIValue() + } else { + var g = this.getDataLength(l); + if (g < 1) { + throw"Invalid data length: " + g + } + switch (l) { + case e: + var m = this.getFigureString(g); + var k = new Array(m.length); + for (var i = 0; i < m.length; i++) { + k[i] = m.charCodeAt(i) + } + h.push(k); + break; + case f: + var m = this.getRomanAndFigureString(g); + var k = new Array(m.length); + for (var i = 0; i < m.length; i++) { + k[i] = m.charCodeAt(i) + } + h.push(k); + break; + case d: + var o = this.get8bitByteArray(g); + h.push(o); + break; + case p: + var m = this.getKanjiString(g); + h.push(m); + break + } + } + // eslint-disable-next-line no-constant-condition + } while (true); + return h + }) +} + + +export default qrcode; diff --git a/src/assets/styles/color.scss b/src/assets/styles/color.scss new file mode 100644 index 0000000..7f7b045 --- /dev/null +++ b/src/assets/styles/color.scss @@ -0,0 +1,16 @@ +$titleColor: rgb(24, 24, 24); // 标题颜色 +$textColor: rgb(51, 51, 51); // 大多文本颜色 +$themeColor: #f68804; // 主题红色 +$greyColor: rgb(153, 153, 153); // 灰色 +$greyDeepColor: rgb(102, 102, 102); // 深灰色 +$greyLightColor: rgb(242, 242, 242); // 浅灰色 +$orangeColor: rgb(255, 169, 0); // 橙色 +$textColors: rgb(107, 109, 149); // 大部分文本颜色新 +$themeColors: #e1351f; // 主题粉色新 +$btnPrimaryColor: #fff; //主题按钮字体颜色 +$themeBgLgColor: linear-gradient(90deg, #84a4f9 0%, #2b5dde 94.27%); //主题渐变色 +$borderSplitColor: rgba(255, 255, 255, 0.1); //分割线颜色 +$borderSplit: 0.5px solid $borderSplitColor; //分割线 +$themeBgColor: rgba(3, 15, 24, 1); // 主题背景色 + +$popupBg: #0F0F0F; diff --git a/src/assets/styles/common.scss b/src/assets/styles/common.scss new file mode 100644 index 0000000..f3f0516 --- /dev/null +++ b/src/assets/styles/common.scss @@ -0,0 +1,111 @@ +.flex { + display: flex; +} +.flex-vcenter { + display: flex; + align-items: center; +} +.flex-center-center { + display: flex; + justify-content: center; + align-items: center; +} +.flex-center-between { + display: flex; + justify-content: space-between; + align-items: center; +} +/* 超出隐藏 */ +.ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.ellipsis1 { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; +} +.ellipsis2 { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.ellipsis3 { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; +} +.overflow-y-auto { + overflow-y: auto; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; +} + +.overflow-x-auto { + overflow-y: hidden; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +// 公共确认按钮 +.cm-btn { + height: 48px; + background-color: rgb(255, 13, 44); + border-radius: 6px; + text-align: center; + line-height: 48px; + color: white; + font-size: 16px; + position: fixed; + left: 50%; + bottom: 30px; + transform: translate(-50%, 0); + width: 347px; +} +.split-top { + border-top: 1px solid rgba(255, 255, 255, 0.1); +} +.split-bottom { + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} + +.layoutDisplay-optArea { + width: 100%; + margin-top: 10px; + padding: 0 14px; + .optBox { + width: 141.5px; + height: 34px; + border-radius: 18.5px; + background: rgba(255, 255, 255, 0.1); + .optIcon { + width: 16px; + height: 16px; + margin-right: 4px; + } + .optName { + color: rgba(255, 255, 255, 0.9); + text-align: center; + /* Regular */ + font-family: 'PingFang SC'; + font-size: 14px; + } + @keyframes rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + } + .refresh-icon { + animation: rotate 0.5s linear infinite; + } + } +} \ No newline at end of file diff --git a/src/assets/styles/height.scss b/src/assets/styles/height.scss new file mode 100644 index 0000000..a1427f6 --- /dev/null +++ b/src/assets/styles/height.scss @@ -0,0 +1,3 @@ +$TabPaddingBottom: 32px; //tab 底部padding +$tabHeight: 55px ; //tab高度 +$contentHeight:calc(100% - $tabHeight); //默认内容高度 \ No newline at end of file diff --git a/src/assets/styles/main.scss b/src/assets/styles/main.scss new file mode 100644 index 0000000..a24a284 --- /dev/null +++ b/src/assets/styles/main.scss @@ -0,0 +1,10 @@ +//公用样式 +@import "common"; + +@import 'height'; + +@import 'color'; + +@import "padding"; + +@import "mixins"; diff --git a/src/assets/styles/mixins.scss b/src/assets/styles/mixins.scss new file mode 100644 index 0000000..b043c6d --- /dev/null +++ b/src/assets/styles/mixins.scss @@ -0,0 +1,143 @@ +// 单行省略号 +@mixin textEllipsis{ + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +// 多行省略号 +@mixin lineClamp($num){ + word-break: break-all; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: $num; + -webkit-box-orient: vertical; +} + +// 边距安全距离 +@mixin SafeArea($distance,$direction,$num){ + $allowedDistances: margin, padding; + $allowedDirections: top, bottom, left, right; + + @if not index($allowedDistances, $distance) { + @error "distance 只支持 margin, padding"; + } + + @if not index($allowedDirections, $direction) { + @error "direction 只支持 top, bottom, left, right"; + } + + #{$distance}-#{$direction}:$num; + #{$distance}-#{$direction}: calc($num + constant(safe-area-inset-#{$direction})); + #{$distance}-#{$direction}: calc($num + env(safe-area-inset-#{$direction})); +} + +// 边距安全距离 +@mixin SafeAreaFixed($direction,$num){ + $allowedDirections: top, bottom, left, right; + + @if not index($allowedDirections, $direction) { + @error "direction 只支持 top, bottom, left, right"; + } + + #{$direction}:$num; + #{$direction}: calc($num + constant(safe-area-inset-#{$direction})); + #{$direction}: calc($num + env(safe-area-inset-#{$direction})); +} + +// 聊天页根容器:顶栏/输入栏高度 + iOS 底部安全区变量 +@mixin chat-layout-root($header-height: 44px, $input-height: 80px) { + --chat-header-height: #{$header-height}; + --chat-input-height: #{$input-height}; + --chat-safe-bottom: 0px; + --chat-safe-bottom: constant(safe-area-inset-bottom); + --chat-safe-bottom: env(safe-area-inset-bottom); + width: 100%; + height: 100vh; + height: 100dvh; +} + +// 聊天消息滚动区(fixed,避开顶栏与底栏) +@mixin chat-layout-content { + position: fixed; + top: var(--chat-header-height); + left: 0; + z-index: 5; + width: 100%; + // 输入栏总高度已含安全区(border-box),此处不再叠加 safe-bottom + bottom: var(--chat-input-height); + box-sizing: border-box; +} + +// 聊天底部输入栏:固定总高度,安全区落在栏内 padding +@mixin chat-layout-input-bar { + position: fixed; + bottom: 0; + left: 0; + z-index: 8; + width: 100%; + height: var(--chat-input-height); + padding-bottom: var(--chat-safe-bottom); + box-sizing: border-box; +} + +// 悬浮在输入栏上方的元素(如广告浮层) +@mixin chat-layout-above-input($extra-offset: 0px) { + bottom: calc(var(--chat-input-height, 80px) + #{$extra-offset}); +} + + +@mixin popup{ + border-radius: 20px 20px 0px 0px; + background: #f5f5f5; + width: 100%; + height: 100%; + @include SafeArea('padding', 'bottom', 0); + position: relative; + overflow: hidden; + + + padding-top: 32px; + &::before { + content: ''; + width: 36px; + height: 5px; + flex-shrink: 0; + border-radius: 100px; + background: #333; + position: absolute; + top: 12px; + left: 50%; + transform: translateX(-50%); + } + +} + +@mixin popupTab($width){ + :deep(.van-tabs) { + --van-tabs-nav-background: transform; + --van-tab-text-color: #999; + --van-tabs-bottom-bar-height: 1px; + --van-tabs-bottom-bar-color: #333; + + .van-tabs__wrap { + border-bottom: 1px solid #999; + } + + .van-tabs__line { + width: $width; + &:before { + position: absolute; + bottom: 0; + left: calc(50% - 2px); + content: ''; + // width: 10px; + // height: 10px + + border-style: solid; + border-color: transparent transparent #333 transparent; + border-width: 4px; + } + } + } +} \ No newline at end of file diff --git a/src/assets/styles/padding.scss b/src/assets/styles/padding.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/theme/default/aiIcon.png b/src/assets/theme/default/aiIcon.png new file mode 100644 index 0000000..b0084b7 Binary files /dev/null and b/src/assets/theme/default/aiIcon.png differ diff --git a/src/assets/theme/default/aiIconActived.png b/src/assets/theme/default/aiIconActived.png new file mode 100644 index 0000000..ac98501 Binary files /dev/null and b/src/assets/theme/default/aiIconActived.png differ diff --git a/src/assets/theme/default/communityIcon.png b/src/assets/theme/default/communityIcon.png new file mode 100644 index 0000000..f0211ac Binary files /dev/null and b/src/assets/theme/default/communityIcon.png differ diff --git a/src/assets/theme/default/communityIconActived.png b/src/assets/theme/default/communityIconActived.png new file mode 100644 index 0000000..61858ba Binary files /dev/null and b/src/assets/theme/default/communityIconActived.png differ diff --git a/src/assets/theme/default/darkNetActiveIcon.png b/src/assets/theme/default/darkNetActiveIcon.png new file mode 100644 index 0000000..f68865b Binary files /dev/null and b/src/assets/theme/default/darkNetActiveIcon.png differ diff --git a/src/assets/theme/default/darkNetIcon.png b/src/assets/theme/default/darkNetIcon.png new file mode 100644 index 0000000..c645665 Binary files /dev/null and b/src/assets/theme/default/darkNetIcon.png differ diff --git a/src/assets/theme/default/homeIcon.png b/src/assets/theme/default/homeIcon.png new file mode 100644 index 0000000..a8ebc27 Binary files /dev/null and b/src/assets/theme/default/homeIcon.png differ diff --git a/src/assets/theme/default/homeIconActived.png b/src/assets/theme/default/homeIconActived.png new file mode 100644 index 0000000..c4c1202 Binary files /dev/null and b/src/assets/theme/default/homeIconActived.png differ diff --git a/src/assets/theme/default/homeIconScrollTop.png b/src/assets/theme/default/homeIconScrollTop.png new file mode 100644 index 0000000..6006d04 Binary files /dev/null and b/src/assets/theme/default/homeIconScrollTop.png differ diff --git a/src/assets/theme/default/liveIcon.png b/src/assets/theme/default/liveIcon.png new file mode 100644 index 0000000..61f885e Binary files /dev/null and b/src/assets/theme/default/liveIcon.png differ diff --git a/src/assets/theme/default/liveIconActived.png b/src/assets/theme/default/liveIconActived.png new file mode 100644 index 0000000..949d6d6 Binary files /dev/null and b/src/assets/theme/default/liveIconActived.png differ diff --git a/src/assets/theme/default/mineIcon.png b/src/assets/theme/default/mineIcon.png new file mode 100644 index 0000000..57d5980 Binary files /dev/null and b/src/assets/theme/default/mineIcon.png differ diff --git a/src/assets/theme/default/mineIconActived.png b/src/assets/theme/default/mineIconActived.png new file mode 100644 index 0000000..4f9cff1 Binary files /dev/null and b/src/assets/theme/default/mineIconActived.png differ diff --git a/src/assets/theme/default/mine_bg.png b/src/assets/theme/default/mine_bg.png new file mode 100644 index 0000000..a528167 Binary files /dev/null and b/src/assets/theme/default/mine_bg.png differ diff --git a/src/assets/theme/default/sign_icon.png b/src/assets/theme/default/sign_icon.png new file mode 100644 index 0000000..1051037 Binary files /dev/null and b/src/assets/theme/default/sign_icon.png differ diff --git a/src/assets/theme/duanwu/_bg.png b/src/assets/theme/duanwu/_bg.png new file mode 100644 index 0000000..4f0f135 Binary files /dev/null and b/src/assets/theme/duanwu/_bg.png differ diff --git a/src/assets/theme/duanwu/_search.png b/src/assets/theme/duanwu/_search.png new file mode 100644 index 0000000..348c612 Binary files /dev/null and b/src/assets/theme/duanwu/_search.png differ diff --git a/src/assets/theme/duanwu/aiIcon.png b/src/assets/theme/duanwu/aiIcon.png new file mode 100644 index 0000000..b0084b7 Binary files /dev/null and b/src/assets/theme/duanwu/aiIcon.png differ diff --git a/src/assets/theme/duanwu/aiIconActived.png b/src/assets/theme/duanwu/aiIconActived.png new file mode 100644 index 0000000..ac98501 Binary files /dev/null and b/src/assets/theme/duanwu/aiIconActived.png differ diff --git a/src/assets/theme/duanwu/communityIcon.png b/src/assets/theme/duanwu/communityIcon.png new file mode 100644 index 0000000..e76d751 Binary files /dev/null and b/src/assets/theme/duanwu/communityIcon.png differ diff --git a/src/assets/theme/duanwu/communityIconActived.png b/src/assets/theme/duanwu/communityIconActived.png new file mode 100644 index 0000000..aa4c99d Binary files /dev/null and b/src/assets/theme/duanwu/communityIconActived.png differ diff --git a/src/assets/theme/duanwu/darkNetActiveIcon.png b/src/assets/theme/duanwu/darkNetActiveIcon.png new file mode 100644 index 0000000..4da1569 Binary files /dev/null and b/src/assets/theme/duanwu/darkNetActiveIcon.png differ diff --git a/src/assets/theme/duanwu/darkNetIcon.png b/src/assets/theme/duanwu/darkNetIcon.png new file mode 100644 index 0000000..2e41c0f Binary files /dev/null and b/src/assets/theme/duanwu/darkNetIcon.png differ diff --git a/src/assets/theme/duanwu/homeIcon.png b/src/assets/theme/duanwu/homeIcon.png new file mode 100644 index 0000000..7e4d137 Binary files /dev/null and b/src/assets/theme/duanwu/homeIcon.png differ diff --git a/src/assets/theme/duanwu/homeIconActived.png b/src/assets/theme/duanwu/homeIconActived.png new file mode 100644 index 0000000..4439b8d Binary files /dev/null and b/src/assets/theme/duanwu/homeIconActived.png differ diff --git a/src/assets/theme/duanwu/homeIconScrollTop.png b/src/assets/theme/duanwu/homeIconScrollTop.png new file mode 100644 index 0000000..7ed8765 Binary files /dev/null and b/src/assets/theme/duanwu/homeIconScrollTop.png differ diff --git a/src/assets/theme/duanwu/liveIcon.png b/src/assets/theme/duanwu/liveIcon.png new file mode 100644 index 0000000..5929b02 Binary files /dev/null and b/src/assets/theme/duanwu/liveIcon.png differ diff --git a/src/assets/theme/duanwu/liveIconActived.png b/src/assets/theme/duanwu/liveIconActived.png new file mode 100644 index 0000000..57db36c Binary files /dev/null and b/src/assets/theme/duanwu/liveIconActived.png differ diff --git a/src/assets/theme/duanwu/mineIcon.png b/src/assets/theme/duanwu/mineIcon.png new file mode 100644 index 0000000..274c258 Binary files /dev/null and b/src/assets/theme/duanwu/mineIcon.png differ diff --git a/src/assets/theme/duanwu/mineIconActived.png b/src/assets/theme/duanwu/mineIconActived.png new file mode 100644 index 0000000..b141be9 Binary files /dev/null and b/src/assets/theme/duanwu/mineIconActived.png differ diff --git a/src/assets/theme/duanwu/sign_icon.png b/src/assets/theme/duanwu/sign_icon.png new file mode 100644 index 0000000..1051037 Binary files /dev/null and b/src/assets/theme/duanwu/sign_icon.png differ diff --git a/src/assets/theme/index.scss b/src/assets/theme/index.scss new file mode 100644 index 0000000..a1ffb78 --- /dev/null +++ b/src/assets/theme/index.scss @@ -0,0 +1,128 @@ +$themes: ( + default: ( + tabItemActiveColor: #F68804, + tabItemInactiveColor: #656565, + ), + newYear: ( + tabItemActiveColor: rgba(246, 136, 4, 1), + tabItemInactiveColor: rgba(152, 152, 152, 1), + ), + duanwu: ( + tabItemActiveColor: #538d57, + tabItemInactiveColor: #878787, + ), + + qingming: ( + tabItemActiveColor: #23bca7, + tabItemInactiveColor: #898989, + ), + laodong: ( + tabItemActiveColor: #c3000e, + tabItemInactiveColor: #676767, + ), +); + +@mixin imgs($theme-key) { + .tab_wrapper { + .tabbar-item { + width: 24px; + height: 24px; + background: transparent no-repeat center / contain; + + &.home { + background-image: url('@/assets/theme/#{$theme-key}/homeIcon.png'); + } + &.homeActive { + background-image: url('@/assets/theme/#{$theme-key}/homeIconActived.png'); + } + &.community { + background-image: url('@/assets/theme/#{$theme-key}/communityIcon.png'); + } + &.communityActive { + background-image: url('@/assets/theme/#{$theme-key}/communityIconActived.png'); + } + &.darkNet { + background-image: url('@/assets/theme/#{$theme-key}/darkNetIcon.png'); + } + &.darkNetActive { + background-image: url('@/assets/theme/#{$theme-key}/darkNetActiveIcon.png'); + } + &.ai { + background-image: url('@/assets/theme/#{$theme-key}/aiIcon.png'); + } + &.aiActive { + background-image: url('@/assets/theme/#{$theme-key}/aiIconActived.png'); + } + &.live { + background-image: url('@/assets/theme/#{$theme-key}/liveIcon.png'); + } + &.liveActive { + background-image: url('@/assets/theme/#{$theme-key}/liveIconActived.png'); + } + &.mine { + background-image: url('@/assets/theme/#{$theme-key}/mineIcon.png'); + } + &.mineActive { + background-image: url('@/assets/theme/#{$theme-key}/mineIconActived.png'); + } + &.top { + background-image: url('@/assets/theme/#{$theme-key}/homeIconScrollTop.png') !important; + } + } + } + // 节日活动背景 + .holidays_bg { + background-color: #0f0f0f; + background-image: if($theme-key != 'default', url('@/assets/theme/#{$theme-key}/_bg.png'), url('@/assets/images/png/default_bg.png')); + background-repeat: no-repeat; + background-size: 100% 502px; + } + .header_search { + // 搜索框 + .holidays_search_img { + width: 261px; + height: 34px; + background-image: if($theme-key != 'default', url('@/assets/theme/#{$theme-key}/_search.png'), none); + background-repeat: no-repeat; + background-size: 100% 100%; + margin: 0 11px; + } + } + .holidays_sign_icon { + width: 24px; + height: 24px; + background-image: if($theme-key != 'default', url('@/assets/theme/#{$theme-key}/sign_icon.png'), none); + background-repeat: no-repeat; + background-size: 100% 100%; + margin-right: 12px; + } + .holidays_sign_icon_community { + position: absolute; + right: 36px; + top: 10px; + } +} + +@mixin theme($theme-key) { + $theme: map-get($themes, $theme-key); + + @include imgs($theme-key); + + .tabbar-item-text { + color: map-get($theme, tabItemInactiveColor); + } + .van-tabbar-item--active .tabbar-item-text { + color: map-get($theme, tabItemActiveColor); + } +} + +body { + // 默认主题 + @include theme(default); + + @each $key, $value in $themes { + &.theme-#{$key} { + @include theme($key); + } + } +} diff --git a/src/assets/theme/index.ts b/src/assets/theme/index.ts new file mode 100644 index 0000000..7a86c0e --- /dev/null +++ b/src/assets/theme/index.ts @@ -0,0 +1,16 @@ +export default (theme: string) => { + console.log(theme); + const map = { + 默认: 'default', + 春节: 'newYear', + 端午节: 'duanwu', + 清明节: 'qingming', + 劳动节: 'laodong', + } as { [key: string]: string }; + const value = map[theme] || 'default'; + const body = document.body; + body.className = 'theme-' + value; + return { + holidays: value, + }; +}; diff --git a/src/assets/theme/laodong/_bg.png b/src/assets/theme/laodong/_bg.png new file mode 100644 index 0000000..15e5dfa Binary files /dev/null and b/src/assets/theme/laodong/_bg.png differ diff --git a/src/assets/theme/laodong/_search.png b/src/assets/theme/laodong/_search.png new file mode 100644 index 0000000..51b9adf Binary files /dev/null and b/src/assets/theme/laodong/_search.png differ diff --git a/src/assets/theme/laodong/aiIcon.png b/src/assets/theme/laodong/aiIcon.png new file mode 100644 index 0000000..b0084b7 Binary files /dev/null and b/src/assets/theme/laodong/aiIcon.png differ diff --git a/src/assets/theme/laodong/aiIconActived.png b/src/assets/theme/laodong/aiIconActived.png new file mode 100644 index 0000000..ac98501 Binary files /dev/null and b/src/assets/theme/laodong/aiIconActived.png differ diff --git a/src/assets/theme/laodong/communityIcon.png b/src/assets/theme/laodong/communityIcon.png new file mode 100644 index 0000000..5c00d0c Binary files /dev/null and b/src/assets/theme/laodong/communityIcon.png differ diff --git a/src/assets/theme/laodong/communityIconActived.png b/src/assets/theme/laodong/communityIconActived.png new file mode 100644 index 0000000..819b9a5 Binary files /dev/null and b/src/assets/theme/laodong/communityIconActived.png differ diff --git a/src/assets/theme/laodong/darkNetActiveIcon.png b/src/assets/theme/laodong/darkNetActiveIcon.png new file mode 100644 index 0000000..416c105 Binary files /dev/null and b/src/assets/theme/laodong/darkNetActiveIcon.png differ diff --git a/src/assets/theme/laodong/darkNetIcon.png b/src/assets/theme/laodong/darkNetIcon.png new file mode 100644 index 0000000..fb472c9 Binary files /dev/null and b/src/assets/theme/laodong/darkNetIcon.png differ diff --git a/src/assets/theme/laodong/homeIcon.png b/src/assets/theme/laodong/homeIcon.png new file mode 100644 index 0000000..a967f00 Binary files /dev/null and b/src/assets/theme/laodong/homeIcon.png differ diff --git a/src/assets/theme/laodong/homeIconActived.png b/src/assets/theme/laodong/homeIconActived.png new file mode 100644 index 0000000..788c9d7 Binary files /dev/null and b/src/assets/theme/laodong/homeIconActived.png differ diff --git a/src/assets/theme/laodong/homeIconScrollTop.png b/src/assets/theme/laodong/homeIconScrollTop.png new file mode 100644 index 0000000..bce565a Binary files /dev/null and b/src/assets/theme/laodong/homeIconScrollTop.png differ diff --git a/src/assets/theme/laodong/liveIcon.png b/src/assets/theme/laodong/liveIcon.png new file mode 100644 index 0000000..5295eed Binary files /dev/null and b/src/assets/theme/laodong/liveIcon.png differ diff --git a/src/assets/theme/laodong/liveIconActived.png b/src/assets/theme/laodong/liveIconActived.png new file mode 100644 index 0000000..09f8403 Binary files /dev/null and b/src/assets/theme/laodong/liveIconActived.png differ diff --git a/src/assets/theme/laodong/mineIcon.png b/src/assets/theme/laodong/mineIcon.png new file mode 100644 index 0000000..62b8ab4 Binary files /dev/null and b/src/assets/theme/laodong/mineIcon.png differ diff --git a/src/assets/theme/laodong/mineIconActived.png b/src/assets/theme/laodong/mineIconActived.png new file mode 100644 index 0000000..fc25b76 Binary files /dev/null and b/src/assets/theme/laodong/mineIconActived.png differ diff --git a/src/assets/theme/laodong/sign_icon.png b/src/assets/theme/laodong/sign_icon.png new file mode 100644 index 0000000..1051037 Binary files /dev/null and b/src/assets/theme/laodong/sign_icon.png differ diff --git a/src/assets/theme/newYear/_bg.png b/src/assets/theme/newYear/_bg.png new file mode 100644 index 0000000..e114f30 Binary files /dev/null and b/src/assets/theme/newYear/_bg.png differ diff --git a/src/assets/theme/newYear/_bg1.png b/src/assets/theme/newYear/_bg1.png new file mode 100644 index 0000000..3970443 Binary files /dev/null and b/src/assets/theme/newYear/_bg1.png differ diff --git a/src/assets/theme/newYear/_search.png b/src/assets/theme/newYear/_search.png new file mode 100644 index 0000000..c06d209 Binary files /dev/null and b/src/assets/theme/newYear/_search.png differ diff --git a/src/assets/theme/newYear/aiIcon.png b/src/assets/theme/newYear/aiIcon.png new file mode 100644 index 0000000..0776ec1 Binary files /dev/null and b/src/assets/theme/newYear/aiIcon.png differ diff --git a/src/assets/theme/newYear/aiIconActived.png b/src/assets/theme/newYear/aiIconActived.png new file mode 100644 index 0000000..0776ec1 Binary files /dev/null and b/src/assets/theme/newYear/aiIconActived.png differ diff --git a/src/assets/theme/newYear/communityIcon.png b/src/assets/theme/newYear/communityIcon.png new file mode 100644 index 0000000..94e505d Binary files /dev/null and b/src/assets/theme/newYear/communityIcon.png differ diff --git a/src/assets/theme/newYear/communityIconActived.png b/src/assets/theme/newYear/communityIconActived.png new file mode 100644 index 0000000..94e505d Binary files /dev/null and b/src/assets/theme/newYear/communityIconActived.png differ diff --git a/src/assets/theme/newYear/darkNetActiveIcon.png b/src/assets/theme/newYear/darkNetActiveIcon.png new file mode 100644 index 0000000..20b0ad0 Binary files /dev/null and b/src/assets/theme/newYear/darkNetActiveIcon.png differ diff --git a/src/assets/theme/newYear/darkNetIcon.png b/src/assets/theme/newYear/darkNetIcon.png new file mode 100644 index 0000000..20b0ad0 Binary files /dev/null and b/src/assets/theme/newYear/darkNetIcon.png differ diff --git a/src/assets/theme/newYear/homeIcon.png b/src/assets/theme/newYear/homeIcon.png new file mode 100644 index 0000000..3d8ddca Binary files /dev/null and b/src/assets/theme/newYear/homeIcon.png differ diff --git a/src/assets/theme/newYear/homeIconActived.png b/src/assets/theme/newYear/homeIconActived.png new file mode 100644 index 0000000..3d8ddca Binary files /dev/null and b/src/assets/theme/newYear/homeIconActived.png differ diff --git a/src/assets/theme/newYear/homeIconScrollTop.png b/src/assets/theme/newYear/homeIconScrollTop.png new file mode 100644 index 0000000..bce565a Binary files /dev/null and b/src/assets/theme/newYear/homeIconScrollTop.png differ diff --git a/src/assets/theme/newYear/liveIcon.png b/src/assets/theme/newYear/liveIcon.png new file mode 100644 index 0000000..cb19f7d Binary files /dev/null and b/src/assets/theme/newYear/liveIcon.png differ diff --git a/src/assets/theme/newYear/liveIconActived.png b/src/assets/theme/newYear/liveIconActived.png new file mode 100644 index 0000000..cb19f7d Binary files /dev/null and b/src/assets/theme/newYear/liveIconActived.png differ diff --git a/src/assets/theme/newYear/mineIcon.png b/src/assets/theme/newYear/mineIcon.png new file mode 100644 index 0000000..7ff3e24 Binary files /dev/null and b/src/assets/theme/newYear/mineIcon.png differ diff --git a/src/assets/theme/newYear/mineIconActived.png b/src/assets/theme/newYear/mineIconActived.png new file mode 100644 index 0000000..7ff3e24 Binary files /dev/null and b/src/assets/theme/newYear/mineIconActived.png differ diff --git a/src/assets/theme/newYear/sign_icon.png b/src/assets/theme/newYear/sign_icon.png new file mode 100644 index 0000000..743c00b Binary files /dev/null and b/src/assets/theme/newYear/sign_icon.png differ diff --git a/src/assets/theme/newYear/vipboxsbg_new_year.png b/src/assets/theme/newYear/vipboxsbg_new_year.png new file mode 100644 index 0000000..a8fc78c Binary files /dev/null and b/src/assets/theme/newYear/vipboxsbg_new_year.png differ diff --git a/src/assets/theme/qingming/_bg.png b/src/assets/theme/qingming/_bg.png new file mode 100644 index 0000000..b974dd3 Binary files /dev/null and b/src/assets/theme/qingming/_bg.png differ diff --git a/src/assets/theme/qingming/_search.png b/src/assets/theme/qingming/_search.png new file mode 100644 index 0000000..1bab516 Binary files /dev/null and b/src/assets/theme/qingming/_search.png differ diff --git a/src/assets/theme/qingming/aiIcon.png b/src/assets/theme/qingming/aiIcon.png new file mode 100644 index 0000000..b0084b7 Binary files /dev/null and b/src/assets/theme/qingming/aiIcon.png differ diff --git a/src/assets/theme/qingming/aiIconActived.png b/src/assets/theme/qingming/aiIconActived.png new file mode 100644 index 0000000..ac98501 Binary files /dev/null and b/src/assets/theme/qingming/aiIconActived.png differ diff --git a/src/assets/theme/qingming/communityIcon.png b/src/assets/theme/qingming/communityIcon.png new file mode 100644 index 0000000..d75e6d6 Binary files /dev/null and b/src/assets/theme/qingming/communityIcon.png differ diff --git a/src/assets/theme/qingming/communityIconActived.png b/src/assets/theme/qingming/communityIconActived.png new file mode 100644 index 0000000..ef362db Binary files /dev/null and b/src/assets/theme/qingming/communityIconActived.png differ diff --git a/src/assets/theme/qingming/darkNetActiveIcon.png b/src/assets/theme/qingming/darkNetActiveIcon.png new file mode 100644 index 0000000..bde8cc6 Binary files /dev/null and b/src/assets/theme/qingming/darkNetActiveIcon.png differ diff --git a/src/assets/theme/qingming/darkNetIcon.png b/src/assets/theme/qingming/darkNetIcon.png new file mode 100644 index 0000000..cb89d83 Binary files /dev/null and b/src/assets/theme/qingming/darkNetIcon.png differ diff --git a/src/assets/theme/qingming/homeIcon.png b/src/assets/theme/qingming/homeIcon.png new file mode 100644 index 0000000..7f70fd9 Binary files /dev/null and b/src/assets/theme/qingming/homeIcon.png differ diff --git a/src/assets/theme/qingming/homeIconActived.png b/src/assets/theme/qingming/homeIconActived.png new file mode 100644 index 0000000..db39f3a Binary files /dev/null and b/src/assets/theme/qingming/homeIconActived.png differ diff --git a/src/assets/theme/qingming/homeIconScrollTop.png b/src/assets/theme/qingming/homeIconScrollTop.png new file mode 100644 index 0000000..6ba8d55 Binary files /dev/null and b/src/assets/theme/qingming/homeIconScrollTop.png differ diff --git a/src/assets/theme/qingming/liveIcon.png b/src/assets/theme/qingming/liveIcon.png new file mode 100644 index 0000000..a3ee909 Binary files /dev/null and b/src/assets/theme/qingming/liveIcon.png differ diff --git a/src/assets/theme/qingming/liveIconActived.png b/src/assets/theme/qingming/liveIconActived.png new file mode 100644 index 0000000..f825db9 Binary files /dev/null and b/src/assets/theme/qingming/liveIconActived.png differ diff --git a/src/assets/theme/qingming/mineIcon.png b/src/assets/theme/qingming/mineIcon.png new file mode 100644 index 0000000..31d48fe Binary files /dev/null and b/src/assets/theme/qingming/mineIcon.png differ diff --git a/src/assets/theme/qingming/mineIconActived.png b/src/assets/theme/qingming/mineIconActived.png new file mode 100644 index 0000000..400931c Binary files /dev/null and b/src/assets/theme/qingming/mineIconActived.png differ diff --git a/src/assets/theme/qingming/sign_icon.png b/src/assets/theme/qingming/sign_icon.png new file mode 100644 index 0000000..1051037 Binary files /dev/null and b/src/assets/theme/qingming/sign_icon.png differ diff --git a/src/components/AccountCredentialsPopup/index.vue b/src/components/AccountCredentialsPopup/index.vue new file mode 100644 index 0000000..36bb4d1 --- /dev/null +++ b/src/components/AccountCredentialsPopup/index.vue @@ -0,0 +1,131 @@ + + + diff --git a/src/components/AdvSwiper/index.vue b/src/components/AdvSwiper/index.vue new file mode 100644 index 0000000..47ca889 --- /dev/null +++ b/src/components/AdvSwiper/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/components/AiFloat/index.vue b/src/components/AiFloat/index.vue new file mode 100644 index 0000000..ce9be03 --- /dev/null +++ b/src/components/AiFloat/index.vue @@ -0,0 +1,141 @@ + + + + diff --git a/src/components/AiGoldPopup/index.vue b/src/components/AiGoldPopup/index.vue new file mode 100644 index 0000000..ed853e1 --- /dev/null +++ b/src/components/AiGoldPopup/index.vue @@ -0,0 +1,279 @@ + + + diff --git a/src/components/AnimationHorizontalVideoInfo/index.vue b/src/components/AnimationHorizontalVideoInfo/index.vue new file mode 100644 index 0000000..d7420bd --- /dev/null +++ b/src/components/AnimationHorizontalVideoInfo/index.vue @@ -0,0 +1,221 @@ + + + diff --git a/src/components/AnimationHorizontalVideoInfo/pay/PayForWatch.vue b/src/components/AnimationHorizontalVideoInfo/pay/PayForWatch.vue new file mode 100644 index 0000000..478c254 --- /dev/null +++ b/src/components/AnimationHorizontalVideoInfo/pay/PayForWatch.vue @@ -0,0 +1,233 @@ + + + diff --git a/src/components/AnimationImg/index.vue b/src/components/AnimationImg/index.vue new file mode 100644 index 0000000..d2dd0ff --- /dev/null +++ b/src/components/AnimationImg/index.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/components/AnnouncementPopup/index.vue b/src/components/AnnouncementPopup/index.vue new file mode 100644 index 0000000..50cb4b5 --- /dev/null +++ b/src/components/AnnouncementPopup/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/components/AppSharePopup/index.vue b/src/components/AppSharePopup/index.vue new file mode 100644 index 0000000..ee7eb88 --- /dev/null +++ b/src/components/AppSharePopup/index.vue @@ -0,0 +1,259 @@ + + + diff --git a/src/components/CoinVideoPayPopup/index.vue b/src/components/CoinVideoPayPopup/index.vue new file mode 100644 index 0000000..a93e4dd --- /dev/null +++ b/src/components/CoinVideoPayPopup/index.vue @@ -0,0 +1,521 @@ + + + + + + + diff --git a/src/components/CommentBox/index.vue b/src/components/CommentBox/index.vue new file mode 100644 index 0000000..1a2e5e9 --- /dev/null +++ b/src/components/CommentBox/index.vue @@ -0,0 +1,1115 @@ + + + + diff --git a/src/components/CountdownBanner/index.vue b/src/components/CountdownBanner/index.vue new file mode 100644 index 0000000..f9a0c3a --- /dev/null +++ b/src/components/CountdownBanner/index.vue @@ -0,0 +1,634 @@ + + + + + diff --git a/src/components/DecryptImg/index.vue b/src/components/DecryptImg/index.vue new file mode 100644 index 0000000..b55d449 --- /dev/null +++ b/src/components/DecryptImg/index.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/components/Drawer/index.vue b/src/components/Drawer/index.vue new file mode 100644 index 0000000..8a31f75 --- /dev/null +++ b/src/components/Drawer/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/src/components/DynamicHtml/index.vue b/src/components/DynamicHtml/index.vue new file mode 100644 index 0000000..4dbd383 --- /dev/null +++ b/src/components/DynamicHtml/index.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/src/components/Empty/index.vue b/src/components/Empty/index.vue new file mode 100644 index 0000000..d7eeecd --- /dev/null +++ b/src/components/Empty/index.vue @@ -0,0 +1,37 @@ + + diff --git a/src/components/EnterGroupPopup/index.vue b/src/components/EnterGroupPopup/index.vue new file mode 100644 index 0000000..f0b8d66 --- /dev/null +++ b/src/components/EnterGroupPopup/index.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/components/FiveGridAdv/index.vue b/src/components/FiveGridAdv/index.vue new file mode 100644 index 0000000..c9cd073 --- /dev/null +++ b/src/components/FiveGridAdv/index.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/FiveGridAdvVal/index.vue b/src/components/FiveGridAdvVal/index.vue new file mode 100644 index 0000000..d0aeeb6 --- /dev/null +++ b/src/components/FiveGridAdvVal/index.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/components/FloatingBlock/index.vue b/src/components/FloatingBlock/index.vue new file mode 100644 index 0000000..b70be1f --- /dev/null +++ b/src/components/FloatingBlock/index.vue @@ -0,0 +1,166 @@ + + + diff --git a/src/components/FullScreenGallery/index.vue b/src/components/FullScreenGallery/index.vue new file mode 100644 index 0000000..d4a22ed --- /dev/null +++ b/src/components/FullScreenGallery/index.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/components/GoldPopup/index.vue b/src/components/GoldPopup/index.vue new file mode 100644 index 0000000..1de6142 --- /dev/null +++ b/src/components/GoldPopup/index.vue @@ -0,0 +1,339 @@ + + + diff --git a/src/components/GoldPopup/index2.vue b/src/components/GoldPopup/index2.vue new file mode 100644 index 0000000..225ba90 --- /dev/null +++ b/src/components/GoldPopup/index2.vue @@ -0,0 +1,112 @@ + + + diff --git a/src/components/Header/index.vue b/src/components/Header/index.vue new file mode 100644 index 0000000..49ed325 --- /dev/null +++ b/src/components/Header/index.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components/HeaderAdv/index.vue b/src/components/HeaderAdv/index.vue new file mode 100644 index 0000000..d747bab --- /dev/null +++ b/src/components/HeaderAdv/index.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue new file mode 100644 index 0000000..aa51b6d --- /dev/null +++ b/src/components/HeaderSearch/index.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/components/HighlightText/index.vue b/src/components/HighlightText/index.vue new file mode 100644 index 0000000..d495540 --- /dev/null +++ b/src/components/HighlightText/index.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/components/HomeAdv/hooks/useHongbaoRainCountdown.ts b/src/components/HomeAdv/hooks/useHongbaoRainCountdown.ts new file mode 100644 index 0000000..5b0592e --- /dev/null +++ b/src/components/HomeAdv/hooks/useHongbaoRainCountdown.ts @@ -0,0 +1,236 @@ +import { computed, ref, watch, type ComputedRef } from 'vue'; +import AppApi from '@/service/app'; +import { useConfigStore } from '@/stores/config'; + +/** 浮窗倒计时显示阶段 */ +export type HongbaoRainPhase = 'countdown' | 'active'; + +export interface HongbaoRainStatus { + /** 浮窗上展示的文字(未开始:HH:mm:ss;进行中:立即参与) */ + text: string; + phase: HongbaoRainPhase; +} + +/** 服务端单查空数据错误码:-1010 时浮窗已下线或暂无下一场,需移除 */ +const CODE_EMPTY_DATA = '-1010'; + +/** + * 把 banner.url 上的 query 解析出来,兼容只在 # 后带参数的写法 + */ +const getBannerUrlSearchParams = (url: string) => { + const queryIndex = url.indexOf('?'); + if (queryIndex !== -1) { + const hashIndex = url.indexOf('#', queryIndex + 1); + const query = hashIndex === -1 ? url.slice(queryIndex + 1) : url.slice(queryIndex + 1, hashIndex); + return new URLSearchParams(query); + } + const hashIndex = url.indexOf('#'); + if (hashIndex !== -1 && url.slice(hashIndex + 1).includes('=')) { + return new URLSearchParams(url.slice(hashIndex + 1)); + } + return new URLSearchParams(); +}; + +/** + * 红包雨外链:url 上带 type=hongbaoRain(及活动 id)即视为红包雨入口; + * 不要求 url 的 id 与 banner.id 字符串完全一致 + */ +export const isHongbaoRainBanner = (banner: Types.App.BannerJump | undefined | null) => { + if (!banner?.id || !banner?.url) return false; + try { + const type = getBannerUrlSearchParams(banner.url).get('type'); + if (type?.toLowerCase() === 'hongbaorain') return true; + return /(?:^|[?&#])type=hongbaoRain(?:&|$|[#])/i.test(banner.url); + } catch { + return /(?:^|[?&#])type=hongbaoRain(?:&|$|[#])/i.test(banner.url); + } +}; + +/** HH:mm:ss 格式化剩余时间 */ +const formatCountdown = (remainMs: number) => { + const totalSec = Math.max(0, Math.floor(remainMs / 1000)); + const hour = Math.floor(totalSec / 3600); + const minute = Math.floor((totalSec % 3600) / 60); + const second = totalSec % 60; + return `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`; +}; + +const isAbortError = (error: unknown) => { + if (!error || typeof error !== 'object') return false; + const err = error as { code?: string; name?: string }; + return err.code === 'ERR_CANCELED' || err.name === 'AbortError' || err.name === 'CanceledError'; +}; + +/** + * 浮窗「红包雨场次倒计时」状态管理: + * - 维护各浮窗的倒计时文案 / 进行中文案 + * - 每秒刷新一次;场次结束时按 banner.id 单查刷新,处理下一场或下线 + * + * 抽离原因:包含定时器、AbortController、跨场次副作用,且与展示组件其它业务无耦合, + * 需要独立的启动/停止时机,符合"多个副作用块需抽离"的规范。 + */ +export const useHongbaoRainCountdown = (bannerList: ComputedRef) => { + const configStore = useConfigStore(); + const statusMap = ref>({}); + /** 已处理过"场次结束"事件的 banner,避免每秒重复单查 */ + const endedHandledIds = ref>(new Set()); + const refreshingBannerId = ref(''); + let countdownTimer: number | null = null; + let isActive = false; + let refreshAbort: AbortController | null = null; + + const hongbaoRainBannerList = computed(() => bannerList.value.filter(isHongbaoRainBanner)); + + const getBannerStatus = (bannerId: string) => statusMap.value[bannerId]; + + const setStatus = (bannerId: string, status: HongbaoRainStatus) => { + statusMap.value = { ...statusMap.value, [bannerId]: status }; + }; + + const cancelRefresh = () => { + refreshAbort?.abort(); + refreshAbort = null; + }; + + /** + * 用单查结果替换列表中的 banner; + * 传 null 表示该 banner 已下线,从列表中移除 + */ + const replaceBannerById = (bannerId: string, banner: Types.App.BannerJump | null) => { + const oldList = configStore.appConfig?.bannerJumpList || []; + const nextList = oldList.filter((item) => item?.id !== bannerId); + if (banner) { + nextList.push(banner); + } + configStore.appConfig.bannerJumpList = nextList; + }; + + /** + * 场次结束 → 单查最新场次; + * - 成功:用新的 startAt/endAt 接续倒计时 + * - -1010:移除该 banner + */ + const refreshBanner = async (bannerId: string) => { + if (!isActive || !bannerId || refreshingBannerId.value === bannerId) return; + + cancelRefresh(); + const abortController = new AbortController(); + refreshAbort = abortController; + refreshingBannerId.value = bannerId; + + try { + const latestBanner = await AppApi.queryBannerById(bannerId, abortController.signal); + if (!isActive) return; + if (latestBanner?.id) { + replaceBannerById(bannerId, latestBanner); + endedHandledIds.value.delete(bannerId); + updateStatus(); + } + } catch (error: unknown) { + if (isAbortError(error) || !isActive) return; + const errorCode = String((error as Error)?.message || ''); + if (errorCode === CODE_EMPTY_DATA) { + replaceBannerById(bannerId, null); + } + } finally { + if (refreshAbort === abortController) { + refreshAbort = null; + } + refreshingBannerId.value = ''; + } + }; + + /** 单条 banner 状态更新:未开始 / 进行中 / 已结束 */ + const updateStatusForBanner = (banner: Types.App.BannerJump) => { + const bannerId = banner.id; + if (!isHongbaoRainBanner(banner)) return; + + // 非红包雨倒计时类型(兜底兼容):直接展示"立即参与" + if (Number(banner.countdownType) !== 1) { + setStatus(bannerId, { text: '立即参与', phase: 'active' }); + return; + } + + const startAt = new Date(banner.startAt).getTime(); + const endAt = new Date(banner.endAt).getTime(); + if (!Number.isFinite(startAt) || !Number.isFinite(endAt)) { + setStatus(bannerId, { text: '', phase: 'countdown' }); + return; + } + const now = Date.now(); + if (now < startAt) { + setStatus(bannerId, { + text: formatCountdown(startAt - now), + phase: 'countdown', + }); + endedHandledIds.value.delete(bannerId); + return; + } + if (now < endAt) { + setStatus(bannerId, { text: '立即参与', phase: 'active' }); + endedHandledIds.value.delete(bannerId); + return; + } + // 场次已结束:先清空文案;同一 id 只在边界触发一次单查 + setStatus(bannerId, { text: '', phase: 'countdown' }); + if (!endedHandledIds.value.has(bannerId)) { + endedHandledIds.value = new Set(endedHandledIds.value).add(bannerId); + refreshBanner(bannerId); + } + }; + + const updateStatus = () => { + if (!isActive) return; + const list = hongbaoRainBannerList.value; + if (!list.length) { + statusMap.value = {}; + endedHandledIds.value = new Set(); + return; + } + // 清理已不在列表中的状态/已处理标记,避免内存堆积 + const activeIds = new Set(list.map((item) => item.id)); + statusMap.value = Object.fromEntries( + Object.entries(statusMap.value).filter(([id]) => activeIds.has(id)), + ); + endedHandledIds.value = new Set([...endedHandledIds.value].filter((id) => activeIds.has(id))); + list.forEach((banner) => updateStatusForBanner(banner)); + }; + + const startCountdown = () => { + if (countdownTimer) { + clearInterval(countdownTimer); + } + isActive = true; + updateStatus(); + countdownTimer = window.setInterval(() => { + updateStatus(); + }, 1000); + }; + + const stopCountdown = () => { + isActive = false; + if (countdownTimer) { + clearInterval(countdownTimer); + countdownTimer = null; + } + cancelRefresh(); + }; + + /** 配置侧的 bannerJumpList 变更时(如其它入口刷新配置)同步更新状态 */ + watch( + () => [hongbaoRainBannerList.value, configStore.appConfig?.bannerJumpList] as const, + () => { + if (!isActive) return; + updateStatus(); + }, + { deep: true }, + ); + + return { + statusMap, + getBannerStatus, + isHongbaoRainBanner, + startCountdown, + stopCountdown, + }; +}; diff --git a/src/components/HomeAdv/index.vue b/src/components/HomeAdv/index.vue new file mode 100644 index 0000000..3f31a0c --- /dev/null +++ b/src/components/HomeAdv/index.vue @@ -0,0 +1,309 @@ + + + + diff --git a/src/components/HomeAdv/swipeFloat.vue b/src/components/HomeAdv/swipeFloat.vue new file mode 100644 index 0000000..9ac00e3 --- /dev/null +++ b/src/components/HomeAdv/swipeFloat.vue @@ -0,0 +1,348 @@ + + + + + diff --git a/src/components/HomeHeader/index.vue b/src/components/HomeHeader/index.vue new file mode 100644 index 0000000..9a36508 --- /dev/null +++ b/src/components/HomeHeader/index.vue @@ -0,0 +1,244 @@ + + + diff --git a/src/components/HomePopupAdv/index.vue b/src/components/HomePopupAdv/index.vue new file mode 100644 index 0000000..742c9fc --- /dev/null +++ b/src/components/HomePopupAdv/index.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/components/HomepagePaymentFloat/index.vue b/src/components/HomepagePaymentFloat/index.vue new file mode 100644 index 0000000..a556cd7 --- /dev/null +++ b/src/components/HomepagePaymentFloat/index.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/components/HomepagePaymentPopup/index.vue b/src/components/HomepagePaymentPopup/index.vue new file mode 100644 index 0000000..0baec9f --- /dev/null +++ b/src/components/HomepagePaymentPopup/index.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/components/HorizontalGameBox/index.vue b/src/components/HorizontalGameBox/index.vue new file mode 100644 index 0000000..795ab7c --- /dev/null +++ b/src/components/HorizontalGameBox/index.vue @@ -0,0 +1,171 @@ + + + diff --git a/src/components/HorizontalVideoBox/index.vue b/src/components/HorizontalVideoBox/index.vue new file mode 100644 index 0000000..53e0e29 --- /dev/null +++ b/src/components/HorizontalVideoBox/index.vue @@ -0,0 +1,473 @@ + + + diff --git a/src/components/HorizontalVideoInfo/index.vue b/src/components/HorizontalVideoInfo/index.vue new file mode 100644 index 0000000..c6d5fee --- /dev/null +++ b/src/components/HorizontalVideoInfo/index.vue @@ -0,0 +1,368 @@ + + + diff --git a/src/components/InsertAdvSwiper/index.vue b/src/components/InsertAdvSwiper/index.vue new file mode 100644 index 0000000..06d46e7 --- /dev/null +++ b/src/components/InsertAdvSwiper/index.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/components/JointGameing/index.vue b/src/components/JointGameing/index.vue new file mode 100644 index 0000000..acc9a6c --- /dev/null +++ b/src/components/JointGameing/index.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/components/KingKong/index.vue b/src/components/KingKong/index.vue new file mode 100644 index 0000000..705cbb6 --- /dev/null +++ b/src/components/KingKong/index.vue @@ -0,0 +1,76 @@ + + + diff --git a/src/components/LimitedTimeOfferPopup/index.vue b/src/components/LimitedTimeOfferPopup/index.vue new file mode 100644 index 0000000..9221571 --- /dev/null +++ b/src/components/LimitedTimeOfferPopup/index.vue @@ -0,0 +1,372 @@ + + + diff --git a/src/components/Loading/index.vue b/src/components/Loading/index.vue new file mode 100644 index 0000000..28490ad --- /dev/null +++ b/src/components/Loading/index.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/MainItem/components/BigHorizontalScreenUnlimit.vue b/src/components/MainItem/components/BigHorizontalScreenUnlimit.vue new file mode 100644 index 0000000..dff51a1 --- /dev/null +++ b/src/components/MainItem/components/BigHorizontalScreenUnlimit.vue @@ -0,0 +1,87 @@ + + + + diff --git a/src/components/MainItem/components/BigScreenHorizontalSlidingSmall.vue b/src/components/MainItem/components/BigScreenHorizontalSlidingSmall.vue new file mode 100644 index 0000000..402af09 --- /dev/null +++ b/src/components/MainItem/components/BigScreenHorizontalSlidingSmall.vue @@ -0,0 +1,113 @@ + + + + diff --git a/src/components/MainItem/components/FourGridHorizontal.vue b/src/components/MainItem/components/FourGridHorizontal.vue new file mode 100644 index 0000000..44f1406 --- /dev/null +++ b/src/components/MainItem/components/FourGridHorizontal.vue @@ -0,0 +1,104 @@ + + + + diff --git a/src/components/MainItem/components/FourGridVertical.vue b/src/components/MainItem/components/FourGridVertical.vue new file mode 100644 index 0000000..e6e9618 --- /dev/null +++ b/src/components/MainItem/components/FourGridVertical.vue @@ -0,0 +1,119 @@ + + + + diff --git a/src/components/MainItem/components/GuessYouLike.vue b/src/components/MainItem/components/GuessYouLike.vue new file mode 100644 index 0000000..bf23e59 --- /dev/null +++ b/src/components/MainItem/components/GuessYouLike.vue @@ -0,0 +1,167 @@ + + + diff --git a/src/components/MainItem/components/HorizontalSlidingBig.vue b/src/components/MainItem/components/HorizontalSlidingBig.vue new file mode 100644 index 0000000..c8e15cc --- /dev/null +++ b/src/components/MainItem/components/HorizontalSlidingBig.vue @@ -0,0 +1,91 @@ + + + + diff --git a/src/components/MainItem/components/HorizontalSlidingSmall.vue b/src/components/MainItem/components/HorizontalSlidingSmall.vue new file mode 100644 index 0000000..b4886e9 --- /dev/null +++ b/src/components/MainItem/components/HorizontalSlidingSmall.vue @@ -0,0 +1,91 @@ + + + + diff --git a/src/components/MainItem/components/HorizontalThreeBig.vue b/src/components/MainItem/components/HorizontalThreeBig.vue new file mode 100644 index 0000000..2853ce7 --- /dev/null +++ b/src/components/MainItem/components/HorizontalThreeBig.vue @@ -0,0 +1,55 @@ + + + + diff --git a/src/components/MainItem/components/OneBigFourSmall.vue b/src/components/MainItem/components/OneBigFourSmall.vue new file mode 100644 index 0000000..ef82a44 --- /dev/null +++ b/src/components/MainItem/components/OneBigFourSmall.vue @@ -0,0 +1,138 @@ + + + + diff --git a/src/components/MainItem/components/SixGrid.vue b/src/components/MainItem/components/SixGrid.vue new file mode 100644 index 0000000..430b20b --- /dev/null +++ b/src/components/MainItem/components/SixGrid.vue @@ -0,0 +1,106 @@ + + + + diff --git a/src/components/MainItem/components/UpdateDaily.vue b/src/components/MainItem/components/UpdateDaily.vue new file mode 100644 index 0000000..95a73b8 --- /dev/null +++ b/src/components/MainItem/components/UpdateDaily.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/components/MainItem/components/VerticalNineGrid.vue b/src/components/MainItem/components/VerticalNineGrid.vue new file mode 100644 index 0000000..15cd13f --- /dev/null +++ b/src/components/MainItem/components/VerticalNineGrid.vue @@ -0,0 +1,132 @@ + + + + diff --git a/src/components/MainItem/components/VerticalSixGrid.vue b/src/components/MainItem/components/VerticalSixGrid.vue new file mode 100644 index 0000000..ea0e2b4 --- /dev/null +++ b/src/components/MainItem/components/VerticalSixGrid.vue @@ -0,0 +1,118 @@ + + + + diff --git a/src/components/MainItem/components/VerticalSlideBig.vue b/src/components/MainItem/components/VerticalSlideBig.vue new file mode 100644 index 0000000..f5b1e88 --- /dev/null +++ b/src/components/MainItem/components/VerticalSlideBig.vue @@ -0,0 +1,106 @@ + + + + diff --git a/src/components/MainItem/components/VerticalTwoSlid.vue b/src/components/MainItem/components/VerticalTwoSlid.vue new file mode 100644 index 0000000..7d18a46 --- /dev/null +++ b/src/components/MainItem/components/VerticalTwoSlid.vue @@ -0,0 +1,214 @@ + + + + diff --git a/src/components/MainItem/index.vue b/src/components/MainItem/index.vue new file mode 100644 index 0000000..6b937b1 --- /dev/null +++ b/src/components/MainItem/index.vue @@ -0,0 +1,367 @@ + + + diff --git a/src/components/MarqueeBar/index.vue b/src/components/MarqueeBar/index.vue new file mode 100644 index 0000000..ef6963a --- /dev/null +++ b/src/components/MarqueeBar/index.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/components/MeTabPaymentBanner/index.vue b/src/components/MeTabPaymentBanner/index.vue new file mode 100644 index 0000000..e695e8e --- /dev/null +++ b/src/components/MeTabPaymentBanner/index.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/components/MembershipActivation/index.vue b/src/components/MembershipActivation/index.vue new file mode 100644 index 0000000..58906d8 --- /dev/null +++ b/src/components/MembershipActivation/index.vue @@ -0,0 +1,734 @@ + + + diff --git a/src/components/NineGridPopup/index.vue b/src/components/NineGridPopup/index.vue new file mode 100644 index 0000000..c5bcac7 --- /dev/null +++ b/src/components/NineGridPopup/index.vue @@ -0,0 +1,115 @@ + + + diff --git a/src/components/PayPresalePopup/index.vue b/src/components/PayPresalePopup/index.vue new file mode 100644 index 0000000..612468a --- /dev/null +++ b/src/components/PayPresalePopup/index.vue @@ -0,0 +1,112 @@ + + + diff --git a/src/components/PaymentGuidePopup/components/GuideBottomSheet.vue b/src/components/PaymentGuidePopup/components/GuideBottomSheet.vue new file mode 100644 index 0000000..8a72ed8 --- /dev/null +++ b/src/components/PaymentGuidePopup/components/GuideBottomSheet.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/components/PaymentGuidePopup/components/GuideCenterModal.vue b/src/components/PaymentGuidePopup/components/GuideCenterModal.vue new file mode 100644 index 0000000..8619973 --- /dev/null +++ b/src/components/PaymentGuidePopup/components/GuideCenterModal.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/src/components/PaymentGuidePopup/components/GuideTopSheet.vue b/src/components/PaymentGuidePopup/components/GuideTopSheet.vue new file mode 100644 index 0000000..1d211f7 --- /dev/null +++ b/src/components/PaymentGuidePopup/components/GuideTopSheet.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/src/components/PaymentGuidePopup/index.vue b/src/components/PaymentGuidePopup/index.vue new file mode 100644 index 0000000..85535ac --- /dev/null +++ b/src/components/PaymentGuidePopup/index.vue @@ -0,0 +1,282 @@ + + + diff --git a/src/components/PaymentGuidePopup/types.ts b/src/components/PaymentGuidePopup/types.ts new file mode 100644 index 0000000..f0d135b --- /dev/null +++ b/src/components/PaymentGuidePopup/types.ts @@ -0,0 +1,9 @@ +/** 标题高亮色调:gold=金色渐变,danger=警示红 */ +export type GuideTitleTone = 'gold' | 'danger'; + +export interface GuideTitlePart { + text: string; + tone?: GuideTitleTone; +} + +export type GuideTitleLine = GuideTitlePart[]; diff --git a/src/components/PersalePopup/index.vue b/src/components/PersalePopup/index.vue new file mode 100644 index 0000000..f8b5b5e --- /dev/null +++ b/src/components/PersalePopup/index.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/components/Post/index.vue b/src/components/Post/index.vue new file mode 100644 index 0000000..42a71af --- /dev/null +++ b/src/components/Post/index.vue @@ -0,0 +1,639 @@ + + + + + diff --git a/src/components/PreSaleCountGoldPopup/index.vue b/src/components/PreSaleCountGoldPopup/index.vue new file mode 100644 index 0000000..5948f4a --- /dev/null +++ b/src/components/PreSaleCountGoldPopup/index.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/components/PreSaleGoldPopup/index.vue b/src/components/PreSaleGoldPopup/index.vue new file mode 100644 index 0000000..01f1c32 --- /dev/null +++ b/src/components/PreSaleGoldPopup/index.vue @@ -0,0 +1,127 @@ + + + diff --git a/src/components/PreSaleVipPopup/index.vue b/src/components/PreSaleVipPopup/index.vue new file mode 100644 index 0000000..d5de21f --- /dev/null +++ b/src/components/PreSaleVipPopup/index.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/components/Promote/index.vue b/src/components/Promote/index.vue new file mode 100644 index 0000000..7769d02 --- /dev/null +++ b/src/components/Promote/index.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/components/PublishTip/index.vue b/src/components/PublishTip/index.vue new file mode 100644 index 0000000..3637cce --- /dev/null +++ b/src/components/PublishTip/index.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/components/PullRefresh/index.vue b/src/components/PullRefresh/index.vue new file mode 100644 index 0000000..327e44d --- /dev/null +++ b/src/components/PullRefresh/index.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/components/RechargeBox/index.vue b/src/components/RechargeBox/index.vue new file mode 100644 index 0000000..2b966ef --- /dev/null +++ b/src/components/RechargeBox/index.vue @@ -0,0 +1,764 @@ + + + diff --git a/src/components/RecommendedList/index.vue b/src/components/RecommendedList/index.vue new file mode 100644 index 0000000..cf87a81 --- /dev/null +++ b/src/components/RecommendedList/index.vue @@ -0,0 +1,123 @@ + + + diff --git a/src/components/RecommendedList/video.vue b/src/components/RecommendedList/video.vue new file mode 100644 index 0000000..907f37d --- /dev/null +++ b/src/components/RecommendedList/video.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/components/RichPreview/index.vue b/src/components/RichPreview/index.vue new file mode 100644 index 0000000..da2ace6 --- /dev/null +++ b/src/components/RichPreview/index.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/components/RoadLinePopup/index.vue b/src/components/RoadLinePopup/index.vue new file mode 100644 index 0000000..4616c44 --- /dev/null +++ b/src/components/RoadLinePopup/index.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/components/SelectionLinePopup/index.vue b/src/components/SelectionLinePopup/index.vue new file mode 100644 index 0000000..18e3490 --- /dev/null +++ b/src/components/SelectionLinePopup/index.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/components/SetPricePop/index.vue b/src/components/SetPricePop/index.vue new file mode 100644 index 0000000..3b1e375 --- /dev/null +++ b/src/components/SetPricePop/index.vue @@ -0,0 +1,174 @@ + + + diff --git a/src/components/SmallVideo/index.vue b/src/components/SmallVideo/index.vue new file mode 100644 index 0000000..d2766e7 --- /dev/null +++ b/src/components/SmallVideo/index.vue @@ -0,0 +1,225 @@ + + + diff --git a/src/components/SplashAdvSwiper/index.vue b/src/components/SplashAdvSwiper/index.vue new file mode 100644 index 0000000..f1027d6 --- /dev/null +++ b/src/components/SplashAdvSwiper/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..264764d --- /dev/null +++ b/src/components/SvgIcon/index.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/components/TabBar/index.vue b/src/components/TabBar/index.vue new file mode 100644 index 0000000..bdea3d3 --- /dev/null +++ b/src/components/TabBar/index.vue @@ -0,0 +1,315 @@ + + + + diff --git a/src/components/TextOverflow/index.vue b/src/components/TextOverflow/index.vue new file mode 100644 index 0000000..58fed59 --- /dev/null +++ b/src/components/TextOverflow/index.vue @@ -0,0 +1,209 @@ + + + + diff --git a/src/components/TextOvreflowDetail/index.vue b/src/components/TextOvreflowDetail/index.vue new file mode 100644 index 0000000..582e817 --- /dev/null +++ b/src/components/TextOvreflowDetail/index.vue @@ -0,0 +1,201 @@ + + + + diff --git a/src/components/TipPopup/index.vue b/src/components/TipPopup/index.vue new file mode 100644 index 0000000..9918634 --- /dev/null +++ b/src/components/TipPopup/index.vue @@ -0,0 +1,121 @@ + + + diff --git a/src/components/TipPopup/index1.vue b/src/components/TipPopup/index1.vue new file mode 100644 index 0000000..e68fa1b --- /dev/null +++ b/src/components/TipPopup/index1.vue @@ -0,0 +1,81 @@ + + + diff --git a/src/components/UpgradePopup/index.vue b/src/components/UpgradePopup/index.vue new file mode 100644 index 0000000..aca98c1 --- /dev/null +++ b/src/components/UpgradePopup/index.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/components/UploadImg/index.vue b/src/components/UploadImg/index.vue new file mode 100644 index 0000000..18fba2d --- /dev/null +++ b/src/components/UploadImg/index.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/src/components/UploadImgMess/index.vue b/src/components/UploadImgMess/index.vue new file mode 100644 index 0000000..45ead1d --- /dev/null +++ b/src/components/UploadImgMess/index.vue @@ -0,0 +1,297 @@ + + + + + diff --git a/src/components/UploadVideo/index.vue b/src/components/UploadVideo/index.vue new file mode 100644 index 0000000..947264e --- /dev/null +++ b/src/components/UploadVideo/index.vue @@ -0,0 +1,335 @@ + + + diff --git a/src/components/UserCommentItem/index.vue b/src/components/UserCommentItem/index.vue new file mode 100644 index 0000000..4c3c545 --- /dev/null +++ b/src/components/UserCommentItem/index.vue @@ -0,0 +1,129 @@ + + + + diff --git a/src/components/UserPost/index.vue b/src/components/UserPost/index.vue new file mode 100644 index 0000000..f15aff1 --- /dev/null +++ b/src/components/UserPost/index.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/src/components/VideoHls/AnimationHorizontalVideo.vue b/src/components/VideoHls/AnimationHorizontalVideo.vue new file mode 100644 index 0000000..8bd36ff --- /dev/null +++ b/src/components/VideoHls/AnimationHorizontalVideo.vue @@ -0,0 +1,643 @@ + + + diff --git a/src/components/VideoHls/HorizontalVideo.vue b/src/components/VideoHls/HorizontalVideo.vue new file mode 100644 index 0000000..93cdc0d --- /dev/null +++ b/src/components/VideoHls/HorizontalVideo.vue @@ -0,0 +1,803 @@ + + + diff --git a/src/components/VideoHls/VerticalVideo.vue b/src/components/VideoHls/VerticalVideo.vue new file mode 100644 index 0000000..6233c78 --- /dev/null +++ b/src/components/VideoHls/VerticalVideo.vue @@ -0,0 +1,833 @@ + + + diff --git a/src/components/VideoInfo/index.vue b/src/components/VideoInfo/index.vue new file mode 100644 index 0000000..236b04c --- /dev/null +++ b/src/components/VideoInfo/index.vue @@ -0,0 +1,954 @@ + + + + diff --git a/src/components/VideoPermissionMask/index.vue b/src/components/VideoPermissionMask/index.vue new file mode 100644 index 0000000..eb40597 --- /dev/null +++ b/src/components/VideoPermissionMask/index.vue @@ -0,0 +1,298 @@ + + + diff --git a/src/components/VideoWaterfallFlow/index.vue b/src/components/VideoWaterfallFlow/index.vue new file mode 100644 index 0000000..6ad5afe --- /dev/null +++ b/src/components/VideoWaterfallFlow/index.vue @@ -0,0 +1,210 @@ + + + diff --git a/src/components/VipImg/index.vue b/src/components/VipImg/index.vue new file mode 100644 index 0000000..d02c2aa --- /dev/null +++ b/src/components/VipImg/index.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/components/VipLinePopup/index.vue b/src/components/VipLinePopup/index.vue new file mode 100644 index 0000000..89e4e67 --- /dev/null +++ b/src/components/VipLinePopup/index.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/components/VipPopup/index.vue b/src/components/VipPopup/index.vue new file mode 100644 index 0000000..aa07756 --- /dev/null +++ b/src/components/VipPopup/index.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/components/VipPopup/index1.vue b/src/components/VipPopup/index1.vue new file mode 100644 index 0000000..c466eac --- /dev/null +++ b/src/components/VipPopup/index1.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/components/lazyImg/index.vue b/src/components/lazyImg/index.vue new file mode 100644 index 0000000..99cfbd6 --- /dev/null +++ b/src/components/lazyImg/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/src/components/limitedTime/index.vue b/src/components/limitedTime/index.vue new file mode 100644 index 0000000..1d4db93 --- /dev/null +++ b/src/components/limitedTime/index.vue @@ -0,0 +1,113 @@ + + + diff --git a/src/components/originStroe/index.vue b/src/components/originStroe/index.vue new file mode 100644 index 0000000..ddf3f5d --- /dev/null +++ b/src/components/originStroe/index.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/originStroe/storeMine.vue b/src/components/originStroe/storeMine.vue new file mode 100644 index 0000000..9c6e2ef --- /dev/null +++ b/src/components/originStroe/storeMine.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/paymentStatusPopup/PaymentStatusPopupLegacy.vue b/src/components/paymentStatusPopup/PaymentStatusPopupLegacy.vue new file mode 100644 index 0000000..26ab97f --- /dev/null +++ b/src/components/paymentStatusPopup/PaymentStatusPopupLegacy.vue @@ -0,0 +1,1025 @@ + + + diff --git a/src/components/paymentStatusPopup/PaymentStatusPopupNew.vue b/src/components/paymentStatusPopup/PaymentStatusPopupNew.vue new file mode 100644 index 0000000..5f3bbbf --- /dev/null +++ b/src/components/paymentStatusPopup/PaymentStatusPopupNew.vue @@ -0,0 +1,1272 @@ + + + diff --git a/src/components/paymentStatusPopup/index.vue b/src/components/paymentStatusPopup/index.vue new file mode 100644 index 0000000..fc2e5b5 --- /dev/null +++ b/src/components/paymentStatusPopup/index.vue @@ -0,0 +1,90 @@ + + diff --git a/src/enums/app.ts b/src/enums/app.ts new file mode 100644 index 0000000..78a82d0 --- /dev/null +++ b/src/enums/app.ts @@ -0,0 +1,107 @@ +/** + * @description 资源配置类型 + */ +export enum SourceType { + GROUP = 'GROUP', + GUIDE = 'GUIDE', + AUDIO = 'AUDIO', + IMAGE = 'IMAGE', + VID = 'VID', + LAND = 'LAND', + PROXYRULE = 'PROXYRULE', + FAQ = 'FAQ', + QRCODE = 'QRCODE', + WELFARE = 'WELFARE', + ACT = 'ACT', + AppStore = 'AppStore', + UP = 'UP', + PRESALEBGIMG = 'preSaleBgImg', +} + +/** + * @description 广告类型 + */ +export enum AdType { + START = 1, /// 启动广告 + HOMEPOPUPADV = 46, // 首页弹窗广告 2 + HOME = 4, /// 首页 110*110 + COMMUNITYCAROUSEL = 7, /// 社区广告位 110*110 + QualityApplication = 3, //精品应用 3 (16宫格广告) + TopAdvsList = 6, //九宫格横幅广告 6 + VIDEOSWIPER = 6, /// 长视频/动漫/帖子 详情广告位 + HorizontalVersion = 11, // 长视频列表-横版 8 + VerticalVersion = 12, // 短视频列表-竖版 12 + SHORTVIDEOFLOATING = 8, // 短视频浮框 + MINE = 10, // 我的 10 + SEARCHADV = 11, /// 搜索轮播 11 + FREE_VIDEO = 26, // 视频播放前的广告 + HOMEADV = 4, // 首页双排小宫格 + VIDEOADV = 6, // 视频页广告 + COMMUNITY_BLOCK_ADV = 30, // 社区页面方块广告 + MINE_BLOCK_ADV = 8, // 我的页面方块广告 + SEARCH_BLOCK_ADV = 32, // 搜索页面方块广告 + LiveHome = 35, // 直播页 + LiveDetail = 36, // 直播详情页 + TopicGridAdv = 5, // 专题之间2+1的方块广告 + CAPESIXANDONE = 11, // 海角6+1 + NEW_FREE_VIDEO = 50, // (新)视频播放前的广告 +} +/** + * @description 产品类型 + */ +export enum ProductType { + VIDEO = 1, //VIDEO视频1 + MODEL = 2, //MODEL嫩模2 + MeetingCard = 3, //约会卡 3 + GAME = 4, //游戏币 4 + NEWUSERCard = 5, //新手卡 5 + PhysicalGoods = 6, //实体商品 6 + LouFeng = 7, //楼凤 7 + AudioBook = 8, //语音小说 8 + LouFengDiscount = 9, //楼凤优惠卡 9 + LouFengQuanMian = 10, //楼凤全免卡 10 + AVCommentVIDEO = 11, //AV解说VIDEO视频 11 + NudeChatService = 12, //裸聊服务 12 + VideoDiscount = 13, //视频折扣卡 13 + VideoFreeCard = 14, //视频免费卡 14 + BookLoufeng = 15, //预约 + AcgAll = 19, //整本购买 + AcgOne = 25, //单章节购买 +} + +/** + * @description 点赞类型 + */ +export enum LikeType { + SP = 'SP', //长视频 + SHORT = 'SHORT', //短视频 + COMMENT = 'COMMENT', //评论 + SEED_LINK = 'SEED_LINK', //种子/黄油 + COVER = 'COVER', //图文 + PIC = 'PIC', //图集 + TAG = 'TAG', //标签 + VIDEO = 'video', //动漫 + IMAGE = 'image', //漫画 + TEXT = 'text', //小说 + DRAMA = 'drama', //短剧 +} + +export enum HistoryVideoType { + VIDEO = 'videos', // 影视 + LACKVIDEO = 'lackVideo', // 短视频 + MOVIE = 'movies', // 影视 + POST = 'post', // 帖子 + IMG = 'img', // 图片 + AcgImage = 'acgImage', // 漫画 + AcgVideo = 'acgVideo', // 动漫 + AcgText = 'acgText', // 小说 + TOPICDETAIL = 'topicDetail', // 套图详情 + SEEKBRANCHSTORY = 'seedLink', // 游戏 + PIC = 'pic', // 图集 +} + +export enum AcgEventBusKey { + Collected = 'acg_collected_', + HasPaid = 'acg_hasPaid_', + HasBuy = 'acg_hasBuy_', +} diff --git a/src/enums/home.ts b/src/enums/home.ts new file mode 100644 index 0000000..fbb3bcf --- /dev/null +++ b/src/enums/home.ts @@ -0,0 +1,29 @@ +/** 首页模块排序刷新模式 */ +export enum ModuleRefreshMode { + DEFAULT = 'DEFAULT', + RANDOM_TOP_N = 'RANDOM_TOP_N', +} + +/** 付费引导展示样式 */ +export enum PaymentGuideStyle { + /** 底部半屏 */ + BOTTOM_SHEET = 'BOTTOM_SHEET', + /** 居中弹窗(带优惠倒计时) */ + CENTER_MODAL = 'CENTER_MODAL', + /** 首页顶部横幅 */ + TOP_SHEET = 'TOP_SHEET', +} + +/** 付费引导场景 */ +export enum PaymentGuideScene { + /** 新用户免费试看次数 */ + HOME_NEW_USER_FREE_TRIAL = 'HOME_NEW_USER_FREE_TRIAL', + HOME_OLD_USER = 'HOME_OLD_USER', + VIDEO_PREVIEW_END = 'VIDEO_PREVIEW_END', + /** 优惠倒计时:冷启动本地固定 2 小时,不上报回执 */ + DISCOUNT_COUNTDOWN = 'DISCOUNT_COUNTDOWN', + VIDEO_BACK = 'VIDEO_BACK', + /** 会员中心优惠:冷启动本地固定 2 小时,不上报回执,进入会员中心每次弹 */ + VIP_CENTER = 'VIP_CENTER', + VIP_CONTENT_UPDATE = 'VIP_CONTENT_UPDATE', +} diff --git a/src/enums/http.ts b/src/enums/http.ts new file mode 100644 index 0000000..d58de72 --- /dev/null +++ b/src/enums/http.ts @@ -0,0 +1,14 @@ +export enum HttpMethods { + POST = 'post', + GET = 'get', + PUT = 'put', + DELETE = 'delete', +} + +export enum ResponseType { + ARRAYBUFFER = 'arraybuffer', + BLOB = 'blob', + DOCUMENT = 'document', + JSON = 'json', + STREAM = 'stream', +} diff --git a/src/hooks/common.ts b/src/hooks/common.ts new file mode 100644 index 0000000..5c406f0 --- /dev/null +++ b/src/hooks/common.ts @@ -0,0 +1,25 @@ +import { ref, onActivated } from 'vue'; +import { onBeforeRouteLeave } from 'vue-router'; +export default function useCommon() { + // 路由离开之前 + const domScrollTop = ref(0); + const routeLeaveRecord = (el: HTMLElement) => { + onBeforeRouteLeave(() => { + if (el) { + domScrollTop.value = el.scrollTop; + } + }); + }; + // 路由回来 + const routeBackRecord = (el: HTMLElement) => { + onActivated(() => { + if (el) { + el.scrollTo(0, domScrollTop.value); + } + }); + }; + return { + routeLeaveRecord, + routeBackRecord, + }; +} diff --git a/src/hooks/loading.ts b/src/hooks/loading.ts new file mode 100644 index 0000000..91135f2 --- /dev/null +++ b/src/hooks/loading.ts @@ -0,0 +1,27 @@ +import { showLoadingToast } from 'vant'; +import { ToastOptions, ToastWrapperInstance } from 'vant/lib/toast/types'; +import loadingGif from '../assets/gif/loading.gif'; + +export default function useLoading() { + const options: ToastOptions = { + duration: 0, + forbidClick: true, + className: 'global_loading', + icon: loadingGif, + }; + let toast: ToastWrapperInstance; + + const openLoading = () => { + toast = showLoadingToast(options); + }; + const closeLoading = () => { + setTimeout(() => { + toast?.close(); + }, 500); + }; + + return { + openLoading, + closeLoading, + }; +} diff --git a/src/hooks/newUserCountdown.ts b/src/hooks/newUserCountdown.ts new file mode 100644 index 0000000..c33cfd1 --- /dev/null +++ b/src/hooks/newUserCountdown.ts @@ -0,0 +1,60 @@ +// 新用户优惠倒计时 +import { ref, computed } from 'vue'; +import { useUserStore } from '@/stores/user'; +import MineApi from '@/service/mine'; +import { useConfigStore } from '@/stores/config'; +const { isNewUser, isVip } = useUserStore(); +const newUserTimeStr = ref(''); +let timeoutTimer: any; +const useConfig = useConfigStore(); +const bannerTipsText = computed(() => { + if (newUserTimeStr.value) { + return '新用户升级会员特惠'; + } else { + const data = useConfig.appConfig.advanceStatus; + if (data && data.activityPopUp) { + // 开启预售 + if (data.status == 0) { + return '开通限时预售 金币视频永久免费看'; + } + } + return '开通会员 享专属特权'; + } +}); + +// 个位数前补零 +const numToString = (num: number) => num.toString().padStart(2, '0'); + +const countdowns = (timer: number) => { + if (timer <= 0 || useUserStore().isVip) { + timeoutTimer && clearTimeout(timeoutTimer); + newUserTimeStr.value = ''; + return; + } + // 相差的毫秒数 + const msec: any = timer; + // 计算时分秒数 + const hr: any = parseInt((msec / 60 / 60).toString()); + const min: any = parseInt(((msec / 60) % 60).toString()); + const sec: any = parseInt((msec % 60).toString()); + newUserTimeStr.value = `${numToString(hr)}:${numToString(min)}:${numToString(sec)}`; + // 一秒后递归 + timeoutTimer = setTimeout(() => { + timer--; + countdowns(timer); + }, 1000); +}; + +const queryTiroCountdown = async () => { + try { + if (newUserTimeStr.value) return; + if (isVip) return; + + const res: any = await MineApi.queryNewcomerCountdown(); + countdowns(res.countdownSec); + } catch (e) { + console.log(e); + } +}; + +export { isNewUser, newUserTimeStr, queryTiroCountdown, bannerTipsText }; diff --git a/src/hooks/usePaymentGuide.ts b/src/hooks/usePaymentGuide.ts new file mode 100644 index 0000000..993f1d4 --- /dev/null +++ b/src/hooks/usePaymentGuide.ts @@ -0,0 +1,265 @@ +import { nextTick, ref } from 'vue'; +import PaymentApi from '@/service/payment'; +import { PaymentGuideScene } from '@/enums/home'; +import { createUuid } from '@/utils/uuid'; +import { + canShowPaymentGuideFromPing, + getPaymentGuidePing, + getPaymentGuideSceneConfig, + healPaymentGuideShowFromServerIfNeeded, + releasePaymentGuidePresentLock, + shouldBlockPaymentGuideByAudience, + shouldBlockPaymentGuideForMember, + toPaymentGuideFromSceneConfig, + tryAcquirePaymentGuidePresentLock, +} from '@/utils/paymentGuide'; +import { turnOffPaymentGuideLocalSwitch } from '@/utils/paymentGuideLocalSwitch'; +import { + canShowDiscountCountdownThisSession, + ensureDiscountCountdownDeadlineMs, + getDiscountCountdownRemainingMs, + isDiscountCountdownScene, + markDiscountCountdownShownThisSession, +} from '@/utils/discountCountdownLocal'; +import { + isVipContentUpdateScene, + markVipContentUpdateGuideShown, + shouldShowVipContentUpdateGuide, +} from '@/utils/vipContentUpdateGuideLocal'; + +const IMPRESSION_MAX_ATTEMPTS = 3; + +export type VipContentUpdateAttemptResult = { + /** 是否已成功请求过 /payment/guide */ + fetched: boolean; + shown: boolean; + /** true:本轮无需再试(无需展示或已弹出);false:已拉到配置但暂不能展示,可稍后复用缓存再试 */ + settled: boolean; +}; + +export const usePaymentGuide = () => { + const visible = ref(false); + const guide = ref(null); + const scene = ref(''); + const videoId = ref(''); + let holdingPresentLock = false; + /** 同一次一级 tab 停留内复用,避免为等弹窗空闲重复打 VIP_CONTENT_UPDATE */ + let vipContentUpdateGuideCache: Types.Payment.PaymentGuide | null = null; + + const releasePresentLockIfNeeded = () => { + if (!holdingPresentLock) return; + holdingPresentLock = false; + releasePaymentGuidePresentLock(); + }; + + const closeGuide = () => { + // 关弹窗:本地震框开关置 false(不改后端 show) + if (scene.value) turnOffPaymentGuideLocalSwitch(scene.value); + visible.value = false; + releasePresentLockIfNeeded(); + }; + + const reportImpression = async () => { + // 仅 VIP 上新弹窗上报展示回执,其它付费引导都不报 + if (!isVipContentUpdateScene(scene.value)) return; + const configId = guide.value?.configId; + if (!configId || !guide.value?.contentVersion) return; + + const payload: Types.Payment.GuideImpressionParams = { + configId, + scene: scene.value, + contentVersion: guide.value.contentVersion, + videoId: videoId.value || undefined, + requestId: createUuid(), + }; + + for (let attempt = 0; attempt < IMPRESSION_MAX_ATTEMPTS; attempt++) { + try { + await PaymentApi.reportGuideImpression(payload); + return; + } catch (e) { + if (attempt === IMPRESSION_MAX_ATTEMPTS - 1) { + console.log(e); + } + } + } + }; + + const presentGuide = async ( + nextGuide: Types.Payment.PaymentGuide, + targetScene: PaymentGuideScene, + targetVideoId: string, + canPresent?: () => boolean, + options?: { skipImpression?: boolean }, + ) => { + if (canPresent && !canPresent()) return false; + if (!tryAcquirePaymentGuidePresentLock()) return false; + holdingPresentLock = true; + + // 返回 / 会员中心 / 优惠倒计时:对齐 window 单例截止时间,并写入 durationSeconds + let guidePayload = nextGuide; + if ( + isDiscountCountdownScene(targetScene) || + targetScene === PaymentGuideScene.VIDEO_BACK || + targetScene === PaymentGuideScene.VIP_CENTER + ) { + ensureDiscountCountdownDeadlineMs(); + const remainingMs = getDiscountCountdownRemainingMs(); + guidePayload = { + ...nextGuide, + durationSeconds: remainingMs > 0 ? Math.max(1, Math.ceil(remainingMs / 1000)) : 0, + }; + } + + guide.value = guidePayload; + scene.value = targetScene; + videoId.value = targetVideoId; + visible.value = true; + // 展示回执要求弹窗已实际渲染 + await nextTick(); + if (canPresent && !canPresent()) { + visible.value = false; + releasePresentLockIfNeeded(); + return false; + } + + if (isDiscountCountdownScene(targetScene)) { + markDiscountCountdownShownThisSession(); + return true; + } + + // 免费次数引导 skipImpression:不上报,避免与其它场景频控互相污染 + if (!options?.skipImpression) { + reportImpression(); + } + return true; + }; + + /** + * @param canPresent 异步返回后是否仍应展示(如页面已失活则跳过,避免未看到却记已展示) + * @param options.skipImpression 跳过展示回执(免费次数引导);功能开关仍读 HOME_NEW_USER_FREE_TRIAL.show + */ + const tryShowGuide = async ( + targetScene: PaymentGuideScene, + targetVideoId?: string, + canPresent?: () => boolean, + options?: { skipImpression?: boolean }, + ) => { + const isVipUpdate = isVipContentUpdateScene(targetScene); + const isDiscount = isDiscountCountdownScene(targetScene); + const resolvedVideoId = targetVideoId || ''; + + try { + if (isVipUpdate) { + const result = await tryShowVipContentUpdate(canPresent, targetVideoId); + return result.shown; + } + + // 普通场景:只读 Ping 缓存,不发起 guide 查询 + const ping = getPaymentGuidePing(); + + if (options?.skipImpression) { + // 免费次数引导(HOME_NEW_USER_FREE_TRIAL):新用户可用、只拦会员、不上报;功能开关读本场景 show + if (shouldBlockPaymentGuideForMember()) return false; + if (ping?.enabled !== true) return false; + const targetSceneConfig = getPaymentGuideSceneConfig(targetScene); + if (!targetSceneConfig || targetSceneConfig.show !== true) return false; + const pickCardConfig = () => { + if (targetSceneConfig.enabled === true && targetSceneConfig.configId) return targetSceneConfig; + // 本场景可能只有开关无卡片,回退其它场景的会员卡文案/图 + const fallbacks = [ + PaymentGuideScene.VIDEO_PREVIEW_END, + PaymentGuideScene.HOME_OLD_USER, + PaymentGuideScene.VIP_CENTER, + PaymentGuideScene.VIDEO_BACK, + ]; + for (const scene of fallbacks) { + const cfg = getPaymentGuideSceneConfig(scene); + if (cfg?.enabled === true && cfg.configId) return cfg; + } + return null; + }; + const cardConfig = pickCardConfig(); + const nextGuide = cardConfig + ? toPaymentGuideFromSceneConfig(cardConfig, ping.segment) + : ({ show: true } as Types.Payment.PaymentGuide); + return presentGuide(nextGuide, targetScene, resolvedVideoId, canPresent, options); + } + + // 转化场景:非会员 + 注册≥24h(canShow 内也会再校验) + if (shouldBlockPaymentGuideByAudience(targetScene)) return false; + + // 旧逻辑误改本地 show 时,补一次后端配置恢复功能开关 + await healPaymentGuideShowFromServerIfNeeded(targetScene); + + const sceneConfig = getPaymentGuideSceneConfig(targetScene); + if (!sceneConfig) return false; + if (!canShowPaymentGuideFromPing(targetScene)) return false; + + if (isDiscount && !canShowDiscountCountdownThisSession()) return false; + + const nextGuide = toPaymentGuideFromSceneConfig(sceneConfig, ping?.segment); + // 返回引导 / 优惠倒计时 / 会员中心:倒计时剩余在 presentGuide 内统一注入 + if (isDiscount || targetScene === PaymentGuideScene.VIDEO_BACK || targetScene === PaymentGuideScene.VIP_CENTER) { + const remainingMs = getDiscountCountdownRemainingMs(); + // 会员中心优惠已结束则不再弹 + if (targetScene === PaymentGuideScene.VIP_CENTER && remainingMs <= 0) return false; + } + + return presentGuide(nextGuide, targetScene, resolvedVideoId, canPresent, options); + } catch (e) { + console.log(e); + return false; + } + }; + + /** + * VIP 上新:非会员 + 注册≥24h 才请求/展示;同一次访问内缓存接口结果。 + */ + const tryShowVipContentUpdate = async ( + canPresent?: () => boolean, + targetVideoId?: string, + ): Promise => { + try { + if (shouldBlockPaymentGuideByAudience(PaymentGuideScene.VIP_CONTENT_UPDATE)) { + return { fetched: false, shown: false, settled: true }; + } + + if (!vipContentUpdateGuideCache) { + vipContentUpdateGuideCache = await PaymentApi.getPaymentGuide({ + scene: PaymentGuideScene.VIP_CONTENT_UPDATE, + videoId: targetVideoId, + }); + } + + const res = vipContentUpdateGuideCache; + if (!res?.show || !shouldShowVipContentUpdateGuide(res)) { + return { fetched: true, shown: false, settled: true }; + } + + const shown = await presentGuide(res, PaymentGuideScene.VIP_CONTENT_UPDATE, targetVideoId || '', canPresent); + if (shown) { + markVipContentUpdateGuideShown(res); + return { fetched: true, shown: true, settled: true }; + } + return { fetched: true, shown: false, settled: false }; + } catch (e) { + console.log(e); + return { fetched: false, shown: false, settled: false }; + } + }; + + const resetVipContentUpdateCache = () => { + vipContentUpdateGuideCache = null; + }; + + return { + visible, + guide, + scene, + closeGuide, + tryShowGuide, + tryShowVipContentUpdate, + resetVipContentUpdateCache, + }; +}; diff --git a/src/hooks/usePaymentStatusDirectPay.ts b/src/hooks/usePaymentStatusDirectPay.ts new file mode 100644 index 0000000..d0f2161 --- /dev/null +++ b/src/hooks/usePaymentStatusDirectPay.ts @@ -0,0 +1,216 @@ +import { ref } from 'vue'; +import { showToast } from 'vant'; +import MineApi from '@/service/mine'; +import HomeApi from '@/service/home'; +import { useConfigStore } from '@/stores/config'; +import { useUserStore } from '@/stores/user'; +import { judgeTime } from '@/utils/index'; +import { pickDefaultVipCard } from '@/utils/vipCardSelection'; +import { parseVipProductResponse } from '@/utils/vipProductList'; +import { isVipExperimentActive } from '@/utils/vipProductCache'; +import { createUuid } from '@/utils/uuid'; + +type PresaleContext = { + isPayPresal: boolean; + payOrreserve: string; + showPresal: boolean; + activityDetail: Record; +}; + +export type DirectPayTrackingOptions = { + sourcePage?: Types.Recharge.PaySourcePage; + sourceRef?: string; + videoId?: string; + activityId?: string; +}; + +const flattenVipCards = ( + res: { list?: { position: string; list: Types.Recharge.VipItem[] }[]; daichong?: Types.Recharge.Daichong }, + options: { + includePresale?: boolean; + showPresal?: boolean; + activityDetailStatus?: number; + presaleActivityActive?: boolean; + } = {}, +) => parseVipProductResponse(res, options); + +const getVipPayAmount = (item: Types.Recharge.VipItem, presale: PresaleContext) => + item.productType == 21 ? (presale.isPayPresal ? item.balanceAmount : item.advanceAmount) : item.discountedPrice; + +const buildPayData = (item: Types.Recharge.VipItem, dcInfo: Types.Recharge.Daichong, presale: PresaleContext) => ({ + rechargeList: item.rchgType, + dcInfo, + popType: 'vip', + productType: item.productType, + productID: item.productID, + dcType: 1, + buyType: 4, + discountedPrice: getVipPayAmount(item, presale) / 10, + isAmountPay: item.isAmountPay, + finalPayStatus: item.productType == 21 ? presale.isPayPresal : null, + isUpgrade: !!item.isUpgrade, +}); + +const fetchPresaleContext = async (activityStatus?: boolean): Promise => { + const presale: PresaleContext = { + isPayPresal: false, + payOrreserve: '', + showPresal: true, + activityDetail: {}, + }; + if (!activityStatus) return presale; + + try { + const res: any = await HomeApi.getPresaleList({ pageNumber: 1, pageSize: 1 }); + presale.activityDetail = res.activityDetail || {}; + if (presale.activityDetail.status == 2 || presale.activityDetail.status == 3) { + presale.payOrreserve = judgeTime(presale.activityDetail.startTime) ? 'pay' : 'wait'; + } + const diffTime = (new Date(presale.activityDetail.endTime).getTime() - Date.now()) / 1000; + if (diffTime < 0) { + presale.showPresal = false; + } + presale.isPayPresal = !!presale.activityDetail.balancePayment; + } catch (error) { + console.error('fetchPresaleContext failed:', error); + } + return presale; +}; + +type DirectPayContext = { + card: Types.Recharge.VipItem; + payData: ReturnType; + presale: PresaleContext; + /** 该卡实际支付金额(元) */ + amount: number; + /** VIP 套餐 A/B 实验字段,打开收银台时写入追踪 */ + productMeta: Pick; +}; + +/** 付费分层:点击后直接调起 RechargeBox 支付 */ +export const usePaymentStatusDirectPay = (tracking: DirectPayTrackingOptions = {}) => { + const configStore = useConfigStore(); + const userStore = useUserStore(); + const rechargeBoxRef = ref<{ changeItem: (payData: Record) => void }>(); + const isRecharge = ref(false); + const sessionId = ref(createUuid()); + let cachedContext: { vipCardId: string; context: DirectPayContext } | null = null; + + const resolveContext = async (vipCardId = ''): Promise => { + const presale = await fetchPresaleContext(configStore.appConfig.advanceStatus?.activityStatus); + const res: any = await MineApi.queryVipProduct(); + const { cards, dcInfo } = flattenVipCards(res, { + includePresale: true, + presaleActivityActive: !!configStore.appConfig.advanceStatus?.activityStatus, + showPresal: presale.showPresal, + activityDetailStatus: presale.activityDetail?.status, + }); + if (!cards.length) return null; + + const card = pickDefaultVipCard({ + cards, + paymentStatus: configStore.appConfig?.paymentStatusPopup, + configuredVipCardId: configStore.appConfig?.paymentStatusPopupConfig?.vipCard, + explicitVipCardId: vipCardId || undefined, + defaultProductId: res?.defaultProductId || undefined, + userInfo: userStore.userInfo, + presale: { isPayPresal: presale.isPayPresal }, + }); + if (!card) return null; + + return { + card, + payData: buildPayData(card, dcInfo, presale), + presale, + amount: getVipPayAmount(card, presale) / 10, + productMeta: isVipExperimentActive(res) + ? { + experimentId: res.experimentId || undefined, + experimentVariant: res.variant || undefined, + } + : {}, + }; + }; + + const buildTrackingFields = ( + productMeta: DirectPayContext['productMeta'] = {}, + override: DirectPayTrackingOptions = {}, + ): Types.Recharge.PayTrackingFields => { + const sourcePage = override.sourcePage || tracking.sourcePage || 'UNKNOWN'; + const sourceRef = override.sourceRef || tracking.sourceRef; + const videoId = override.videoId || tracking.videoId; + const activityId = override.activityId || tracking.activityId; + const fields: Types.Recharge.PayTrackingFields = { + sourcePage, + sessionId: sessionId.value, + }; + if (sourceRef) fields.sourceRef = sourceRef; + if (videoId) fields.videoId = videoId; + if (activityId) fields.activityId = activityId; + if (productMeta.experimentId) fields.experimentId = productMeta.experimentId; + if (productMeta.experimentVariant) fields.experimentVariant = productMeta.experimentVariant; + return fields; + }; + + /** 预取会员卡,供弹窗在展示阶段渲染价格;结果会被随后的 openDirectPay 复用 */ + const prepareCard = async (vipCardId = ''): Promise => { + try { + const context = await resolveContext(vipCardId); + cachedContext = context ? { vipCardId, context } : null; + return context; + } catch (error) { + console.error('prepareCard failed:', error); + cachedContext = null; + return null; + } + }; + + const openDirectPay = async (vipCardId = '', trackingOverride: DirectPayTrackingOptions = {}) => { + try { + const context = cachedContext?.vipCardId === vipCardId ? cachedContext.context : await resolveContext(vipCardId); + if (!context) { + showToast('暂无可用会员卡'); + return; + } + const { payData, presale, productMeta } = context; + + if (payData.productType == 21 && presale.payOrreserve == 'wait') { + showToast('尾款支付暂未开放,请您耐心等待~'); + return; + } + if (payData.productType == 21 && presale.activityDetail.status == 4) { + showToast('尾款已支付,请勿重复购买~'); + return; + } + if (payData.productType == 21 && !presale.showPresal) { + showToast('活动已结束'); + return; + } + + rechargeBoxRef.value?.changeItem({ + ...payData, + ...buildTrackingFields(productMeta, trackingOverride), + }); + isRecharge.value = true; + } catch (error) { + console.error('openDirectPay failed:', error); + } + }; + + const handlePaySuccess = () => { + isRecharge.value = false; + }; + + const handleClosePay = () => { + isRecharge.value = false; + }; + + return { + rechargeBoxRef, + isRecharge, + prepareCard, + openDirectPay, + handlePaySuccess, + handleClosePay, + }; +}; diff --git a/src/hooks/useVipContentUpdateGuideOnMainTabs.ts b/src/hooks/useVipContentUpdateGuideOnMainTabs.ts new file mode 100644 index 0000000..61c8a93 --- /dev/null +++ b/src/hooks/useVipContentUpdateGuideOnMainTabs.ts @@ -0,0 +1,184 @@ +import { onActivated, onDeactivated, onMounted, onUnmounted, watch } from 'vue'; +import { useRoute } from 'vue-router'; +import { PaymentGuideScene } from '@/enums/home'; +import { usePaymentGuide } from '@/hooks/usePaymentGuide'; +import { turnOnPaymentGuideLocalSwitch } from '@/utils/paymentGuideLocalSwitch'; + +/** 底部 Tab 对应的一级路由 name(与 TabBar / permission mainViewKeep 对齐) */ +export const MAIN_TAB_ROUTE_NAMES = new Set([ + 'home', + 'shortVideo', + 'darkNet', + 'aiUndress2', + 'community', + 'mine', +]); + +/** 冷启动首进满 3 分钟后再请求;过后进任意一级 tab 立刻请求(进程内共享) */ +const VIP_CONTENT_FIRST_DELAY_MS = 3 * 60 * 1000; +let vipContentFirstDelayDone = false; +let vipContentFirstDelayTimer: number | null = null; + +export const useVipContentUpdateGuideOnMainTabs = () => { + const route = useRoute(); + const { + visible, + guide, + scene, + closeGuide, + tryShowVipContentUpdate, + resetVipContentUpdateCache, + } = usePaymentGuide(); + + let tabPageActive = false; + let visitToken = 0; + let settledThisVisit = false; + let requesting = false; + let pollTimer: number | null = null; + let lastMarkVisitAt = 0; + + const isMainTabRoute = (name: unknown) => typeof name === 'string' && MAIN_TAB_ROUTE_NAMES.has(name); + + const canPresent = () => tabPageActive && isMainTabRoute(route.name) && !document.hidden; + + const stopPolling = () => { + if (pollTimer == null) return; + window.clearInterval(pollTimer); + pollTimer = null; + }; + + const tryShow = async () => { + if (!vipContentFirstDelayDone) return; + if (settledThisVisit || requesting) return; + if (!canPresent()) return; + + const token = visitToken; + requesting = true; + try { + const result = await tryShowVipContentUpdate(canPresent); + if (token !== visitToken || !tabPageActive) return; + if (result.settled) { + settledThisVisit = true; + stopPolling(); + return; + } + startPresentPolling(); + } finally { + requesting = false; + } + }; + + const startPresentPolling = () => { + if (settledThisVisit || pollTimer != null) return; + pollTimer = window.setInterval(() => { + void tryShow(); + }, 2000); + }; + + const runGuides = () => { + if (!tabPageActive || !vipContentFirstDelayDone) return; + void tryShow(); + }; + + const scheduleFirstDelay = () => { + if (vipContentFirstDelayDone || vipContentFirstDelayTimer != null) return; + vipContentFirstDelayTimer = window.setTimeout(() => { + vipContentFirstDelayTimer = null; + vipContentFirstDelayDone = true; + // 首计时结束时若不在一级页:只打标,等回到 MainView(onActivated / 路由)再请求 + if (!tabPageActive || !isMainTabRoute(route.name)) return; + settledThisVisit = false; + resetVipContentUpdateCache(); + runGuides(); + }, VIP_CONTENT_FIRST_DELAY_MS); + }; + + const markTabVisit = () => { + if (!isMainTabRoute(route.name)) { + leaveTab(); + return; + } + + const now = Date.now(); + // onActivated 与 route watch 可能同帧双触发,300ms 内合并为一次 + if (now - lastMarkVisitAt < 300) return; + lastMarkVisitAt = now; + + tabPageActive = true; + turnOnPaymentGuideLocalSwitch(PaymentGuideScene.VIP_CONTENT_UPDATE); + + // 切换一级 tab 时若弹窗已在展示,不打断、不重拉 + if (visible.value) { + settledThisVisit = true; + stopPolling(); + return; + } + + visitToken += 1; + settledThisVisit = false; + resetVipContentUpdateCache(); + stopPolling(); + if (!vipContentFirstDelayDone) { + scheduleFirstDelay(); + } + runGuides(); + }; + + const leaveTab = () => { + tabPageActive = false; + stopPolling(); + if (visible.value) closeGuide(); + }; + + const onVisibilityChange = () => { + if (document.hidden) return; + if (!tabPageActive || !isMainTabRoute(route.name)) return; + if (!vipContentFirstDelayDone || settledThisVisit) return; + void tryShow(); + }; + + onMounted(() => { + document.addEventListener('visibilitychange', onVisibilityChange); + // 非 keep-alive 场景兜底;keep-alive 首挂会紧接着 onActivated,300ms 去重 + markTabVisit(); + }); + + // MainView 在 App keep-alive 中:进详情不会 onUnmounted,回一级页也不会再 onMounted, + // 必须用 onActivated 补 mark(与首页吸底引导同模式) + onActivated(() => { + markTabVisit(); + }); + + onDeactivated(() => { + leaveTab(); + }); + + onUnmounted(() => { + document.removeEventListener('visibilitychange', onVisibilityChange); + leaveTab(); + stopPolling(); + // 不 clear 首进 3 分钟计时器:MainView 短暂卸载后仍应按冷启动窗口继续计时 + }); + + // 一级 tab 互切时 MainView 不会 deactivate,靠路由兜底; + // 嵌套 keep-alive 下偶发不触发 onActivated 时同样兜底 + watch( + () => route.name, + () => { + markTabVisit(); + }, + ); + + watch(visible, (show) => { + if (!show && tabPageActive && !settledThisVisit) { + void tryShow(); + } + }); + + return { + visible, + guide, + scene, + closeGuide, + }; +}; diff --git a/src/hooks/useVipPayContext.ts b/src/hooks/useVipPayContext.ts new file mode 100644 index 0000000..a4952ae --- /dev/null +++ b/src/hooks/useVipPayContext.ts @@ -0,0 +1,77 @@ +import { ref } from 'vue'; +import { isVipExperimentActive } from '@/utils/vipProductCache'; +import { createUuid } from '@/utils/uuid'; + +type PaySourcePage = Types.Recharge.PaySourcePage; + +export type UseVipPayContextOptions = { + /** 支持函数以便从路由 query 动态读取(如首页浮窗 HOME_FLOAT_WINDOW) */ + sourcePage: PaySourcePage | (() => PaySourcePage); + sourceRef?: string | (() => string | undefined); + videoId?: string | (() => string | undefined); + /** 短剧整部 ID */ + mediaId?: string | (() => string | undefined); + /** 短剧当前子集 ID */ + contentId?: string | (() => string | undefined); + activityId?: string | (() => string | undefined); +}; + +/** + * 会员中心 VIP 套餐 A/B 上下文:实验字段缓存、下单来源字段组装。 + * experimentStatus !== ACTIVE 时:/mine/topay 不传实验字段。 + */ +export function useVipPayContext(options: UseVipPayContextOptions) { + const experimentId = ref(''); + const variant = ref(''); + const defaultProductId = ref(''); + const sessionId = ref(createUuid()); + /** 默认关闭,等 applyVipProductMeta 确认 ACTIVE 后再开启 */ + const experimentActive = ref(false); + + const applyVipProductMeta = (res: Types.Recharge.VipProductResponse) => { + experimentActive.value = isVipExperimentActive(res); + experimentId.value = experimentActive.value ? res.experimentId || '' : ''; + variant.value = experimentActive.value ? res.variant || '' : ''; + defaultProductId.value = res.defaultProductId || ''; + }; + + const resolveSourcePage = (): PaySourcePage => + typeof options.sourcePage === 'function' ? options.sourcePage() : options.sourcePage; + + const resolveOptionalString = (value?: string | (() => string | undefined)) => { + if (typeof value === 'function') return value()?.trim() || ''; + return String(value || '').trim(); + }; + + const getPayTrackingFields = (): Types.Recharge.PayTrackingFields => { + const fields: Types.Recharge.PayTrackingFields = { + sourcePage: resolveSourcePage(), + sessionId: sessionId.value, + }; + const sourceRef = resolveOptionalString(options.sourceRef); + const videoId = resolveOptionalString(options.videoId); + const mediaId = resolveOptionalString(options.mediaId); + const contentId = resolveOptionalString(options.contentId); + const activityId = resolveOptionalString(options.activityId); + if (sourceRef) fields.sourceRef = sourceRef; + if (videoId) fields.videoId = videoId; + if (mediaId) fields.mediaId = mediaId; + if (contentId) fields.contentId = contentId; + if (activityId) fields.activityId = activityId; + if (experimentActive.value) { + if (experimentId.value) fields.experimentId = experimentId.value; + if (variant.value) fields.experimentVariant = variant.value; + } + return fields; + }; + + return { + experimentId, + variant, + defaultProductId, + sessionId, + experimentActive, + applyVipProductMeta, + getPayTrackingFields, + }; +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..8329a08 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,61 @@ +import { createApp } from 'vue'; +import './permission'; +import '@/assets/css/reset.css'; +import '@/assets/css/vant.css'; +// 函数式 API / 插件不走 unplugin 按需样式,入口补齐;组件样式由 VantResolver 按需引入 +import 'vant/es/toast/style'; +import 'vant/es/dialog/style'; +import 'vant/es/lazyload/style'; +import router from './router'; +import App from './App.vue'; +import store from './stores'; +import 'virtual:svg-icons-register'; +import svgIcon from '@/components/SvgIcon/index.vue'; +import { Lazyload } from 'vant'; +import qrcodeVue from 'qrcode.vue'; +import * as devtoolsDetector from 'devtools-detector'; +import '@/assets/theme/index.scss'; + +const getQuueryVariable = (val: string) => { + const query = window.location.search.substring(1); + const vars = query.split('&'); + for (let i = 0; i < vars.length; i++) { + const pair = vars[i].split('='); + if (pair[0] == val) { + return pair[1]; + } + } + return false; +}; +devtoolsDetector.addListener((isOpen) => { + if (isOpen) { + window.location.replace('https://www.baidu.com'); + } +}); +const devTest = getQuueryVariable('devTest') || sessionStorage.getItem('devTest'); +if (getQuueryVariable('devTest')) { + sessionStorage.setItem('devTest', 'devTest'); +} +if (!devTest && process.env.NODE_ENV == 'production') { + devtoolsDetector.launch(); +} +const app = createApp(App); +app.use(store); +app.use(router); +app.component('SvgIcon', svgIcon); +app.component('QrcodeVue', qrcodeVue); + +app.use(Lazyload, { + lazyComponent: true, + observer: true, +}); + +// 本地开发:图床防盗链拒绝 localhost Referer;对未走解密直出的 img 也去掉 Referer +if (import.meta.env.DEV && !document.querySelector('meta[name="referrer"]')) { + const meta = document.createElement('meta'); + meta.name = 'referrer'; + meta.content = 'no-referrer'; + document.head.appendChild(meta); +} + +app.mount('#app'); diff --git a/src/permission.ts b/src/permission.ts new file mode 100644 index 0000000..ec8604e --- /dev/null +++ b/src/permission.ts @@ -0,0 +1,308 @@ +/* eslint-disable prettier/prettier */ +import router from './router'; +import { useGlobalStore } from './stores/global'; + +//全局路由导航 +router.beforeEach(async (to, from, next) => { + try { + const globalStore = useGlobalStore(); + //缓存组件(单页面不包含tab) + const keepAliveMap = new Map(); + //首页tab缓存 + const mainViewKeep = new Map(); + /********************************** 单页面缓存面缓存 ************************************/ + keepAliveMap.set('mainView', 'mainView'); + keepAliveMap.set('publishGraphics', 'publishGraphics'); // 发布图文页面缓存 + keepAliveMap.set('publishVideo', 'publishVideo'); // 发布视频页面缓存 + keepAliveMap.set('pubilshImg', 'pubilshImg'); // 发布视频页面缓存 + keepAliveMap.set('movieDetails', 'movieDetails'); // 视频详情页面缓存 + keepAliveMap.set('wallet', 'wallet'); // 金币充值 + keepAliveMap.set('member', 'member'); // 会员充值 + keepAliveMap.set('searchResults', 'searchResults'); // 搜索结果页 + keepAliveMap.set('tagShortVideo', 'tagShortVideo'); // 标签页缓存 + keepAliveMap.set('tagVideoList', 'tagVideoList'); + keepAliveMap.set('collectVideo', 'collectVideo'); // 收藏 + keepAliveMap.set('searchPage', 'searchPage'); // 搜索 + keepAliveMap.set('purchasedVideo', 'purchasedVideo'); // 解锁视频 + keepAliveMap.set('follow', 'follow'); // 我的关注 + keepAliveMap.set('historyRecord', 'historyRecord'); // 历史记录 + keepAliveMap.set('userInfo', 'userInfo'); //用户信息界面 + keepAliveMap.set('postDetail', 'postDetail'); //帖子详情 + keepAliveMap.set('communityTagDeatil', 'communityTagDeatil'); //标签帖子 + // keepAliveMap.set('messageCenter', 'messageCenter');//消息中心 + keepAliveMap.set('minepostpage', 'minepostpage'); //我的帖子 + keepAliveMap.set('aiUndress', 'aiUndress'); //ai科技 + keepAliveMap.set('aiRecord', 'aiRecord'); //AI记录 + keepAliveMap.set('presale', 'presale'); //预售 + keepAliveMap.set('freeBenefits', 'freeBenefits'); // 免费福利缓存 + keepAliveMap.set('jointGamingActivitie', 'jointGamingActivitie'); // 游戏活动 + keepAliveMap.set('messageCenter', 'messageCenter'); // 消息中心 + keepAliveMap.set('vidDiscount', 'vidDiscount'); // 视频折扣专区 + keepAliveMap.set('AiGirlFriend', 'AiGirlFriend'); + keepAliveMap.set('liveRoom', 'liveRoom'); //直播间 + keepAliveMap.set('coverPage', 'coverPage'); //套图站 + keepAliveMap.set('coverPreview', 'coverPreview'); //套图预览 + keepAliveMap.set('coverDetail', 'coverDetail'); //图组详情页 + keepAliveMap.set('myLike', 'myLike'); //我的点赞 + keepAliveMap.set('AcgTopicList', 'AcgTopicList'); //acg专题列表 + keepAliveMap.set('AcgTextDetail', 'AcgTextDetail'); //Acg小说详情 + keepAliveMap.set('AcgTextDetailWatch0', 'AcgTextDetailWatch0'); //Acg小说详情 + keepAliveMap.set('AcgTextDetailWatch1', 'AcgTextDetailWatch1'); //Acg小说详情 + keepAliveMap.set('AcgImageDetail', 'AcgImageDetail'); //Acg漫画详情 + keepAliveMap.set('AcgImageDetailWatch', 'AcgImageDetailWatch'); //Acg漫画阅页 + keepAliveMap.set('AcgVideoDetail', 'AcgVideoDetail'); //Acg动漫详情 + keepAliveMap.set('gameTagDetails', 'gameTagDetails'); //游戏标签详情页 + keepAliveMap.set('gameDetails', 'gameDetails'); //游戏详情页 + keepAliveMap.set('shortVideoDetails', 'shortVideoDetails'); //短视频详情 + keepAliveMap.set('shortDramaTag', 'shortDramaTag'); //短剧标签详情 + keepAliveMap.set('shortDramaPlay', 'shortDramaPlay'); //短剧播放页 + keepAliveMap.set('moreCate', 'moreCate'); // 片库 + keepAliveMap.set('rankingList', 'rankingList'); // 热门排行 + keepAliveMap.set('task_sign_day', 'task_sign_day'); // 每日签到 + /********************************** TAB页面缓存 ************************************/ + mainViewKeep.set('worksManage', 'worksManage'); // 作品管理缓存 + mainViewKeep.set('home', 'home'); // 首页页面缓存 + mainViewKeep.set('community', 'community'); // 社区页面缓存 + mainViewKeep.set('mine', 'mine'); // 我的页面缓存 + mainViewKeep.set('darkNet', 'darkNet'); // 暗网页面缓存 + mainViewKeep.set('shortVideo', 'shortVideo'); //抖音 + mainViewKeep.set('aiUndress2', 'aiUndress2'); //AI科技 + if ( + (from.path == '/movieDetails' && to.path == '/home') || + (from.path == '/movieDetails' && to.path == '/darkNet') || + (from.path == '/movieDetails' && to.path == '/collectVideo') || + (from.path == '/movieDetails' && to.path == '/searchPage') || + (from.path == '/movieDetails' && to.path == '/searchResults') || + (from.path == '/movieDetails' && to.path == '/historyRecord') || + (from.path == '/movieDetails' && to.path == '/purchasedVideo') || + (from.path == '/home' && to.path == '/movieDetails') || + (from.path == '/darkNet' && to.path == '/movieDetails') || + (from.path == '/movieDetails' && to.path == '/buyVideo') || + (from.path == '/movieDetails' && to.path == '/tagShortVideo') || + (from.path == '/movieDetails' && to.path == '/postDetail') || + (from.path == '/movieDetails' && to.path == '/presale') || + (from.path == '/movieDetails' && to.path == '/freeBenefits') || + (from.path == '/movieDetails' && to.path == '/vidDiscount') + ) { + keepAliveMap.delete('movieDetails'); + } + if (from.path == '/collectVideo' && to.path == '/mine') { + keepAliveMap.delete('collectVideo'); + } + if (from.path == '/purchasedVideo' && to.path == '/mine') { + keepAliveMap.delete('purchasedVideo'); + } + if (from.path == '/myLike' && to.path == '/mine') { + keepAliveMap.delete('myLike'); + } + if (from.path == '/follow' && to.path == '/mine') { + keepAliveMap.delete('follow'); + } + if ( + (from.path == '/searchPage' && to.path == '/home') || + (from.path == '/searchPage' && to.path == '/darkNet') || + (from.path == '/searchPage' && to.path == '/community') + ) { + keepAliveMap.delete('searchPage'); + } + if (from.path == '/wallet' && to.path == '/mine') { + keepAliveMap.delete('wallet'); + } + if (from.path == '/member' && (to.path == '/mine' || to.path == '/home' || to.path == '/darkNet' || to.path == '/AcgImageDetail' || to.path == '/AcgImageDetailWatch' || to.path == '/AcgTextDetail' || to.path == '/AcgTextDetailWatch0' || to.path == '/AcgTextDetailWatch1' || to.path == '/AcgVideoDetail' || to.path == '/liveRoom')) { + keepAliveMap.delete('member'); + } + if (from.path == '/historyRecord' && to.path == '/mine') { + keepAliveMap.delete('historyRecord'); + } + if (from.path == '/tagShortVideo' && (to.path == '/home' || to.path == '/darkNet' || to.path == '/moreActress')) { + keepAliveMap.delete('tagShortVideo'); + } + // 短剧标签详情:进播放页保留;回到短视频 Tab / 其它一级页时清缓存 + if ( + from.path == '/shortDramaTag' && + (['/shortVideo', '/shortDramaPlay', '/historyRecord', '/collectVideo', '/purchasedVideo', '/myLike'].includes(to.path)) + ) { + keepAliveMap.delete('shortDramaTag'); + } + /** + * 短剧播放页缓存(单实例,不按剧 id 区分 key): + * - 仅当从播放页内跳出的二级页(客服 / 余额明细 / 评论跳的用户主页、图片预览、影片详情) + * 返回时保留缓存,恢复剧集与播放进度; + * - 其余入口(列表选剧 / 广告 / 深链等)一律清缓存重挂载,避免恢复出上一部剧; + * - 回到 Tab / 列表页即销毁,避免播放器实例驻留内存。 + */ + const dramaPlaySecondary = [ + '/transactionRecord', + '/customerService', + '/userInfo', + '/picturePreview', + '/movieDetails', + ]; + if (to.path == '/shortDramaPlay' && !dramaPlaySecondary.includes(from.path)) { + keepAliveMap.delete('shortDramaPlay'); + } + if ( + ['/shortVideo', '/shortDramaTag', '/historyRecord', '/collectVideo', '/purchasedVideo', '/myLike', '/mine', '/home', '/community', '/darkNet'].includes(to.path) + ) { + keepAliveMap.delete('shortDramaPlay'); + } + if (from.path == '/publishGraphics' && to.path == '/community') { + keepAliveMap.delete('publishGraphics'); + } + if (from.path == '/publishVideo' && to.path == '/community') { + keepAliveMap.delete('publishVideo'); + } + if (from.path == '/pubilshImg' && to.path == '/community') { + keepAliveMap.delete('pubilshImg'); + } + if ( + from.path == '/postDetail' && + (to.path == '/community' || + to.path == '/communityTagDeatil' || + to.path == '/collectVideo' || + to.path == '/searchResults' || + to.path == '/purchasedVideo' || + to.path == '/minepostpage' || + to.path == '/userInfo') + ) { + keepAliveMap.delete('postDetail'); + } + if ( + [ + '/community', + '/collectVideo', + '/searchResults', + '/purchasedVideo', + '/minepostpage', + '/follow', + '/myLike', + ].includes(to.path) + ) { + keepAliveMap.delete('userInfo'); + keepAliveMap.delete('shortVideoDetails'); + keepAliveMap.delete('movieDetails'); + keepAliveMap.delete('AcgVideoDetail'); + } + if (['/searchPage', '/shortVideo', '/searchResults'].includes(to.path)) { + keepAliveMap.delete('tagVideoList'); + keepAliveMap.delete('shortVideoDetails'); + } + if (to.path == '/searchPage') { + keepAliveMap.delete('searchResults'); + keepAliveMap.delete('moreCate'); + } + if (['/searchResults'].includes(to.path)) { + keepAliveMap.delete('moreCate'); + } + if (['/moreCate'].includes(to.path)) { + keepAliveMap.delete('movieDetails'); + keepAliveMap.delete('shortVideoDetails'); + keepAliveMap.delete('AcgVideoDetail'); + keepAliveMap.delete('AcgImageDetail'); + keepAliveMap.delete('coverPreview'); + keepAliveMap.delete('postDetail'); + } + if ( + from.path == '/communityTagDeatil' && + (to.path == '/community' || + to.path == '/follow' || + to.path == '/postDetail' || + to.path == '/userInfo' || + to.path == '/collectVideo' || + to.path == '/purchasedVideo' || + to.path == '/minepostpage' || + to.path == '/searchResults') + ) { + keepAliveMap.delete('communityTagDeatil'); + } + // if (from.path == '/messageCenter' && (to.path == '/mine')) { + // keepAliveMap.delete('messageCenter'); + // } + if (from.path == '/minepostpage' && to.path == '/mine') { + keepAliveMap.delete('minepostpage'); + } + if (from.path == '/aiUndress' && to.path == '/mine') { + keepAliveMap.delete('aiUndress'); + } + if (from.path == '/presale' && !to.query.fromPersale) { + keepAliveMap.delete('presale'); + } + if ( + from.path == '/freeBenefits' && + (to.path == '/mine' || + to.path == '/home' || + to.path == '/darkNet' || + to.path == '/community' || + to.path == '/wallet') + ) { + keepAliveMap.delete('freeBenefits'); + } + if (to.path === '/freeBenefits') { + keepAliveMap.delete('vidDiscount'); + } + if (from.path == '/jointGamingActivitie' && !to.query.fromGamePage) { + keepAliveMap.delete('jointGamingActivitie'); + } + if (['/mine','/home','/community'].includes(to.path)) { + keepAliveMap.delete('messageCenter'); + keepAliveMap.delete('task_sign_day'); + } + + if (to.path === '/messageCenter') { + keepAliveMap.delete('movieDetails'); + keepAliveMap.delete('postDetail'); + } + if (['/community','/searchResults'].includes(to.path)) { + keepAliveMap.delete('coverPage'); + keepAliveMap.delete('coverDetail'); + keepAliveMap.delete('coverPreview'); + } + // 图组预览 + if (to.path == '/coverDetail') { + keepAliveMap.delete('coverPreview'); + } + + //AI脱衣 + if (['/mine'].includes(to.path)) { + keepAliveMap.delete('aiUndress2'); + keepAliveMap.delete('AiGirlFriend'); + } + if (to.path == '/aiUndress2') { + keepAliveMap.delete('aiRecord'); + } + + //直播 + if (['/live'].includes(to.path)) { + keepAliveMap.delete('liveRoom'); + } + + //acg + if (['/home', '/AcgTopicList', '/community'].includes(to.path)) { + keepAliveMap.delete('AcgImageDetail'); + keepAliveMap.delete('AcgImageDetailWatch'); + keepAliveMap.delete('AcgTextDetail'); + keepAliveMap.delete('AcgTextDetailWatch0'); + keepAliveMap.delete('AcgTextDetailWatch1'); + keepAliveMap.delete('AcgVideoDetail'); + keepAliveMap.delete('liveRoom'); + } + if (['/home', '/community'].includes(to.path)) { + keepAliveMap.delete('AcgTopicList'); + } + if (to.path == '/AcgImageDetail') { + keepAliveMap.delete('AcgImageDetailWatch'); + } + if (to.path == '/AcgTextDetail') { + keepAliveMap.delete('AcgTextDetailWatch0'); + } + + const keepAliveList = [...keepAliveMap.values()]; + globalStore.saveKeepAliveList(keepAliveList); + + const mainViewKeepList = [...mainViewKeep.values()]; + globalStore.saveMainViewKeep(mainViewKeepList); + } catch (e) { + console.log(e); + } + next(); +}); diff --git a/src/plugins/device-metadata.ts b/src/plugins/device-metadata.ts new file mode 100644 index 0000000..9e387b1 --- /dev/null +++ b/src/plugins/device-metadata.ts @@ -0,0 +1,104 @@ +import type { App } from 'vue'; + +export type DeviceMetadata = { + device_brand: string; + device_model: string; + system_name: string; + system_version: string; +}; + +export function resolveDeviceMetadata(): DeviceMetadata { + const ua = navigator.userAgent || ''; + const nav = navigator as Navigator & { + userAgentData?: { + platform?: string; + platformVersion?: string; + model?: string; + brands?: Array<{ brand?: string }>; + }; + }; + const uaData = nav.userAgentData; + + // 兼容 App/WebView 自定义 UA:xxx;SysType=android;DevType=HUAWEI mate80;... + const customSysType = ua.match(/(?:^|[;,\s])SysType=([^;,\s]+)/i)?.[1] || ''; + const customDevType = ua.match(/(?:^|[;,\s])DevType=([^;]+?)(?:[;,]|$)/i)?.[1]?.trim() || ''; + + const androidMatch = ua.match(/Android\s([\d.]+)/i); + const iosMatch = ua.match(/OS\s([\d_]+)\s+like\s+Mac\s+OS\s+X/i); + const huaweiModelMatch = ua.match(/\b(HUAWEI|HONOR)[\s\-_/]+([A-Za-z0-9\-_.]+)/i); + const genericAndroidModelMatch = ua.match(/;\s([A-Za-z0-9\-_.\s]{2,40})\sBuild\//i)?.[1]?.trim() || ''; + const modelToken = customDevType || uaData?.model || genericAndroidModelMatch || ''; + + let system_name = ''; + let system_version = ''; + if (customSysType) { + system_name = /ios/i.test(customSysType) ? 'iOS' : /android/i.test(customSysType) ? 'Android' : customSysType; + } else if (androidMatch) { + system_name = 'Android'; + system_version = androidMatch[1] || ''; + } else if (iosMatch) { + system_name = 'iOS'; + system_version = (iosMatch[1] || '').replace(/_/g, '.'); + } else if (uaData?.platform) { + system_name = uaData.platform; + system_version = uaData.platformVersion || ''; + } + + let device_brand = ''; + let device_model = ''; + if (huaweiModelMatch) { + device_brand = (huaweiModelMatch[1] || '').toUpperCase(); + device_model = huaweiModelMatch[2] || ''; + } else if (modelToken) { + const token = modelToken.trim(); + device_model = token; + const brandMatch = token.match(/^(HUAWEI|HONOR|XIAOMI|REDMI|OPPO|VIVO|SAMSUNG|ONEPLUS|REALME)\b/i); + if (brandMatch) { + device_brand = brandMatch[1].toUpperCase(); + device_model = token.replace(brandMatch[0], '').trim() || token; + } + } else if (uaData?.brands?.length) { + const preferred = uaData.brands.find((item) => item?.brand && !/Not/i.test(item.brand || ''))?.brand || ''; + if (preferred) device_brand = preferred; + } + + // WebView/iOS 场景下 UA 常常不含具体机型,这里做非空兜底 + if (!device_model) { + const platformModel = (navigator.platform || '').trim(); + if (platformModel && !/MacIntel/i.test(platformModel)) { + device_model = platformModel; + } else if (system_name === 'iOS') { + device_model = 'iPhone'; + } else if (system_name === 'Android') { + device_model = 'Android'; + } else { + device_model = 'unknown'; + } + } + + if (!device_brand) { + if (/iPhone|iPad|iPod/i.test(device_model) || system_name === 'iOS') { + device_brand = 'APPLE'; + } else if (system_name === 'Android') { + device_brand = 'ANDROID'; + } else { + device_brand = 'UNKNOWN'; + } + } + + return { + device_brand, + device_model, + system_name, + system_version, + }; +} + +const deviceMetadataPlugin = { + install(app: App) { + app.config.globalProperties.$deviceMeta = resolveDeviceMetadata; + app.provide('deviceMeta', resolveDeviceMetadata); + }, +}; + +export default deviceMetadataPlugin; diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..74ce7b0 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,946 @@ +import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'; + +//启动页(入口同步,保证首屏立刻有壳) +import Splash from '@/views/Splash.vue'; + +//首页相关路由 +const homeCollection: RouteRecordRaw[] = [ + { + path: '/activityWeb', //外网活动内嵌页(inner=1) + name: 'activityWeb', + component: () => import('@/views/activityWeb/index.vue'), + meta: { + pageKey: 'activity_web', + pageName: '活动内嵌页', + }, + }, + { + path: '/presale', //预售页面 + name: 'presale', + component: () => import('@/views/lldpresale/index.vue'), + meta: { + pageKey: 'presale', + pageName: '预售页面', + }, + }, + { + path: '/searchPage', //搜索页 + name: 'SearchPage', + component: () => import('@/views/lldhome/searchPage/index.vue'), + meta: { + pageKey: 'search', + pageName: '搜索页', + }, + }, + { + path: '/searchResults', //搜索结果页 + name: 'SearchResults', + component: () => import('@/views/lldhome/searchResults/index.vue'), + meta: { + pageKey: 'search_results', + pageName: '搜索结果页', + }, + }, + { + path: '/moreCate', // 片库 + name: 'moreCate', + component: () => import('@/views/lldhome/moreCate/index.vue'), + meta: { + pageKey: 'more_cate', + pageName: '片库', + }, + }, + { + path: '/movieDetails', //影视详情 + name: 'MovieDetails', + component: () => import('@/views/lldhome/movie/details.vue'), + meta: { + pageKey: 'video_play', + pageName: '视频播放页', + }, + }, + { + path: '/tagShortVideo', //专题短视频列表 + name: 'tagShortVideo', + component: () => import('@/views/lldhome/tagShortVideo/index.vue'), + meta: { + pageKey: 'topic_detail', + pageName: '专题详情页', + }, + }, + { + path: '/shortVideoDetails', //短视频详情 + name: 'shortVideoDetails', + component: () => import('@/views/lldhome/shortVideoDetails/index.vue'), + meta: { + pageKey: 'shortvideo_play', + pageName: '短视频播放页', + }, + }, + { + path: '/shortDramaPlay', //短剧二次播放页 + name: 'shortDramaPlay', + component: () => import('@/views/shortVideo/short-drama/DramaPlayPage.vue'), + meta: { + pageKey: 'short_drama_play', + pageName: '短剧播放页', + }, + }, + { + path: '/shortDramaTag', //短剧标签详情页 + name: 'shortDramaTag', + component: () => import('@/views/shortVideo/short-drama/DramaTagPage.vue'), + meta: { + pageKey: 'short_drama_tag', + pageName: '短剧标签详情页', + }, + }, + { + path: '/jointGamingActivitie', //游戏活动 + name: 'jointGamingActivitie', + component: () => import('@/views/jointGamingActivitie/index.vue'), + meta: { + pageKey: 'joint_gaming_activitie', + pageName: '游戏活动', + }, + }, + { + path: '/lotteryPage', //抽奖页 + name: 'lotteryPage', + component: () => import('@/views/lldhome/lotteryPage/index.vue'), + meta: { + pageKey: 'lottery_page', + pageName: '抽奖页', + }, + }, + { + path: '/tagVideoList', // 标签视频列表页 + name: 'tagVideoList', + component: () => import('@/views/lldhome/tagVideoList/index.vue'), + meta: { + pageKey: 'tag_video_list', + pageName: '标签视频列表页', + }, + }, + { + path: '/moreActress', // 更多女演员 + name: 'moreActress', + component: () => import('@/views/lldhome/moreActress/index.vue'), + meta: { + pageKey: 'more_actress', + pageName: '更多女演员', + }, + }, +]; + +//社区相关路由 +const communityCollection: RouteRecordRaw[] = [ + { + path: '/publishGraphics', //发布帖子--图文 + name: 'publishGraphics', + component: () => import('@/views/community/publish/publishGraphics/index.vue'), + meta: { + pageKey: 'publish_graphics', + pageName: '发布帖子--图文', + }, + }, + { + path: '/publishVideo', //发布帖子--视频 + name: 'publishVideo', + component: () => import('@/views/community/publish/publishVideo/index.vue'), + meta: { + pageKey: 'publish_video', + pageName: '发布帖子--视频', + }, + }, + { + path: '/pubilshImg', //发布帖子--视频 + name: 'pubilshImg', + component: () => import('@/views/community/publish/pubilshImg/index.vue'), + meta: { + pageKey: 'pubilsh_img', + pageName: '发布帖子--视频', + }, + }, + { + path: '/topicMore', //选择帖子板块 + name: 'topicMore', + component: () => import('@/views/community/publish/topicMore/index.vue'), + meta: { + pageKey: 'topic_more', + pageName: '选择帖子板块', + }, + }, + { + path: '/communityTagDeatil', //标签帖子详情 + name: 'communityTagDeatil', + component: () => import('@/views/community/communityTagDeatil/index.vue'), + meta: { + pageKey: 'community_tag_deatil', + pageName: '标签帖子详情', + }, + }, + { + path: '/postDetail', //帖子详情 + name: 'postDetail', + component: () => import('@/views/community/postDetail/index.vue'), + meta: { + pageKey: 'post_detail', + pageName: '帖子详情', + }, + }, + { + path: '/userInfo', //用户主页 + name: 'userInfo', + component: () => import('@/views/community/userInfo/index.vue'), + meta: { + pageKey: 'user_info', + pageName: '用户主页', + }, + }, + { + path: '/picturePreview', //图片详情 + name: 'picturePreview', + component: () => import('@/views/community/picturePreview/index.vue'), + meta: { + pageKey: 'picture_preview', + pageName: '图片详情', + }, + }, + { + path: '/videoInfo', //图片详情 + name: 'videoInfo', + component: () => import('@/views/community/videoInfo/index.vue'), + meta: { + pageKey: 'video_info', + pageName: '图片详情', + }, + }, + { + path: '/coverPage', //套图站 + name: 'coverPage', + component: () => import('@/views/community/coverPage/index.vue'), + meta: { + pageKey: 'cover_page', + pageName: '套图站', + }, + }, + { + path: '/coverDetail', //套图详情页 + name: 'coverDetail', + component: () => import('@/views/community/coverPage/detail.vue'), + meta: { + pageKey: 'cover_detail', + pageName: '套图详情页', + }, + }, + { + path: '/coverPreview', //套图预览 + name: 'coverPreview', + component: () => import('@/views/community/coverPage/preview.vue'), + meta: { + pageKey: 'cover_preview', + pageName: '套图预览', + }, + }, + { + path: '/rankingList', //热门排行 + name: 'rankingList', + component: () => import('@/views/community/rankingList/index.vue'), + meta: { + pageKey: 'ranking_list', + pageName: '热门排行', + }, + }, + { + path: '/gameDetails', + name: 'gameDetails', + component: () => import('@/views/community/gameDetails/index.vue'), + meta: { + pageKey: 'game_details', + pageName: '游戏详情', + }, + }, + { + path: '/gameTagDetails', //游戏标签详情列表 + name: 'gameTagDetails', + component: () => import('@/views/community/gameTagDetails/index.vue'), + meta: { + pageKey: 'game_tag_details', + pageName: '游戏标签详情列表', + }, + }, + { + path: '/groupChat', //群聊 + name: 'groupChat', + component: () => import('@/views/community/groupChat/index.vue'), + meta: { + pageKey: 'group_chat', + pageName: '群聊', + }, + }, +]; +//acg相关路由 +const acgCollection: RouteRecordRaw[] = [ + { + path: '/AcgTopicList', + name: 'AcgTopicList', + component: () => import('@/views/acgModule/topicList/index.vue'), + meta: { + pageKey: 'topic_detail', + pageName: '专题详情页', + }, + }, + { + path: '/AcgTextDetail', + name: 'AcgTextDetail', + component: () => import('@/views/acgModule/detail-text/index.vue'), + meta: { + pageKey: 'novel_detail', + pageName: '小说详情页', + }, + }, + { + path: '/AcgTextDetailWatch0', + name: 'AcgTextDetailWatch0', + component: () => import('@/views/acgModule/detail-text/watch0.vue'), + meta: { + pageKey: 'acg_text_detail_watch_0', + pageName: 'ACG文本详情观看0', + }, + }, + { + path: '/AcgTextDetailWatch1', + name: 'AcgTextDetailWatch1', + component: () => import('@/views/acgModule/detail-text/watch1.vue'), + meta: { + pageKey: 'acg_text_detail_watch_1', + pageName: 'ACG文本详情观看1', + }, + }, + { + path: '/AcgImageDetail', + name: 'AcgImageDetail', + component: () => import('@/views/acgModule/detail-image/index.vue'), + meta: { + pageKey: 'comic_detail', + pageName: '漫画详情页', + }, + }, + { + path: '/AcgImageDetailWatch', + name: 'AcgImageDetailWatch', + component: () => import('@/views/acgModule/detail-image/watch.vue'), + meta: { + pageKey: 'acg_image_detail_watch', + pageName: 'ACG图片详情观看', + }, + }, + { + path: '/AcgVideoDetail', + name: 'AcgVideoDetail', + component: () => import('@/views/acgModule/detail-video/index.vue'), + meta: { + pageKey: 'video_play', + pageName: '视频播放页', + }, + }, +]; + +//免费福利相关路由 +const freeBenefitsCollection: RouteRecordRaw[] = [ + { + path: '/freeBenefits', //福利中心 + name: 'freeBenefits', + component: () => import('@/views/lldfreeBenefits/index.vue'), + meta: { + pageKey: 'app_list', + pageName: '应用推荐', + }, + }, + { + path: '/task_sign_day', //每日签到 + name: 'task_sign_day', + component: () => import('@/views/lldfreeBenefits/task_sign_day.vue'), + meta: { + pageKey: 'task_sign_day', + pageName: '每日签到', + }, + }, + { + path: '/freeRecord', //积分兑换记录 + name: 'freeRecord', + component: () => import('@/views/lldfreeBenefits/record.vue'), + meta: { + pageKey: 'free_record', + pageName: '积分兑换记录', + }, + }, + { + path: '/promotionData', //推广数据 + name: 'promotionData', + component: () => import('@/views/lldfreeBenefits/promotionData/index.vue'), + meta: { + pageKey: 'promotion_data', + pageName: '推广数据', + }, + }, + { + path: '/promotionDetails', //推广明细 + name: 'promotionDetails', + component: () => import('@/views/lldfreeBenefits/promotionDetails/index.vue'), + meta: { + pageKey: 'promotion_details', + pageName: '推广明细', + }, + }, + { + path: '/vidDiscount', //折扣专区 + name: 'vidDiscount', + component: () => import('@/views/lldfreeBenefits/vidDiscount/index.vue'), + meta: { + pageKey: 'vid_discount', + pageName: '折扣专区', + }, + }, +]; + +//我的相关路由 +const mineCollection: RouteRecordRaw[] = [ + { + path: '/purchasedVideo', //已购视频 + name: 'PurchasedVideo', + component: () => import('@/views/lldmine/purchasedVideo/index.vue'), + meta: { + pageKey: 'purchased_video', + pageName: '已购视频', + }, + }, + { + path: '/accountCertificate', //账号凭证 + name: 'AccountCertificate', + component: () => import('@/views/lldmine/accountCertificate/index.vue'), + meta: { + pageKey: 'account_certificate', + pageName: '账号凭证', + }, + }, + { + path: '/wallet', //金币钱包 + name: 'wallet', + component: () => import('@/views/lldmine/wallet/index.vue'), + meta: { + pageKey: 'wallet', + pageName: '金币钱包', + }, + }, + { + path: '/member', //会员中心 + name: 'member', + component: () => import('@/views/lldmine/member/index.vue'), + meta: { + pageKey: 'member', + pageName: '会员中心', + }, + }, + { + path: '/withdraw', //提现 + name: 'withdraw', + component: () => import('@/views/lldmine/withdraw/index.vue'), + meta: { + pageKey: 'withdraw', + pageName: '提现', + }, + }, + { + path: '/bindBankCard', // 绑定银行卡页面 + name: 'bindBankCard', + component: () => import('@/views/lldmine/withdraw/bindBankCard/index.vue'), + meta: { + pageKey: 'bind_bank_card', + pageName: '绑定银行卡页面', + }, + }, + { + path: '/withdrawRecord', // 提现记录 + name: 'withdrawRecord', + component: () => import('@/views/lldmine/withdrawRecord/index.vue'), + meta: { + pageKey: 'withdraw_record', + pageName: '提现记录', + }, + }, + { + path: '/rechargeRecord', // 充值记录 + name: 'rechargeRecord', + component: () => import('@/views/lldmine/rechargeRecord/index.vue'), + meta: { + pageKey: 'recharge_record', + pageName: '充值记录', + }, + }, + { + path: '/qualityApplication', //精品应用 + name: 'qualityApplication', + component: () => import('@/views/lldmine/qualityApplication/index.vue'), + meta: { + pageKey: 'quality_application', + pageName: '精品应用', + }, + }, + { + path: '/customerService', //我的客服 + name: 'customerService', + component: () => import('@/views/lldmine/customerService/index.vue'), + meta: { + pageKey: 'customer_service', + pageName: '我的客服', + }, + }, + { + path: '/transactionRecord', //交易记录 + name: 'transactionRecord', + component: () => import('@/views/lldmine/transactionRecord/index.vue'), + meta: { + pageKey: 'transaction_record', + pageName: '交易记录', + }, + }, + { + path: '/collectVideo', //我的收藏 + name: 'collectVideo', + component: () => import('@/views/lldmine/collectVideo/index.vue'), + meta: { + pageKey: 'collect_video', + pageName: '我的收藏', + }, + }, + // { + // path: '/bindAccount', //绑定手机号 + // name: 'bindAccount', + // component: () => import('@/views/login/bindAccount.vue'), + // }, + { + path: '/historyRecord', // 观看历史 + name: 'historyRecord', + component: () => import('@/views/lldmine/historyRecord/index.vue'), + meta: { + pageKey: 'history_record', + pageName: '观看历史', + }, + }, + { + path: '/officialCommunity', // 官方社群 + name: 'officialCommunity', + component: () => import('@/views/lldmine/officialCommunity/index.vue'), + meta: { + pageKey: 'official_community', + pageName: '官方社群', + }, + }, + { + path: '/business', // 商务合作 + name: 'business', + component: () => import('@/views/lldmine/business/index.vue'), + meta: { + pageKey: 'business', + pageName: '商务合作', + }, + }, + { + path: '/share', // 分享推广 + name: 'share', + component: () => import('@/views/lldmine/share/index.vue'), + meta: { + pageKey: 'share', + pageName: '分享推广', + }, + }, + { + path: '/myShare', // 我的推广 + name: 'myShare', + component: () => import('@/views/lldmine/share/myShare.vue'), + meta: { + pageKey: 'my_share', + pageName: '我的推广', + }, + }, + { + path: '/exchange', // 领取兑换 + name: 'exchange', + component: () => import('@/views/lldmine/exchange/index.vue'), + meta: { + pageKey: 'exchange', + pageName: '领取兑换', + }, + }, + { + path: '/myAccount', // 我的账号 + name: 'myAccount', + component: () => import('@/views/lldmine/myAccount/index.vue'), + meta: { + pageKey: 'my_account', + pageName: '我的账号', + }, + }, + { + path: '/bindingPhone', // 绑定手机号 + name: 'bindingPhone', + component: () => import('@/views/lldmine/bindingPhone/index.vue'), + meta: { + pageKey: 'binding_phone', + pageName: '绑定手机号', + }, + }, + { + path: '/setting', // 设置 + name: 'setting', + component: () => import('@/views/lldmine/setting/index.vue'), + meta: { + pageKey: 'setting', + pageName: '设置', + }, + }, + { + path: '/editNick', // 修改昵称 + name: 'editNick', + component: () => import('@/views/lldmine/editNick/index.vue'), + meta: { + pageKey: 'edit_nick', + pageName: '修改昵称', + }, + }, + { + path: '/bindingCode', // 绑定邀请码 + name: 'bindingCode', + component: () => import('@/views/lldmine/bindingCode/index.vue'), + meta: { + pageKey: 'binding_code', + pageName: '绑定邀请码', + }, + }, + { + path: '/editSign', // 修改个性签名 + name: 'editSign', + component: () => import('@/views/lldmine/editSign/index.vue'), + meta: { + pageKey: 'edit_sign', + pageName: '修改个性签名', + }, + }, + { + path: '/feedback', // 帮助反馈 + name: 'feedback', + component: () => import('@/views/lldmine/feedback/index.vue'), + meta: { + pageKey: 'feedback', + pageName: '帮助反馈', + }, + }, + { + path: '/messageCenter', //消息中心 + name: 'messageCenter', + component: () => import('@/views/lldmine/messageCenter/index.vue'), + meta: { + pageKey: 'message_center', + pageName: '消息中心', + }, + }, + { + path: '/minelogin', //消息中心 + name: 'minelogin', + component: () => import('@/views/lldmine/login/index.vue'), + meta: { + pageKey: 'minelogin', + pageName: '登录', + }, + }, + { + path: '/minepostpage', // 发布的帖子 + name: 'minepostpage', + component: () => import('@/views/lldmine/minepostpage/index.vue'), + meta: { + pageKey: 'minepostpage', + pageName: '发布的帖子', + }, + }, + { + path: '/follow', // 我的关注 + name: 'follow', + component: () => import('@/views/lldmine/follow/index.vue'), + meta: { + pageKey: 'follow', + pageName: '我的关注', + }, + }, + { + path: '/originalenter', // 原创入驻 + name: 'originalenter', + component: () => import('@/views/lldmine/originalenter/index.vue'), + meta: { + pageKey: 'originalenter', + pageName: '原创入驻', + }, + }, + { + path: '/originalenter2', // 官方招募 + name: 'originalenter2', + component: () => import('@/views/lldmine/originalenter/index2.vue'), + meta: { + pageKey: 'originalenter_2', + pageName: '官方招募', + }, + }, + { + path: '/revenueDetails', // 收益明细 + name: 'revenueDetails', + component: () => import('@/views/lldmine/revenueDetails/index.vue'), + meta: { + pageKey: 'revenue_details', + pageName: '收益明细', + }, + }, + { + path: '/announDetails', //消息详情 + name: 'announDetails', + component: () => import('@/views/lldmine/messageCenter/announDetails.vue'), + meta: { + pageKey: 'announ_details', + pageName: '消息详情', + }, + }, + // { + // path: '/aiUndress', //ai导航 + // name: 'aiUndress', + // component: () => import('@/views/lldmine/aiUndress/index.vue'), + // }, + // { + // path: '/aiUndress2', //ai脱衣 + // name: 'aiUndress2', + // component: () => import('@/views/lldmine/aiUndress/index2.vue'), + // }, + { + path: '/aiNovelDetail', // 小说详情 + name: 'aiNovelDetail', + component: () => import('@/views/lldmine/aiUndress/aiText/detail.vue'), + meta: { + pageKey: 'ai_novel_detail', + pageName: '小说详情', + }, + }, + { + path: '/changeDetail', //ai视频换脸详情 + name: 'changeDetail', + component: () => import('@/views/lldmine/aiUndress/changeDetail.vue'), + meta: { + pageKey: 'change_detail', + pageName: 'ai视频换脸详情', + }, + }, + { + path: '/aiRecord', //ai记录 + name: 'aiRecord', + component: () => import('@/views/lldmine/aiRecord/index.vue'), + meta: { + pageKey: 'ai_record', + pageName: 'ai记录', + }, + }, + { + path: '/signIn', //打卡页面 + name: 'signIn', + component: () => import('@/views/lldmine/signIn/index.vue'), + meta: { + pageKey: 'sign_in', + pageName: '打卡页面', + }, + }, + { + path: '/AiGirlFriend', //ai女友 + name: 'AiGirlFriend', + component: () => import('@/views/lldmine/aiGirlFriend/index.vue'), + meta: { + pageKey: 'ai_girl_friend', + pageName: 'ai女友', + }, + }, + { + path: '/aiGirlfriend/web', + name: 'aiGirlfriendWeb', + component: () => import('@/views/lldmine/aiGirlFriend/web.vue'), + meta: { + pageKey: 'ai_girlfriend_web', + pageName: 'AI女友网页', + }, + }, + { + path: '/problemFeedback', //问题反馈 + name: 'problemFeedback', + component: () => import('@/views/lldmine/problemFeedback/index.vue'), + meta: { + pageKey: 'problem_feedback', + pageName: '问题反馈', + }, + }, + { + path: '/questionsAnswers', //问题解答 + name: 'questionsAnswers', + component: () => import('@/views/lldmine/questionsAnswers/index.vue'), + meta: { + pageKey: 'questions_answers', + pageName: '问题解答', + }, + }, + { + path: '/findPhone', //账号找回 + name: 'findPhone', + component: () => import('@/views/lldmine/myAccount/findPhone.vue'), + meta: { + pageKey: 'find_phone', + pageName: '账号找回', + }, + }, + { + path: '/myLike', //我的喜欢 + name: 'myLike', + component: () => import('@/views/lldmine/myLike/index.vue'), + meta: { + pageKey: 'my_like', + pageName: '我的喜欢', + }, + }, + { + path: '/memberExchange', //会员兑换 + name: 'memberExchange', + component: () => import('@/views/lldmine/memberExchange/index.vue'), + meta: { + pageKey: 'member_exchange', + pageName: '会员兑换', + }, + }, + { + path: '/changeAvatar', //会员兑换 + name: 'changeAvatar', + component: () => import('@/views/lldmine/changeAvatar/index.vue'), + meta: { + pageKey: 'change_avatar', + pageName: '修改头像', + }, + }, +]; + +// 暗网相关路由 +const darkNet: RouteRecordRaw[] = []; + +//直播 +const liveCollection: RouteRecordRaw[] = [ + { + path: '/liveRoom', + name: 'liveRoom', + component: () => import('@/views/lldlive/index.vue'), + meta: { + pageKey: 'live_detail', + pageName: '直播详情页', + }, + }, +]; + +const routes: RouteRecordRaw[] = [ + { + path: '/', + name: 'splash', + component: Splash, + meta: { + pageKey: 'start', + pageName: '启动页', + }, + }, + { + path: '/main', + name: 'main', + component: () => import('@/views/MainView.vue'), + redirect: '/shortVideo', + meta: { + pageKey: 'main', + pageName: '主页', + }, + children: [ + { + path: '/home', //首页 + name: 'home', + component: () => import('@/views/lldhome/index.vue'), + meta: { + pageKey: 'home', + pageName: '首页', + }, + }, + { + path: '/community', //社区 + name: 'community', + component: () => import('@/views/community/index.vue'), + meta: { + pageKey: 'comm_post', + pageName: '社区首页', + }, + }, + { + path: '/darkNet', //暗网 + name: 'darkNet', + component: () => import('@/views/darkNet/index.vue'), + meta: { + pageKey: 'darkweb', + pageName: '暗网', + }, + }, + { + path: '/mine', //我的 + name: 'mine', + component: () => import('@/views/lldmine/index.vue'), + meta: { + pageKey: 'mine', + pageName: '我的', + }, + }, + { + path: '/shortVideo', //短剧(默认 AI短剧) + name: 'shortVideo', + component: () => import('@/views/shortVideo/index.vue'), + meta: { + pageKey: 'shortvideo_play', + pageName: '短视频播放页', + }, + }, + { + path: '/aiUndress2', //AI科技 + name: 'aiUndress2', + component: () => import('@/views/lldmine/aiUndress/index2.vue'), + meta: { + pageKey: 'ai_undress_2', + pageName: 'AI科技', + }, + }, + { + path: '/pictureVideoDetail', //图生视频详情 + name: 'pictureVideoDetail', + component: () => import('@/views/lldmine/aiUndress/picture2Video.vue'), + meta: { + pageKey: 'picture_video_detail', + pageName: '图生视频详情', + }, + }, + ], + }, + ...homeCollection, + ...communityCollection, + ...freeBenefitsCollection, + ...mineCollection, + ...darkNet, + ...liveCollection, + ...acgCollection, +]; +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: routes, +}); + +export default router; diff --git a/src/service/acg.ts b/src/service/acg.ts new file mode 100644 index 0000000..fa248f9 --- /dev/null +++ b/src/service/acg.ts @@ -0,0 +1,83 @@ +import request from '@/utils/request'; + +export default class AcgApi { + // 获取模块下所有视频 + static getModuleList() { + return request.get('/modules/list'); + } + // 获取acg排行榜 + static getAcgRanking(data: any) { + return request.get('/media/ranking', data); + } + // 获取排行榜 + static getRanking(data: any) { + return request.get('/vid/ranking', data); + } + // 热门漫画 + static getMediaHot(data: any) { + return request.get('/media/hot', data); + } + // 标签列表 + static getTagList(data: any) { + return request.get('/tag/list', data); + } + + //首页推荐 + static getMediaRecommend(data: any) { + return request.get('/media/recommend', data); + } + + //金刚区专题 + static getSectionList(data: any) { + return request.get('/section/list', data); + } + + //子集列表 + static getMediaContentList(data: any) { + return request.get('/media_content/list', data); + } + //子集详情 + static getMediaContentInfo(data: any): Promise { + return request.get('/media_content/info', data); + } + //任务奖励领取 + static getMediaTaskReceive(data: any) { + return request.post('/media_task/receive', data); + } + + static getDiscountAreaRecommend(data: any) { + return request.get('/discount_area/recommend', data); + } + + static getDiscountAreaList(data: any) { + return request.get('/discount_area/list', data); + } + + static getActivitiesDraw(data: any) { + return request.post('/activities/draw', data); + } + + static getActivitiesInfo(data: any) { + return request.get('/activities/info', data); + } + + static getActressInfo(data: any) { + return request.get('/actress/info', data); + } + + static getActressMediaList(data: any) { + return request.get('/actress/media/list', data); + } + + static getLinkList(data: any) { + return request.get('/link/list', data); + } + + static getLinkInfo(data: any) { + return request.get('/link/info', data); + } + // acg标签页 + static getTagMediaList(data: any) { + return request.get('/tag/media/list', data); + } +} diff --git a/src/service/app.ts b/src/service/app.ts new file mode 100644 index 0000000..8f13245 --- /dev/null +++ b/src/service/app.ts @@ -0,0 +1,173 @@ +import { imgEncrypt } from '@/utils/key'; +import request from '@/utils/request'; +export default class AppApi { + // LRU缓存: url->objectURL + private static readonly MAX_IMG_DECRYPT_CACHE = 200; + private static imgDecryptCache: Map = new Map(); + // 当前正在解密的 promise,避免并发同 url 多次请求 + private static imgDecryptInFlight: Map> = new Map(); + + /** + * @description 登录 + * @param {String} devID 设备ID + * @param {String} sysType 设备类型 + * @param {string} cutInfos 渠道码 + * @returns + */ + static async login( + devID: string, + sysType: string, + cutInfos?: string, + isAppStore?: boolean, + ): Promise { + return request.post('/mine/login/h5', { + devID, + sysType, + cutInfos, + isAppStore, + }); + } + + /** + * @description 获取配置信息 + * @returns + */ + static async queryDomain(): Promise { + return request.get('/ping/domain/h5'); + } + + /** + * @description 刷新付费分层弹窗配置 + */ + static async refreshPaymentPopup(): Promise { + return request.get('/ping/domain/refresh', { keys: 'paymentPopup' }); + } + + /** + * @description 刷新付费引导 Ping 缓存(登录/退出/会员状态变化后调用) + */ + static async refreshPaymentGuide(): Promise { + return request.get('/ping/domain/refresh', { keys: 'paymentGuide' }); + } + + /** + * @description 按浮窗ID单查 banner(红包雨场次切换后用于刷新某条浮窗) + * @param id 浮窗ID(24位 ObjectID hex 字符串) + * @param signal AbortSignal,用于在组件卸载时取消请求 + */ + static async queryBannerById(id: string, signal?: AbortSignal): Promise { + return request.get(`/ping/banner/${id}`, undefined, signal ? { signal } : undefined); + } + + /** + * @description 场景 Banner 列表(如评论区置顶 COMMENT_TOP) + */ + static getBannerList(params: { scene: string }): Promise { + return request.get('/banner/list', params); + } + + /** + * @description 图片解密 + * @param url 需要解密的url + * @returns 解密过后的图片链接 + */ + static async imgDecypt(url: string): Promise { + if (!url) { + return Promise.reject(new Error('image decrypt url empty')); + } + + // 已经是可直接使用的 URL,不需要再网络请求解密 + if (/^(blob:|data:)/.test(url)) { + return Promise.resolve(url); + } + + const cached = AppApi.imgDecryptCache.get(url); + if (cached) { + // LRU refresh: 删除再重新设置,将 key移动到Map末尾 + AppApi.imgDecryptCache.delete(url); + AppApi.imgDecryptCache.set(url, cached); + return Promise.resolve(cached); + } + + const inFlight = AppApi.imgDecryptInFlight.get(url); + if (inFlight) { + return inFlight; + } + + const promise = fetch(url, { + // 图床按 Referer 防盗链:localhost 会 403,空 Referer / 白名单域名可通过; + // XHR 无法去掉 Referer,这里用 fetch 显式 no-referrer,本地与线上一致可拉图。 + referrerPolicy: 'no-referrer', + }) + .then(async (res) => { + if (!res.ok) { + throw new Error(`image decrypt http ${res.status}`); + } + const arrayBuffer = await res.arrayBuffer(); + const objectUrl = imgEncrypt(arrayBuffer); + + AppApi.imgDecryptCache.set(url, objectUrl); + // LRU 清理最旧的 objectURL + if (AppApi.imgDecryptCache.size > AppApi.MAX_IMG_DECRYPT_CACHE) { + const oldestKey = AppApi.imgDecryptCache.keys().next().value; + if (oldestKey) { + const oldUrl = AppApi.imgDecryptCache.get(oldestKey); + if (oldUrl) { + URL.revokeObjectURL(oldUrl); + } + AppApi.imgDecryptCache.delete(oldestKey); + } + } + + AppApi.imgDecryptInFlight.delete(url); + return objectUrl; + }) + .catch((err) => { + AppApi.imgDecryptInFlight.delete(url); + return Promise.reject(err); + }); + + AppApi.imgDecryptInFlight.set(url, promise); + return promise; + } + + /** + * @description 清理解密缓存的 objectUrl,防止内存泄漏 + */ + static clearImgDecryptCache() { + AppApi.imgDecryptInFlight.clear(); + AppApi.imgDecryptCache.forEach((objectUrl) => { + URL.revokeObjectURL(objectUrl); + }); + AppApi.imgDecryptCache.clear(); + } + + /** + * @description 上传图片 + * @param data 需要参数 + * @returns + */ + static async uploadFile(data: any): Promise { + return request.post(`/vid/uploadStatic`, data, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + } + /** + * @description 获取跑马灯数据 + * @param data 无参数 + * @returns + */ + static getAnnounce() { + return request.get('/modules/announce'); + } + /** + * @description 广告统计 + * @param data 参数 + * @returns + */ + static clickAdv(data: any) { + return request.post('/ads/click', data); + } +} diff --git a/src/service/community.ts b/src/service/community.ts new file mode 100644 index 0000000..5740ea3 --- /dev/null +++ b/src/service/community.ts @@ -0,0 +1,183 @@ +import request from '@/utils/request'; +export default class CommunityApi { + /** + * @description 分片上传视频 + * @param data 需要参数 + * @returns + */ + static async uploadVideo(data: any, processCallback: any): Promise { + return request.post(`/vid/uploadDotJson`, data, { + headers: { + 'Content-Type': 'application/json', + }, + timeout: 1000 * 120, + onUploadProgress: processCallback, + }); + } + /** + * @description 获取话题 + * @param data 参数 + * @returns + */ + static getTagList(data: any): Promise { + return request.get('/tag/v2/list', data); + } + + /** + * @description 关注或者取消关注接口 + * @param data 参数 + * @returns + */ + static careOrcancle(data: any): Promise { + return request.post('/mine/follow', data); + } + /** + * @description 点赞 + * @param data 参数 + * @returns + */ + static zan(data: any): Promise { + return request.post('/thumbsUp', data); + } + /** + * @description 取消点赞 + * @param data 参数 + * @returns + */ + static cancleZan(data: any): Promise { + return request.post('/thumbsDown', data); + } + /** + * @description 获取帖子评论 + * @param data 参数 + * @returns + */ + static getCommentList(data: any): Promise { + return request.get('/comment/list', data); + } + /** + * @description 获取帖子二级评论 + * @param data 参数 + * @returns + */ + static getSecCommentList(data: any): Promise { + return request.get('/comment/info', data); + } + /** + * @description 帖子评论 + * @param data 参数 + * @returns + */ + static sendComment(data: any): Promise { + return request.post('/comment/send', data); + } + /** + * @description 获取官方交流群 + * @param data 参数 + * @returns + */ + static getBusiness(data: any): Promise { + return request.get('/official/list', data); + } + /** + * @description 发布图文 + * @param data + * @returns + */ + static publishGraphics(data: any): Promise { + return request.post('/vid/submit', data); + } + /** + * @description 获取话题详情 + * @param data 参数 + * @returns + */ + static queryTagDetail(data: any): Promise { + return request.get('/tag/info', data); + } + /** + * @description 收藏 + * @param data 参数 + * @returns + */ + static collect(data: any): Promise { + return request.post('/mine/collect', data); + } + /** + * @description 获取公告 + * @param data 参数 + * @returns + */ + static getAnnouList(data: any): Promise { + return request.get('/annou/msg/list', data); + } + + /** + * @description 获取公告 + * @param data 参数 + * @returns + */ + static getCommunityRecommend(data: any): Promise { + return request.get('/vid/community/recommend', data); + } + /** + * @description 获取AI广场列表 + * @param data + * @returns + */ + static queryAiSquareList(data: any): Promise { + return request.get('/aiplaza/list', data); + } + /** + * @description 获取评论表情包 + * @param data 参数 + * @returns + */ + static getEmojiList(data: any): Promise { + return request.get('/emoji/list', data); + } + /** + * @description 获取ai广场帖子详情 + * @param data + * @returns + */ + static queryAiSquareDetail(data: any): Promise { + return request.get('/aiplaza/info', data); + } + /** + * @description 获取群列表 + * @param data + * @returns + */ + static queryImgroupList(data: any): Promise { + return request.get('/imgroup/list', data); + } + /** + * @description 获取im群组是否加入 + * @param data + * @returns + */ + static queryImgroupHasjoin(data: any): Promise { + return request.get('/imgroup/hasjoin', data); + } + /** + * @description 获取群聊im消息列表 + */ + static imMessageList(data: any) { + return request.get('/immessage/list', data); + } + /** + * @description 获取im群组详情 + * @param data + * @returns + */ + static queryImgroupInfo(data: any): Promise { + return request.get('/imgroup/info', data); + } + /** + * @description 发送群聊im消息 + */ + static imMessageSend(data: any) { + return request.post('/immessage/send', data); + } +} diff --git a/src/service/home.ts b/src/service/home.ts new file mode 100644 index 0000000..0b0ae4e --- /dev/null +++ b/src/service/home.ts @@ -0,0 +1,262 @@ +import request from '@/utils/request'; +export default class HomeApi { + /** + * @description 获取专题 + * @param data 参数 + * @returns + */ + static getTabs(): Promise { + return request.get('/modules/list'); + } + + static getModuleList(data: any): Promise { + return request.get('/vid/module/' + data.id, data.data); + } + static getModuleList2(data: any): Promise { + return request.get('/vid/v2/module/' + data.id, data.data); + } + + // 短视频发现模块 + static getVidListDiscover(data: any): Promise { + return request.get('/recommend/vid/list/discover', data); + } + + /** 亚模块热门随机刷新 */ + static refreshModuleVideos( + subModuleId: string, + data: { moduleSort: number; pageSize?: number; refreshToken: string }, + ): Promise { + return request.get(`/vid/module/${subModuleId}/refresh`, data); + } + + /** 首页更新红点 */ + static getContentUpdateMarkers(): Promise { + return request.get('/content/update-markers'); + } + + // 短视频关注模块 + static getDynamicslist(data: any) { + return request.get('/follow/dynamics/list', data); + } + static getAnnounce(data: any) { + return request.get('/mine/announce/list', data); + } + // 获取所有专题 + static getSectionList(data: any) { + return request.post('/section/allList', data); + } + // 获取专题详情 + static getSectionDetails(data: any) { + return request.post('/section/details', data); + } + + /** + * 获取参赛作品列表 + */ + static queryActVidList(data: any) { + return request.get('/video_activity/list', data); + } + + /** + * @description 视频热榜 + * @param data 参数 + * @returns + */ + static getVideoHotList(data: any): Promise { + return request.get('/search/hotVid/list', data); + } + /** + * @description 获取专题数据 + * @param data 参数 + * @returns + */ + static getVidSectionList(id: string, data: any): Promise { + return request.get('/vid/section/' + id, data); + } + /** + * @description 获取配置标签数据 + * @param data 无参数 + * @returns + */ + static queryTagConfigList(): Promise { + return request.get('/tag/conf/list'); + } + /** + * @description 获取随机短视频 + * @param data 参数 + * @returns + */ + static queryRecommendVidList(data: any): Promise { + return request.get('/vid/list', data); + } + /** + * @description 任务列表 + * @param data 参数 + * @returns + */ + static getSignList() { + return request.get('/task/sign'); + } + /** + * @description 签到 + */ + static taskSign(data: any) { + return request.post('/task/sign', data); + } + /** + * @description 补签 + */ + static taskReSign(data: any) { + return request.post('/task/resign', data); + } + /** + * @description 额外奖励任务列表 + */ + static getSignExtraPrizesList() { + return request.get('/task/sign-extra-prizes'); + } + /** + * @description 获取新版签到奖品 + */ + static checkinPrize(data: any = {}) { + return request.post('/checkin/prize', data); + } + /** + * @description 新版签到 + */ + static checkinClick(data: any = {}) { + return request.post('/checkin/click', data); + } + /** + * @description 会员补领签到奖励 + */ + static checkinClaimVip(data: any = {}) { + return request.post('/checkin/claim_vip', data); + } + /** + * @description 做任务 + */ + static taskDo(data: any) { + return request.post('/task/do', data); + } + /** + * @description 领取积分 + */ + static taskReceive(data: any) { + return request.post('/task/receive', data); + } + //每日推荐-根据年月获取日 + static homeDailyRecommedYearMonth(data: any) { + return request.post('/daily/recommendList', data); + } + /** + * @description 预售金币视频 + * @param data 参数 + * @returns + */ + static getPresaleList(data: any) { + return request.get('/video_gold_coin/list', data); + } + /** + * @description 获取娱乐数据--广告列表 + * @param data 参数 + * @returns + */ + static getRecreatio() { + return request.get('/recreation/list'); + } + /** + * @description 获取娱乐数据--广告点击上报 + * @param data 参数 + * @returns + */ + static upperRecreatio(data: any) { + return request.post('/recreation/click', data); + } + /** + * @description 查询预售配置列表 + * @param data 参数 + * @returns + */ + static getConfigList() { + return request.get('/advance_config/list'); + } + /** + * @description 获取积分兑换列表 + */ + static getIntegral() { + return request.get('/integral/list'); + } + /** + * @description 积分兑换 + */ + static exchangeIntegral(data: any) { + return request.post('/integral/exchangeIntegral', data); + } + /** + * @description 获取VIP公告 + * @param 无 + * @returns + */ + static queryAnnounce() { + return request.get('/mine/announce/list'); + } + /** + * @description 收藏 + * @param data 参数 + * @returns + */ + static collect(data: any): Promise { + return request.post('/mine/collect', data); + } + /** + * @description 任务列表 + * @param data 参数 + * @returns + */ + static getTaskList() { + return request.get('/task/list'); + } + /** + * @description 获取积分兑换记录列表 + */ + static getIntegralRecord() { + return request.get('/integral/record/list'); + } + /** + * @description 获取积分兑换记录列表 + */ + static getMidSectionList(data: any) { + return request.get('/vid/section/list', data); + } + /** + * @description 片库搜索 + */ + static getVidLibrary(data: any) { + return request.get('/vid/library', data); + } + /** + * @description 片库搜索 + */ + static getVidLibrarySearch(data: any) { + return request.post('/vid/library/search', data); + } + /** + * @description 获取专题下的换一批视频列表 + */ + static queryVidChange(id: string) { + return request.get('/vid/section/changeVideo/' + id); + } + /** + * @description 获取专题下的换一批视频列表(acg) + */ + static queryMediaChange(id: string) { + return request.get('/vid/section/changeMedia/' + id); + } + /** + * @description 获取首页最新模块下视频数据列表 + */ + static queryHomeNewList(data: any) { + return request.get('/vid/home/new/list', data); + } +} diff --git a/src/service/live.ts b/src/service/live.ts new file mode 100644 index 0000000..83e5934 --- /dev/null +++ b/src/service/live.ts @@ -0,0 +1,18 @@ +import request from '@/utils/request'; +export default class LiveApi { + static getLiveModuleList(param: any): Promise { + return request.post('/live/module/list/91porn', param); + } + + static getLiveAnchorList(param: any): Promise { + return request.post('/live/anchor/list/91porn', param); + } + + static getLiveAnchorRecom(param: any): Promise { + return request.post('/live/anchor/recom/91porn', param); + } + + static getLiveAnchorWatch(param: any): Promise { + return request.post('/live/anchor/watch/91porn', param); + } +} diff --git a/src/service/media.ts b/src/service/media.ts new file mode 100644 index 0000000..0d7fc09 --- /dev/null +++ b/src/service/media.ts @@ -0,0 +1,86 @@ +import request from '@/utils/request'; +export default class MediaApi { + // 获取动漫标签详情 + static getMediaTagInfo() { + return request.get('/media_tag/info'); + } + // 获取动漫标签列表 + static getMediaTagList(param: Types.Media.listParams) { + return request.get('/media_tag/list', param); + } + + // 动漫列表详情 + static getMediaInfo(param: { id: string }) { + return request.get('/media/info', param); + } + + //动漫片库接口 + static getMediaLibrary(): Promise { + return request.get('/media/library'); + } + + //动漫推荐 + static getMediaRandom(param: Types.Media.RandomPara) { + return request.get('/media/random', param); + } + + // 动漫内容列表 + static getMediaContentInfo(param: { id: string }) { + return request.get('/media_content/info', param); + } + + // 动漫专题 + static getMediaTopic(param: any): Promise { + return request.get('/media/topic', param); + } + static getMediaTopicV2(param: any): Promise { + return request.get('/media/v2/topic', param); + } + // 动漫片库搜索接口 + static getMediaSearch(param: Types.Media.SearchParam) { + return request.get('/media/search', param); + } + // 动漫片库搜索接口【标签搜索】 + static getMediaLibrarySearch(param: Types.Media.LibrarySearchParam): Promise { + return request.post('/media/library/search', param); + } + + // 专题投票 + static postSctionVote(param: { sId: string; status: number }) { + return request.post('/vid/section/vote', param); + } + + static postBookshelfAdd(param: { id: string }) { + return request.post('/media_bookshelf/add', param); + } + + static postBookshelfDel(param: { id: string }) { + return request.post('/media_bookshelf/del', param); + } + + /** + * @description 获取书架列表 + * @param data 参数 + * @returns + */ + static queryBookshelfs(data: any): Promise { + return request.get('/media_bookshelf/list', data); + } + /** + * @description 批量删除书架列表 + * @param data 参数 + * @returns + */ + static delBookshelfs(data: any): Promise { + return request.post('/media_bookshelf/del/batch', data); + } + + // 专题视频列表 + static getVidSctionList(id: string, param: Types.Media.VidSctionParam): Promise { + return request.get('/vid/section/' + id, param); + } + + static getTagList(data: any) { + return request.get('/search/tags', data); + } +} diff --git a/src/service/message.ts b/src/service/message.ts new file mode 100644 index 0000000..a8bcc62 --- /dev/null +++ b/src/service/message.ts @@ -0,0 +1,66 @@ +import request from '@/utils/request'; +export default class MessageApi { + /** + * @description 发消息--私信 + * @param data + */ + static messagePriLetter(data: any) { + return request.get('/message/priLetter', data); + } + /** + * @description 消息已读 + * @param data + */ + static messageRead(data: any) { + return request.get('/message/read', data); + } + /** + * @description 动态列表 + */ + static messageDyList(data: any) { + return request.get('/msg/dynamic/list', data); + } + /** + * @description 动态列表 + */ + static messageDyNum() { + return request.get('/msg/dynamic/noRedNum'); + } + /** + * @description 会话消息列表 + */ + static messageList(data: any) { + return request.get('/msg/message/list', data); + } + /** + * @description 删除会话 + */ + static sessionDel(data: any) { + return request.post('/msg/session/del', data); + } + /** + * @description 获取sessionId + */ + static sessionGet(data: any) { + return request.get('/msg/session/get', data); + } + /** + * @description 消息会话列表 + */ + static sessionList(data: any) { + return request.get('/msg/session/list', data); + } + /** + * @description 私聊里面发送消息 + */ + static priLetterAdd(data: any) { + return request.post('/msg/priLetter/add', data); + } + + /** + * @description 跑马灯 + */ + static announce() { + return request.get('/mine/announce/list', {}); + } +} diff --git a/src/service/mine.ts b/src/service/mine.ts new file mode 100644 index 0000000..b68ce21 --- /dev/null +++ b/src/service/mine.ts @@ -0,0 +1,370 @@ +/* eslint-disable prettier/prettier */ +import request from '@/utils/request'; +export default class MineApi { + /** + * @description 获取金币列表 + * @param data 参数 + * @returns + */ + static getGoldCoinList(data: any): Promise { + return request.get('/mine/currencys', data); + } + /** + * @description 查询优惠券列表 + * @param data 参数 + * @returns + */ + static getCouponList(data: any) { + return request.get('/goldExtra/userList', data); + } + /** + * @description 去充值 + * @param data 参数 + * @returns + */ + static getPay(data: Types.Recharge.PayTrackingFields & Record) { + return request.post('/mine/topay', data); + } + /** + * @description 金币兑换(会员购买可附带 experimentId / experimentVariant / sessionId) + * @param data 参数 + * @returns + */ + static goldExchange( + data: Pick & + Record, + ) { + return request.post('/product/buy', data); + } + /** + * @description 查询vip种类(含 A/B 实验字段) + * @param 无 + * @returns + */ + static queryVipProduct(data?: Record): Promise { + return request.get('/vip/product', data); + } + /** + * @description 查询提现方式 + * @param data 参数 + * @returns + */ + static queryWithdrawMethod(data: any) { + return request.get('/withdraw/type', data); + } + /** + * @description 查询银行卡 + * @param 无 + * @returns + */ + static queryBankCards() { + return request.get('/mine/txnact/yh/get'); + } + /** + * @description 绑定银行卡 + * @param data 参数 + * @returns + */ + static bindBankCard(data: any) { + return request.post('/mine/txnact/yh/add', data); + } + /** + * @description 删除银行卡 + * @param data 参数 + * @returns + */ + static delBankCard(data: any) { + return request.deletes('/mine/txnact/del', data); + } + /** + * @description 提现 + * @param data 参数 + * @returns + */ + static withdraw(data: any) { + return request.post('/withdraw', data); + } + /** + * @description 充值记录 + * @param data 参数 + * @returns + */ + static rechargeRecord(data: any) { + return request.post('/mine/transaction', data); + } + /** + * @description 提现记录 + * @param data 参数 + * @returns + */ + static withdrawRecord(data: any) { + return request.get('/withdraw/order', data); + } + /** + * @description 查询新手优惠剩余时间 + * @param data 参数 + * @returns + */ + static queryNewcomerCountdown() { + return request.get('/vip/tiroCountdown'); + } + /** + * @description 我的收藏列表 + * @param data 参数 + * @returns + */ + static queryCollectionList(data: any) { + return request.get('/mine/collect/infoList', data); + } + + /** + * @description 我的收藏列表(视频的收藏) + * @param data 参数 + * @returns + */ + static queryMineLikeInfo(data: any) { + return request.get('/mine/like', data); + } + /** + * @description 作品管理列表 + * @param data 参数 + * @returns + */ + static collectionInfoList(data: any) { + return request.get('/mine/collect/infoList', data); + } + /** + * @description 消耗预售卡预付权益 + * @param data 参数 + * { + * count* integer + * privilegeType* coinVideo:金币视频 luckDraw:抽奖 aiUndress:AI脱衣 download:下载 + * } + * @returns + */ + static privilegeConsume(data: any): Promise { + return request.post('/mine/privilege/consume', data); + } + /** + * @description 获取预售状态 + * @returns + */ + static advanceStatus(): Promise { + return request.get('/product/advanceStatus'); + } + /** + * @description 获取AI抵用卷 + */ + static getAiCoupon() { + return request.get('/ai/changeface/coupon'); + } + /** + * @description 获取AI优惠券 + */ + static getAibackpack(data: any) { + return request.get('/backpack', data); + } + /** + * @description ai模版列表 + */ + static getAiMod() { + return request.get('/ai/mod/list'); + } + /** + * @description ai模版列表v2 + */ + static getAiMod2(data: any) { + return request.get('/ai/mod/v2/list', data); + } + // ai图生视频-------------------------------------------- + /* @description 生成ai图生视频 + */ + static generateImageToVideo(data: any) { + return request.post('/ai/imagetovideo/generate', data); + } + /** + * @description AI图生视频生成记录列表 + */ + static getAiImageToVideoRecord(data: any) { + return request.get(`/ai/imagetovideo/list`, data); + } + /** + * @description ai图生视频隐藏 + */ + static delelteImageToVideo(data: any) { + return request.post('/ai/imagetovideo/hide', data); + } + // ai脱衣-------------------------------------------- + /** + * @description ai脱衣--生成ai脱衣记录 + */ + static generateImg(data: any) { + return request.post('/ai/undress/generate', data); + } + /** + * @description ai脱衣隐藏 + */ + static delelteUndress(data: any) { + return request.post('/ai/undress/hide', data); + } + + /** + * @description AI脱衣生成记录列表 + */ + static getAiUndressRecord(data: any) { + return request.get('/ai/undress/list', data); + } + + // ai视频换脸模块------------------------------------------- + /** + * @description ai换脸隐藏 + */ + static delelteChangeVideoFace(data: any) { + return request.post('/ai/changeface/hide', data); + } + /** + * @description ai换脸 + */ + static generateChangeVideo(data: any) { + return request.post('/ai/changeface/generate', data); + } + /** + * @description AI视频换脸生成记录列表 + */ + static getAiChangeFaceVideoRecord(data: any) { + return request.get('/ai/changeface/list', data); + } + // ai图片换脸模块------------------------------------------- + + /** + * @description ai换脸 + */ + static generateChangeImg(data: any) { + return request.post('/ai/img/generate', data); + } + /** + * @description AI视频换脸生成记录列表 + */ + static getAiChangeFaceImgRecord(data: any) { + return request.get('/ai/img/list', data); + } + /** + * @description ai换脸隐藏 + */ + static delelteChangeImgFace(data: any) { + return request.post('/ai/img/hide', data); + } + + /** + * @description ai换脸模版 + */ + static getChangeFaceMod(data: any) { + return request.get('/ai/changeface/mod/list', data); + } + // ai绘图------------------------------------------- + /** + * @description ai绘图 + */ + static setAiTextToImageGenerate(data: any) { + return request.post('/ai/text_to_image/generate', data); + } + /** + * @description ai绘图记录 + */ + static getChangeTextCoverMod(data: any) { + return request.get('/ai/text_to_image/list', data); + } + /** + * @description ai绘图删除 + */ + static delelteChangeTextCover(data: any) { + return request.post('/ai/text_to_image/hide', data); + } + /** + * @description 分享到ai广场 + */ + static aiplazaShare(data: any) { + return request.post('/aiplaza/share', data); + } + /** + * @description 暗网vip会员卡 + */ + static getAwVip() { + return request.get('/product/getAwVip'); + } + /** + * @description 检查消息小红点 + */ + static getCheckMessageTip() { + return request.get('/ping/checkMessageTip'); + } + + /** + * @description 用户余额查询 + */ + static getAimateGetBalance(data: any) { + return request.get('/aimate/getBalance', data); + } + + /** + * @description 登陆 + */ + static getAimateLogin(data: any) { + return request.get('/aimate/login', data); + } + + /** + * @description AI女友货币列表 + */ + static getAimateCurrencys(data: any) { + return request.get('/aimate/currencys', data); + } + + /** + * @description AI女友积分兑换 + */ + static postAimateExchange(data: any) { + return request.post('/aimate/exchange', data); + } + + /** + * @description 获取原味商城链接 + */ + static getStoreUrl() { + return request.get('/ping/store_url'); + } + + /* @description 生成ai小说 + */ + static generateTextToNovel(data: any) { + return request.post('/ai_text_to_novel/generate', data); + } + + /** + * @description ai小说详情 + */ + static getAiTextNovelDetail(data: any) { + return request.get('/ai_text_to_novel/info', data); + } + + /** + * @description AI小说记录 + */ + static getAiTextNovelRecord(data: any) { + return request.get('/ai_text_to_novel/list', data); + } + + /** + * @description ai小说删除 + */ + static delelteAiTextNovel(data: any) { + return request.post('/ai_text_to_novel/hide', data); + } + + /** + * @description 获取 AI 女友 H5 链接 + */ + static getAimatev2Url() { + return request.post<{ url?: string }>('/aimatev2/url'); + } +} diff --git a/src/service/payment.ts b/src/service/payment.ts new file mode 100644 index 0000000..67e8aef --- /dev/null +++ b/src/service/payment.ts @@ -0,0 +1,17 @@ +import request from '@/utils/request'; + +export default class PaymentApi { + /** + * @description 获取付费引导 + */ + static getPaymentGuide(params: Types.Payment.GetPaymentGuideParams): Promise { + return request.get('/payment/guide', params); + } + + /** + * @description 付费引导展示回执,仅在弹窗实际展示成功后调用 + */ + static reportGuideImpression(data: Types.Payment.GuideImpressionParams): Promise { + return request.post('/payment/guide/impression', data); + } +} diff --git a/src/service/personal.ts b/src/service/personal.ts new file mode 100644 index 0000000..fdb3042 --- /dev/null +++ b/src/service/personal.ts @@ -0,0 +1,40 @@ +import request from '@/utils/request'; +export default class personal { + /** +* @description 签到任务列表详情 +*/ + static mineInfo() { + return request.get('/mine/info'); + } + /** + * @description 签到任务列表详情 + */ + static mineRights(data: any) { + return request.get('/mine/rights', data); + } + /** + * @description 个人中心作品 + */ + static mineCollection(data: any): Promise { + return request.get('/mine/collection', data); + } + /** + * @description 个人中心广场列表 + */ + static vidList(data: any) { + return request.get('/vid/list', data); + } + /** + * @description 已购 + */ + static buyVid(data: any) { + return request.get('/mine/buyVid', data); + } + /** + * @description 个人中心喜欢 + */ + static likeList(data: any) { + return request.get('/mine/like', data); + } + +} \ No newline at end of file diff --git a/src/service/promote.ts b/src/service/promote.ts new file mode 100644 index 0000000..ba1bb91 --- /dev/null +++ b/src/service/promote.ts @@ -0,0 +1,12 @@ +import request from '@/utils/request'; + +export default class PromoteApi { + + /** + * @description 查询app推广信息 + */ + static queryUserinviteInfo() { + return request.post('/userinvite/info'); + } + +} \ No newline at end of file diff --git a/src/service/short-drama.ts b/src/service/short-drama.ts new file mode 100644 index 0000000..a865e29 --- /dev/null +++ b/src/service/short-drama.ts @@ -0,0 +1,367 @@ +import request from '@/utils/request'; +import { createUuid } from '@/utils/uuid'; +import MediaApi from '@/service/media'; + +const DRAMA_EPISODE_PRODUCT_TYPE = 19 as const; + +const SORT_TYPE_MAP: Record = { + hot: 1, + latest: 2, + collect: 4, +}; + +/** 标签详情页 /media/library/search 排序码 */ +const TAG_SORT_TYPE_MAP: Record = { + hot: 1, + latest: 2, + collect: 4, +}; + +function mapLockStatus(episode: Types.ShortDrama.EpisodeListItem): Types.ShortDrama.EpisodeLockStatus { + if (episode.isFree) return 'free'; + if (episode.canPlay) return 'unlocked'; + return 'locked'; +} + +function normalizeDramaTags(raw: unknown): Types.ShortDrama.DramaTag[] { + if (!Array.isArray(raw)) return []; + const list: Types.ShortDrama.DramaTag[] = []; + for (const item of raw) { + if (!item || typeof item !== 'object') continue; + const name = String((item as { name?: string }).name || '').trim(); + if (!name) continue; + list.push({ + id: String((item as { id?: string }).id || ''), + name, + }); + } + return list; +} + +function mapSeries(info: Types.ShortDrama.DramaInfo): Types.ShortDrama.DramaSeries { + return { + id: info.id, + title: info.title || (info as { name?: string }).name || '', + coverUrl: info.verticalCover || info.horizontalCover || '', + totalEpisodes: Number(info.totalEpisode || 0), + heatCount: Number(info.countBrowse || 0), + commentCount: Number(info.countComment || 0), + likeCount: Number(info.countLike || 0), + collectCount: Number(info.countCollect || 0), + hasLiked: info.mediaStatus?.hasLiked, + hasCollected: info.mediaStatus?.hasCollected, + tags: normalizeDramaTags(info.tagDetails), + seriesStatus: info.updateStatus === 2 ? 'finished' : 'serializing', + resume: info.resume || null, + }; +} + +function getSeriesCover(series?: Types.ShortDrama.DramaInfo | Types.ShortDrama.DramaSeries): string { + if (!series) return ''; + if ('verticalCover' in series) return series.verticalCover || series.horizontalCover || ''; + return series.coverUrl || ''; +} + +/** 接口 playTime 与站内其它视频一致,按秒;≥10000 兼容误传毫秒 */ +function toDurationSec(playTime: number): number { + const n = Number(playTime) || 0; + if (n <= 0) return 0; + if (n >= 10000) return Math.round(n / 1000); + return Math.round(n); +} + +function mapEpisode( + episode: Types.ShortDrama.EpisodeListItem, + series?: Types.ShortDrama.DramaInfo | Types.ShortDrama.DramaSeries, +): Types.ShortDrama.DramaEpisode { + const isDramaInfo = Boolean(series && 'countLike' in series); + const dramaInfo = isDramaInfo ? (series as Types.ShortDrama.DramaInfo) : undefined; + const seriesView = isDramaInfo ? undefined : (series as Types.ShortDrama.DramaSeries | undefined); + return { + id: episode.id, + mediaId: episode.mediaId, + episodeNumber: episode.episodeNumber, + title: episode.name, + coverUrl: episode.cover || getSeriesCover(series), + videoUrl: episode.videoUrl || '', + h265Url: episode.h265Url || '', + playUrl: episode.videoUrl || episode.h265Url || '', + likeCount: Number(dramaInfo?.countLike || seriesView?.likeCount || 0), + commentCount: Number(dramaInfo?.countComment || seriesView?.commentCount || 0), + collectCount: Number(dramaInfo?.countCollect || seriesView?.collectCount || 0), + hasLiked: dramaInfo?.mediaStatus?.hasLiked ?? seriesView?.hasLiked, + hasCollected: dramaInfo?.mediaStatus?.hasCollected ?? seriesView?.hasCollected, + durationSec: toDurationSec(episode.playTime), + // 播放进度只走本地 IndexedDB,不使用后端 progressSeconds + // currentTimeSec: Number(episode.progressSeconds || 0), + currentTimeSec: 0, + ratio: Number(episode.ratio) || 0, + tags: dramaInfo?.tagDetails || seriesView?.tags, + lockStatus: mapLockStatus(episode), + unlockCoins: Number(episode.price || 0), + canPlay: Boolean(episode.canPlay), + accessType: episode.accessType, + }; +} + +const EPISODE_PAGE_SIZE = 200; + +async function fetchEpisodeListPage( + mediaId: string, + pageNumber: number, + pageSize = EPISODE_PAGE_SIZE, +): Promise { + return ( + (await request.get('/media_content/list', { + mediaId, + sortType: 0, + pageNumber, + pageSize, + })) || { total: 0, hasNext: false, list: [] } + ); +} + +/** 拉取分集,直到 predicate 为真或没有更多(用于尽快拿到开播集,其余页后台补) */ +async function fetchEpisodesUntil( + mediaId: string, + predicate: (list: Types.ShortDrama.EpisodeListItem[]) => boolean, +): Promise<{ list: Types.ShortDrama.EpisodeListItem[]; nextPage: number; hasMore: boolean }> { + let pageNumber = 1; + let hasNext = true; + const list: Types.ShortDrama.EpisodeListItem[] = []; + + while (hasNext) { + const res = await fetchEpisodeListPage(mediaId, pageNumber); + const pageList = res?.list || []; + list.push(...pageList); + hasNext = Boolean(res?.hasNext) && pageList.length > 0; + pageNumber += 1; + if (predicate(list) || pageNumber > 20) break; + if (!hasNext) break; + } + + return { + list, + nextPage: pageNumber, + hasMore: hasNext, + }; +} + +async function fetchEpisodesFromPage( + mediaId: string, + startPage: number, +): Promise { + let pageNumber = Math.max(1, startPage); + let hasNext = true; + const list: Types.ShortDrama.EpisodeListItem[] = []; + + while (hasNext && pageNumber <= 20) { + const res = await fetchEpisodeListPage(mediaId, pageNumber); + const pageList = res?.list || []; + list.push(...pageList); + hasNext = Boolean(res?.hasNext) && pageList.length > 0; + pageNumber += 1; + } + + return list; +} + +function getRequestErrorCode(error: unknown): string { + if (error instanceof Error && error.message) return error.message; + return ''; +} + +export default class ShortDramaApi { + static async getAiDramaFeed(pageSize = 20): Promise { + const res = await request.get('/media/drama/feed', { pageSize }); + const list = (res?.list || []).map((item) => ({ + series: mapSeries(item.media), + episode: mapEpisode(item.content, item.media), + })); + return { + list, + hasNext: Boolean(res?.hasNext), + queueVersion: res?.queueVersion, + }; + } + + static async getHotDramaList( + sort: Types.ShortDrama.HotDramaSort, + pageNumber: number, + pageSize = 20, + ): Promise { + const res = await request.get('/media/drama/list', { + sortType: SORT_TYPE_MAP[sort], + pageNumber, + pageSize, + }); + return { + list: (res?.list || []).map(mapSeries), + hasNext: Boolean(res?.hasNext), + }; + } + + /** 短剧标签详情列表 */ + static async getDramaTagList( + tagID: string, + sort: Types.ShortDrama.HotDramaSort, + pageNumber: number, + pageSize = 20, + ): Promise { + const res = await MediaApi.getMediaLibrarySearch({ + tagIds: [tagID], + sortType: TAG_SORT_TYPE_MAP[sort], + pageNumber, + pageSize, + mediaType: 'drama', + }); + return { + list: (res?.list || []).map((item) => + mapSeries({ + ...(item as unknown as Types.ShortDrama.DramaInfo), + title: item.title || item.name || '', + tagDetails: Array.isArray(item.tagDetails) ? item.tagDetails : [], + countBrowse: Number(item.countBrowse || 0), + countComment: Number(item.countComment || 0), + countCollect: Number(item.countCollect || 0), + countLike: Number(item.countLike || 0), + totalEpisode: Number(item.totalEpisode || 0), + updateStatus: (item.updateStatus === 2 ? 2 : 1) as 1 | 2, + }), + ), + hasNext: Boolean(res?.hasNext), + }; + } + + /** + * 首屏:media/info 与分集列表并行;只拉到「开播目标集」所在页即返回,其余页可后台补。 + */ + static async getDramaDetailBootstrap( + seriesId: string, + opts?: { targetEpisodeNumber?: number; targetEpisodeId?: string }, + ): Promise<{ + series: Types.ShortDrama.DramaSeries; + episodes: Types.ShortDrama.DramaEpisode[]; + nextPage: number; + hasMore: boolean; + }> { + const targetNumber = opts?.targetEpisodeNumber; + const targetId = opts?.targetEpisodeId; + + const infoPromise = request.get('/media/info', { id: seriesId }); + const listPromise = fetchEpisodesUntil(seriesId, (list) => { + if (targetId && list.some((ep) => ep.id === targetId)) return true; + if (targetNumber != null && list.some((ep) => ep.episodeNumber === targetNumber)) return true; + // 无明确目标:有第一页数据即可开播 + if (!targetId && targetNumber == null) return list.length > 0; + return false; + }); + + const [info, pageResult] = await Promise.all([infoPromise, listPromise]); + const series = mapSeries(info); + return { + series, + episodes: pageResult.list.map((item) => mapEpisode(item, info)), + nextPage: pageResult.nextPage, + hasMore: pageResult.hasMore, + }; + } + + /** 从指定页起拉完剩余分集(后台补齐选集列表) */ + static async getDramaEpisodesFromPage( + seriesId: string, + series: Types.ShortDrama.DramaSeries, + startPage: number, + ): Promise { + if (startPage < 1) return []; + const list = await fetchEpisodesFromPage(seriesId, startPage); + return list.map((item) => mapEpisode(item, series)); + } + + static async getDramaDetail(seriesId: string): Promise { + const boot = await this.getDramaDetailBootstrap(seriesId); + if (!boot.hasMore) { + return { series: boot.series, episodes: boot.episodes }; + } + const rest = await this.getDramaEpisodesFromPage(seriesId, boot.series, boot.nextPage); + return { + series: boot.series, + episodes: [...boot.episodes, ...rest], + }; + } + + static async getEpisodeInfo(contentId: string): Promise { + return request.get('/media_content/info', { id: contentId }); + } + + static applyEpisodeInfo( + info: Types.ShortDrama.EpisodeInfo, + series?: Types.ShortDrama.DramaSeries, + ): Types.ShortDrama.DramaEpisode { + return mapEpisode(info, series); + } + + static async buyEpisode(params: { + mediaId: string; + contentId: string; + checkoutContextId: string; + }): Promise { + return request.post( + '/product/buy', + { + productType: DRAMA_EPISODE_PRODUCT_TYPE, + productID: params.mediaId, + contentID: params.contentId, + checkoutContextId: params.checkoutContextId, + }, + { + headers: { + 'X-Request-ID': createUuid(), + }, + }, + ); + } + + static getBuyErrorCode(error: unknown): string { + return getRequestErrorCode(error); + } + + /** 我的喜欢-短剧 */ + static async getMineLikeList(pageNumber: number, pageSize = 12): Promise { + const res = await request.get('/mine/like', { + likeType: 'drama', + pageNumber, + pageSize, + }); + return { + list: (res?.list || []).map(mapSeries), + hasNext: Boolean(res?.hasNext), + }; + } + + /** 我的收藏-短剧(书架) */ + static async getMineCollectList(pageNumber: number, pageSize = 12): Promise { + const res = await request.get('/media_bookshelf/list', { + type: 'drama', + pageNumber, + pageSize, + }); + return { + list: (res?.list || []).map(mapSeries), + hasNext: Boolean(res?.hasNext), + }; + } + + /** 我的已购-短剧 */ + static async getMineBuyList(pageNumber: number, pageSize = 12): Promise { + const res = await request.get('/media/my_buy', { + mediaType: 'drama', + pageNumber, + pageSize, + }); + return { + list: (res?.list || []).map(mapSeries), + hasNext: Boolean(res?.hasNext), + }; + } +} diff --git a/src/service/user.ts b/src/service/user.ts new file mode 100644 index 0000000..0066a6e --- /dev/null +++ b/src/service/user.ts @@ -0,0 +1,329 @@ +import request from '@/utils/request'; +export default class UserApi { + /** + * @description 获取金币钱包信息 + * @returns + */ + static queryWallet(): Promise { + return request.get('/mine/wallet'); + } + + /** + * @description 查询用户信息 + * @param data + */ + static queryUserInfo(data: any): Promise { + return request.get('/mine/info', data); + } + + /** + * @description 补签打卡 + * @param data + */ + static reSigin(data: any) { + return request.post('/sign_record/resign', data); + } + + /** + * @description 修改个人资料 + * @param data + */ + static editPersonInfo(data: any) { + return request.post('/mine/info', data); + } + + /** + * @description 填写推广码 + * @param data + */ + static inviteBind(data: any) { + return request.post('/mine/inviteBind', data); + } + + /** + * @param followUID 用户id + * @param isFollow 是否关注 + * @description 关注或者取消关注 + * @returns + */ + static followCancel(followUID: number, isFollow: boolean) { + return request.post('/mine/follow', { followUID, isFollow }); + } + + /** + * @description 获取用户凭证 + */ + static queryCertificate() { + return request.get('/mine/certificate/qr'); + } + + /** + * @description 获取我的推广信息 + */ + static queryUserInviteInfo() { + return request.post('/userinvite/info'); + } + + /** + * @description 获取我的推广用户列表 + */ + static queryUserInviteList(data: any) { + return request.post('/userinvite/userlist', data); + } + + /** + * @description 使用兑换码 + */ + static useExchange(data: any) { + return request.post('/code/exchange', data); + } + + /** + * @description 获取我的兑换记录列表 + */ + static queryExchangeRecord(data: any) { + return request.get('/code/userRecord', data); + } + + /** + * @description 获取客服链接接口 + */ + static queryCustomerServiceUrl() { + return request.get('/customer/url'); + } + + /** + * @description 意见反馈 + */ + static feedback(data: object) { + return request.post('/mine/feedback', data); + } + + /** + * @description 获取优惠卷 + */ + static queryBackpack(data: any) { + return request.get('/backpack', data); + } + + /** + * @description 获取加购卷 + */ + static queryGoldExtraList(data: any) { + return request.get('/goldExtra/userList', data); + } + + /** + * @description 上传解析二维码 + */ + static parseQrcode(data: any) { + return request.post('/mine/qrcode/extract', data, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + } + + /** + * @description 上传图片 + */ + static upload(data: any) { + return request.post('/vid/uploadStatic', data, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + } + + /** + * @description 扫码登录 + */ + static loginGuest(data: any) { + return request.post('/mine/login/h5/qr', data); + } + + /** + * @description 获取交易记录 + */ + static queryZhangdanList(data: any) { + return request.get('/mine/zhangdan', data); + } + + /** + * @description 获取已购视频 + */ + static queryBuyVidList(data: any) { + return request.get('/mine/buyVid', data); + } + + /** + * @description 查询作品管理 + */ + static queryCollectionList(data: any) { + return request.get('/mine/collection', data); + } + + /** + * @description 查询创作中心的创作视频数据 + */ + static queryPublishDetails() { + return request.get('/publish/details'); + } + + /** + * @description 查询周榜详情 + */ + static queryLeaderboardList(data: any) { + return request.get('/publish/leaderboard', data); + } + + /** + * @description 查询我的收藏视频 + */ + static queryCollectList(data: any) { + return request.get('/mine/collect/infoList', data); + } + + /** + * @description 查询我的收藏视频(喜欢) + */ + static queryLikeList(data: any) { + return request.get('/mine/like', data); + } + + /** + * @description 发送验证码 + */ + static getCaptcha(data: any) { + return request.post('/notification/captcha', data); + } + + /** + * @description 绑定手机/邮箱 + */ + static bindAccount(data: any) { + return request.post('/mine/mobileBind', data); + } + + /** + * @description 查询推广记录(邀请列表) + */ + static queryUserinviteList(data: any) { + return request.post('/userinvite/userlist', data); + } + + /** + * @description 获取推广收益列表 + */ + static queryIncomelist(data: any) { + return request.post('/userinvite/incomelist', data); + } + + /** + * @description 获取视频推广收益列表 + */ + static queryVideolist(data: any) { + return request.post('/userinvite/videolist', data); + } + + /** + * @description 获取粉丝列表 + */ + static queryFollowFansList(data: any) { + return request.get('/follow/fans/list', data); + } + + /** + * @description 获取关注列表 + */ + static queryFollowList(data: any) { + return request.get('/follow/list', data); + } + + /** + * @description 获取获赞列表 + */ + static queryLikeRecordList(data: any) { + return request.get('/like/record/list', data); + } + + /** + * @description 兑换码 + */ + static exchangeCode(data: any) { + return request.post('/code/exchange', data); + } + + /** + * @description 积分兑换 + */ + static exchangeIntegral(data: any) { + return request.post('/product/exchangeIntegral', data); + } + + /** + * @description 收益列表 + */ + static getIncomList(data: any) { + return request.get('/mine/iIncomes', data); + } + + /** + * @description 我的评论 + */ + static getCmment(data: any) { + return request.get('/mine/comment', data); + } + /** + * @description 取消收藏 + */ + static delCollect(data: any) { + return request.post('/mine/collect', data); + } + // /** + // * @description vip推荐展示 + // */ + // static getVipRecommend() { + // return request.get('/vip/recommend'); + // } + /** + * @description 找回手机/邮箱 + */ + static findAccount(data: any) { + return request.post('/mine/mobileLoginOnly', data); + } + /** + * @description 获取已购 动漫 小说 漫画 + */ + static mediaMybuy(data: any) { + return request.get('/media/my_buy', data); + } + /** + * @description 我发布的帖子列表 + */ + static minePublish(data: any) { + return request.get('/mine/publish', data); + } + /** + * @description 删除我发布的帖子 + */ + static minePublishDelete(data: any) { + return request.post('/mine/publish/delete', data); + } + /** + * @description 头像列表 + * @param data 参数 + * @returns + */ + static avatarList(data: Record) { + return request.get('/mine/userresource/list', data); + } + /** + * @description 头像列表新 + * @param data 参数 + * @returns + */ + static portraitList(data: Record) { + return request.get('/mine/portrait', data); + } +} diff --git a/src/service/video.ts b/src/service/video.ts new file mode 100644 index 0000000..10f3c1f --- /dev/null +++ b/src/service/video.ts @@ -0,0 +1,265 @@ +import { LikeType } from '@/enums/app'; +import request from '@/utils/request'; +export default class VideoApi { + /** + * @description 获取随机短视频 + * @param pageNumber 页数 + * @param pageSize 每页数量 + * @returns + */ + static getRecommendVidList(pageNumber: number, pageSize = 20): Promise { + return request.get('/recommend/vid/list', { + pageNumber, + pageSize, + }); + } + /** + * @description 获取随机短视频 + * @param productType 产品类型 + * @param productID 产品id + * @param chapterID 章节名字 + * @param couponId 优惠卷ID + * @param serviceId 裸聊服务ID + * @param goldVideoCouponNum 金币视频抵用券金币面值 + * @param IsH5 是否H5 + * @returns + */ + static videoBuying(data: Types.Video.ProductBuyType): Promise { + return request.post('/product/buy', { + productType: data.productType, + productID: data.productID, + chapterID: data.chapterID, + couponId: data.couponId, + serviceId: data.serviceId, + goldVideoCouponNum: data.goldVideoCouponNum, + IsH5: true, + }); + } + + /** + * @description 获取短视频广告 + * @param vid 视频id + * @returns + */ + static getShortVideoAd() { + return request.get('/recommend/vid/ad'); + } + + /** + * @description 获取免费 + * @param vid 视频id + * @returns + */ + static getPlayCount(vid: string): Promise { + return request.get('/vid/user/count', { + vid, + }); + } + /** + * @description 点赞 + * @param objID 视频id + * @param LikeType 类型 + * @returns + */ + static like(objID: string, type: LikeType) { + return request.post('/thumbsUp', { + objID, + type, + }); + } + /** + * @description 取消点赞 + * @param vid 视频id + * @param LikeType 类型 + * @returns + */ + static cancleLike(objID: string, type: LikeType) { + return request.post('/thumbsDown', { + objID, + type, + }); + } + /** + * @description 点赞 + * @param data 参数 + * @returns + */ + static zan(data: any): Promise { + return request.post('/thumbsUp', data); + } + /** + * @description 取消点赞 + * @param data 参数 + * @returns + */ + static cancleZan(data: any): Promise { + return request.post('/thumbsDown', data); + } + /** + * @description 获取关注用户的视频列表 + * @param pageNumber 页数 + * @param pageSize 每页数量 + * @returns + */ + static queryFocusVideoList(pageNumber: number, pageSize: number): Promise { + return request.get('/follow/dynamics/list', { + pageNumber, + pageSize, + }); + } + /** + * @description 获取城市视频 + * @param pageNumber 页数 + * @param pageSize 每页数量 + * @param city 城市 + * @returns + */ + static queryLocationList(pageNumber: number, pageSize: number, city: string): Promise { + return request.get('/vid/location/list', { + pageNumber, + pageSize, + city, + }); + } + + /** + * @description 查询我的已购视频 + * @param pageNumber 页数 + * @param pageSize 每页数量 + * @returns + */ + static querybuyVid(pageNumber: number, pageSize: number): Promise { + return request.get('/mine/buyVid', { + pageNumber, + pageSize, + }); + } + /** + * @description 查询视频详情 + * @param videoID 视频ID + * @returns + */ + static queryVideoInfo(data: any): Promise { + return request.get('/vid/info', data); + } + /** + * @description 查询视频 + * @param data + * @returns + */ + static queryCollection(data: any): Promise { + return request.get('/mine/collection', data); + } + /** + * @description 精彩推荐 + * @param data + * @returns + */ + static queryRecommend(data: any): Promise { + return request.get('/vid/recommend/list', data); + } + /** + * @description 查询推荐视频 + * @param data + * @returns + */ + static queryModuleVideoList(data: any): Promise { + return request.post('/vid/moduleVideo', data); + } + /** + * @description 获取帖子评论 + * @param data 参数 + * @returns + */ + static getCommentList(data: any): Promise { + return request.get('/comment/list', data); + } + /** + * @description 帖子评论 + * @param data 参数 + * @returns + */ + static sendComment(data: any): Promise { + return request.post('/comment/send', data); + } + /** + * @description 热点推荐 + * @param data 参数 + * @returns + */ + static getHotRecommend(data: any): Promise { + return request.get('/search/hotTag', data); + } + /** + * @description 猜你喜欢的帖子 + * @param data 参数 + * @returns + */ + static getPost(data: any): Promise { + return request.get('/search/hotPublisher/list', data); + } + /** + * @description 搜索帖子 + * @param data 参数 + * @returns + */ + static searchPost(data: any): Promise { + return request.post('/search/list', data); + } + /** + * @description 根据标签搜索帖子 + * @param data 参数 + * @returns + */ + static searchTagPost(data: any): Promise { + return request.get('/tag/vid/list', data); + } + //视频播放调用接口 + static getPlayVideo(data: any): Promise { + return request.post(`/vid/play`, data); + } + /** + * @description 搜索帖子--只用于发布 + * @param data 参数 + * @returns + */ + static searchPublishPost(): Promise { + return request.get('/search/publisher/list'); + } + + /** + * @description 热门视频列表 + * @param data 参数 + * @returns + */ + static getHotVidList(data: any) { + return request.get('/search/hotVid/list', data); + } + + /** + * @description 获取vip折扣专区 + * @param data 参数 + * @returns + */ + static getVidDiscountArea() { + return request.get('/vid/discount/area'); + } + + /** + * @description 获取vip折扣专区下的视频 + * @param data 参数 + * @returns + */ + static getVidDiscountList(data: any) { + return request.get('/vid/discount/list', data); + } + + /** + * @description 猜你喜欢 + * @param data 参数 + * @returns + */ + static getGuessYouLike(data: any) { + return request.get('/vid/module/all/' + data.id, data.data); + } +} diff --git a/src/stores/acg.ts b/src/stores/acg.ts new file mode 100644 index 0000000..56e436b --- /dev/null +++ b/src/stores/acg.ts @@ -0,0 +1,45 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; + +import MediaApi from '@/service/media'; + +export const useAcgStore = defineStore('acg', () => { + const library = ref([] as Types.Media.Library[]); + const getLibrary = async () => { + if (library.value.length) { + return library.value; + } + const res = await MediaApi.getMediaLibrary(); + library.value = res; + return library.value; + }; + + const tabList = [ + { + id: 4, + moduleName: '漫画', + key: 'image', + }, + { + id: 5, + moduleName: '动漫', + key: 'video', + }, + // { + // id: 5, + // moduleName: '有声漫', + // key: 'image5', + // }, + { + id: 6, + moduleName: '小说', + key: 'text', + }, + ]; + + return { + library, + getLibrary, + tabList, + }; +}); diff --git a/src/stores/app.ts b/src/stores/app.ts new file mode 100644 index 0000000..4d8fd4c --- /dev/null +++ b/src/stores/app.ts @@ -0,0 +1,130 @@ +import { defineStore } from 'pinia'; + +export const useAppStore = defineStore({ + id: 'app', + state: () => { + return { + uid: '', + dc: localStorage.getItem('dc') || '', + citySearchRecord: >[], // 城市搜索记录 + postSearchRecord: >[], // 社区帖子搜索记录 + homeSearchRecord: >[], // 首页帖子搜索记录 + bankCard: {}, // 选中的银行卡信息 + lineIndex: 1, + //是否未保存账号凭证 + isCertificate: true, + shortVideoPopupAds: true, + shortVideoPureMode: false, // 是不是短视频纯净模式 + shortDramaPureMode: false, // 短剧清屏:跨集/跨卡片保持 + }; + }, + actions: { + setShortVideoPureMode(v: boolean) { + this.shortVideoPureMode = v; + }, + setShortDramaPureMode(v: boolean) { + this.shortDramaPureMode = v; + }, + toggleShortDramaPureMode() { + this.shortDramaPureMode = !this.shortDramaPureMode; + }, + setShortVideoPopupAds(v: boolean) { + this.shortVideoPopupAds = v; + }, + //生成一个唯一字符串 + generateUid() { + const len = 16; + let radix = 16; + const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); + const uuid: Array = []; + let i: number; + radix = radix || chars.length; + if (len) { + for (i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)]; + } else { + let r; + uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; + uuid[14] = '4'; + for (i = 0; i < 36; i++) { + if (!uuid[i]) { + r = 0 | (Math.random() * 16); + uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r]; + } + } + } + const uid = uuid.join('') + Date.now(); + if (!this.uid) { + this.uid = uid; + } + }, + setUid(uid: string) { + this.uid = uid; + }, + setDc(dc: string) { + this.dc = dc; + localStorage.setItem('dc', dc); + }, + // 获取城市记录 + getCityRecord() { + return this.citySearchRecord; + }, + // 设置城市记录 + setCityRecord(city: string) { + if (!city) return; + this.citySearchRecord.unshift(city); + // 数组去重 + this.citySearchRecord = [...new Set(this.citySearchRecord)]; + if (this.citySearchRecord.length > 10) { + this.citySearchRecord = this.citySearchRecord.slice(0, 10); + } + }, + // 获取帖子记录 + getPostRecord() { + return this.postSearchRecord; + }, + // 设置帖子搜索记录 + setPostRecord(post: string) { + if (!post) return; + this.postSearchRecord.unshift(post); + // 数组去重 + this.postSearchRecord = [...new Set(this.postSearchRecord)]; + }, + // 清空帖子搜索记录 + clearPostRecord() { + this.postSearchRecord = []; + }, + // 获取首页帖子记录 + getHomeRecord() { + return this.homeSearchRecord; + }, + // 设置首页帖子搜索记录 + setHomeRecord(post: string) { + if (!post) return; + this.homeSearchRecord.unshift(post); + // 数组去重 + this.homeSearchRecord = [...new Set(this.homeSearchRecord)]; + }, + // 删除搜索记录 + delSearchRecord(val: string) { + this.homeSearchRecord = this.homeSearchRecord.filter((item: string) => item != val); + }, + // 清空首页帖子搜索记录 + clearHomeRecord() { + this.homeSearchRecord = []; + }, + // 设置选中的银行卡 + setBankCard(bankCard: Types.Recharge.BankCardItem) { + this.bankCard = bankCard; + }, + setLineIndex(index: number) { + this.lineIndex = index; + }, + setCertificate() { + this.isCertificate = false; + }, + }, + persist: { + key: 'app', + storage: window.localStorage, + }, +}); diff --git a/src/stores/community.ts b/src/stores/community.ts new file mode 100644 index 0000000..4413c3d --- /dev/null +++ b/src/stores/community.ts @@ -0,0 +1,21 @@ +import { defineStore } from 'pinia'; + +export const useCommunityStore = defineStore({ + id: 'community', + state: () => { + return { + tags: {}, //话题 + token: '', + }; + }, + actions: { + //保存选择的帖子板块 + setTopics(data: any) { + this.tags = data; + }, + }, + persist: { + key: 'community', + storage: window.sessionStorage, + }, +}); diff --git a/src/stores/config.ts b/src/stores/config.ts new file mode 100644 index 0000000..b032873 --- /dev/null +++ b/src/stores/config.ts @@ -0,0 +1,46 @@ +import { defineStore } from 'pinia'; + +export const useConfigStore = defineStore({ + id: 'config', + state: () => { + return { + baseUrl: '', //选线成功的api域名 + appConfig: {}, //全局配置 + sourceInfo: { + //资源配置 + GROUP: '', + GUIDE: '', + AUDIO: '', + IMAGE: '', + VID: [], + LAND: '', + PROXYRULE: '', + FAQ: '', + QRCODE: '', + WELFARE: '', + ACT: '', + AppStore: '', + UP: '', + PRESALEBGIMG: '', + }, + }; + }, + actions: { + //保存api域名 + saveBaseUrl(url: string) { + this.baseUrl = url; + }, + //保存全局配置 + saveAppConfig(appConfig: Types.App.ConfigInfo) { + this.appConfig = appConfig; + }, + //保存资源域名配置 + saveSourceInfo(sourceInfo: Types.App.SourceInfo) { + this.sourceInfo = sourceInfo; + }, + }, + persist: { + key: 'config', + storage: window.sessionStorage, + }, +}); diff --git a/src/stores/global.ts b/src/stores/global.ts new file mode 100644 index 0000000..c214ff3 --- /dev/null +++ b/src/stores/global.ts @@ -0,0 +1,446 @@ +import { defineStore } from 'pinia'; +import HomeApi from '@/service/home'; + +export const useGlobalStore = defineStore({ + id: 'global', + state: () => { + return { + keepAliveList: [], //需要缓存的页面 + mainViewKeep: [], // tab页缓存 + currentShortTab: '', //短视频选择的tab + nineGridFirst: false, // 九宫格第一次 + announcementFirst: false, // app公告第一次 + homeAdvFirst: false, // 首页弹窗广告第一次 + homePaymentPopupFirst: false, // 首页付费分层弹窗第一次 + marqueeDatas: '', // 首页的跑马灯 + presaleFirst: false, // 预售弹窗第一次 + payPresaleFirst: false, // 支付预售尾款弹窗第一次 + presaleObj: { + status: 0, // 活动状态 1:已开启未购买预售;2:已购买预售未开启尾款;3:已开启尾款未购买;4:购买尾款(其实就是关闭当前用户的预售活动) + activityDetail: null, // 预售活动信息 + list: null, // 预售视频列表 + timeStrPay: '', // 预售尾款活动倒计时 + timeStrCoinPay: '', // 预售尾款活动倒计时金币弹窗样式 + }, // 预售信息对象 + advanceStatus: {}, // 预售状态 + preSaleCoinShortVideoPlay: false, // 预售金币短视频视频是否可以观看 + preSaleCoinVideoPlay: false, // 预售金币视频是否可以观看 + joinGameingFirst: false, //游戏活动弹框第一次 + selectedRoadLine: 'normal', // 选择的视频路线,默认为普通,vip为会员 + tabObj: {} as any, // 首页、社区的tab + videoRoadLine: {}, // 选择的线路 + postList: { + currentIndex: 0, //当前查看的帖子索引 + list: [], // 帖子列表(做上一页/下一页) + }, + shareInfo: {}, // 分享信息 + activeIndex: 1, // 导航选中的当前Tab索引 + darkNetActiveIndex: 0, // 暗网导航选中的当前Tab索引 + communityActiveIndex: 0, // 社区导航选中的当前Tab索引 + keepScroll: { + '/home': [], + '/darkNet': [], + '/community': [], + '/searchResults': [], + '/tagShortVideo': [], + }, // 需要保存滚动条 + homePageList: >[], + contentUpdateMarkers: null as Types.Home.ContentUpdateMarkers | null, + preHomeIndex: 0, // 导航选中的上一个索引 + showHomeDrawer: false, // 是否显示侧边栏 + darkNetPageList: >[], + preDarkNetIndex: 0, // 导航选中的上一个索引 + showDarkNetDrawer: false, // 是否显示侧边栏 + keepPathScroll: { + '/home': { + className: 'homeItem', + scrollTop: 0, + isTab: true, + scrollArr: [], + curIndex: 0, + }, + '/searchPage': { + className: 'searchPage', + scrollTop: 0, + curIndex: 0, + }, + '/historyRecord': { + className: 'my-refresh', + scrollTop: 0, + curIndex: 0, + }, + '/tagShortVideo': { + className: 'overflow-y-auto', + scrollTop: 0, + curIndex: 0, + }, + '/searchResults': { + className: 'my-refresh', + scrollTop: 0, + isTab: true, + scrollArr: [], + curIndex: 0, + }, + '/mine': { + className: 'minePage', + scrollTop: 0, + curIndex: 0, + }, + '/collectVideo': { + className: 'my-refresh', + isTab: true, + scrollArr: [], + scrollTop: 0, + curIndex: 0, + }, + '/purchasedVideo': { + className: 'my-refresh', + isTab: true, + scrollArr: [], + scrollTop: 0, + curIndex: 0, + }, + '/follow': { + className: 'overflow-y-auto', + isTab: true, + scrollArr: [], + scrollTop: 0, + curIndex: 0, + }, + '/userInfo': { + className: 'overflow-y-auto', + scrollTop: 0, + curIndex: 0, + }, + '/communityTagDeatil': { + className: 'overflow-y-auto', + isTab: true, + scrollArr: [], + scrollTop: 0, + curIndex: 0, + }, + '/messageCenter': { + className: 'my-refresh', + scrollTop: 0, + curIndex: 0, + }, + '/minepostpage': { + className: 'my-refresh', + scrollTop: 0, + curIndex: 0, + }, + '/coverDetail': { + className: 'cover-detail', + scrollTop: 0, + curIndex: 0, + }, + '/darkNet': { + className: 'darkNet', + scrollTop: 0, + isTab: true, + scrollArr: [], + curIndex: 0, + }, + '/presale': { + className: 'overflow-y-auto', + scrollTop: 0, + curIndex: 0, + }, + '/jointGamingActivitie': { + className: 'overflow-y-auto', + scrollTop: 0, + curIndex: 0, + }, + '/liveRoom': { + className: 'overflow-y-auto', + scrollTop: 0, + curIndex: 0, + }, + '/gameDetails': { + className: 'overflow-y-auto', + scrollTop: 0, + curIndex: 0, + }, + }, + }; + }, + actions: { + //保存缓存页面 + saveKeepAliveList(keepAliveList: string[]) { + this.keepAliveList = keepAliveList; + }, + //保存短视频页面当前tab + saveCurrentShortTab(tab: string) { + this.currentShortTab = tab; + }, + //保存TAB缓存 + saveMainViewKeep(mainViewKeep: string[]) { + this.mainViewKeep = mainViewKeep; + }, + // 设置九宫格为第一次 + setNineGridFirst() { + this.nineGridFirst = true; + }, + // 设置app公告为第一次 + setAnnouncementFirst() { + this.announcementFirst = true; + }, + // 设置app首页弹窗为第一次 + setHomeAdvFirst() { + this.homeAdvFirst = true; + }, + // 设置首页付费分层弹窗为第一次 + setHomePaymentPopupFirst() { + this.homePaymentPopupFirst = true; + }, + // 设置app预售弹窗为第一次 + setPresaleFirst() { + this.presaleFirst = true; + }, + // 设置app支付预售尾款弹窗为第一次 + setPayPresaleFirst() { + this.payPresaleFirst = true; + }, + // 获取预售数据 + async setPresaleActivityDetail() { + const req = { + pageNumber: 1, + pageSize: 8, + }; + const res: any = await HomeApi.getPresaleList(req); + this.presaleObj.activityDetail = res.activityDetail; + this.presaleObj.list = res.list; + // 尾款支付活动是否开启 + const isStart = new Date() >= new Date(res.activityDetail.startTime); + if (res.activityDetail.status == 0 || res.activityDetail.status == 1) { + // 已开启未购买预售 + this.presaleObj.status = 1; + } else if ((res.activityDetail.status == 2 || res.activityDetail.status == 3) && !isStart) { + // 已购买预售未开启尾款 + this.presaleObj.status = 2; + } else if ((res.activityDetail.status == 2 || res.activityDetail.status == 3) && isStart) { + // 已开启尾款未购买 + this.presaleObj.status = 3; + // 尾款倒计时 + const timers = new Date(res.activityDetail.endTime).getTime(); + this.countdownPay(timers); + } else if (res.activityDetail.status == 4) { + // 购买尾款(其实就是关闭当前用户的预售活动 + this.presaleObj.status = 0; + } + // 尾款支付时间是否过期 + const endTime = new Date(res.activityDetail.endTime).getTime(); + const newTime = new Date().getTime(); + const diffTime = (endTime - newTime) / 1000; + if (diffTime < 0) { + this.presaleObj.status = 0; + } + }, + showTime(t: number) { + const time = t >= 10 ? t : '0' + t; + return time; + }, + // 支付尾款剩余时间--倒计时 + countdownPay(timer: number) { + const endTime = timer; + const newTime = new Date().getTime(); + const diffTime = (endTime - newTime) / 1000; + const day = parseInt((diffTime / 60 / 60 / 24).toString()); + const honur = parseInt(((diffTime / 60 / 60) % 24).toString()); + const min = parseInt(((diffTime / 60) % 60).toString()); + const sen = parseInt((diffTime % 60).toString()); + if (diffTime > 0) { + this.presaleObj.timeStrPay = `剩余时间: ${this.showTime(day)}天${this.showTime(honur)}:${this.showTime( + min, + )}:${this.showTime(sen)}`; + this.presaleObj.timeStrCoinPay = `仅剩 ${this.showTime(day)}天${this.showTime(honur)}:${this.showTime( + min, + )}:${this.showTime(sen)}`; + } else { + this.presaleObj.status = 0; + } + // 一秒后递归 + setTimeout(() => { + timer--; + this.countdownPay(timer); + }, 1000); + }, + // 设置预售的状态 + setAdvanceStatus(obj: any) { + this.advanceStatus = obj; + }, + // 设置预售金币视频是否可以观看 + setPreSaleCoinVideoPlay(flag: boolean) { + this.preSaleCoinVideoPlay = flag; + }, + // 设置预售金币短视频是否可以观看 + setPreSaleCoinShortVideoPlay(flag: boolean) { + this.preSaleCoinShortVideoPlay = flag; + }, + // 设置游戏活动弹框为第一次 + setJoinGameingFirst() { + this.joinGameingFirst = true; + }, + // 设置播放路线 + setVideoRoadLine(obj: any) { + this.videoRoadLine = obj; + }, + // 设置分享信息 + setShareInfo(obj: any) { + this.shareInfo = obj; + }, + setScrollInfo(key: string, index: number) { + this.keepPathScroll[key].curIndex = index; + }, + updateScroll(key: string | number, sonKey: string | number, sonValue: any, keyIndex?: string | number | undefined) { + if (keyIndex != undefined) { + this.keepPathScroll[key][sonKey][keyIndex] = sonValue; + } else { + this.keepPathScroll[key][sonKey] = sonValue; + } + }, + setTabs() { + HomeApi.getTabs().then((res: any) => { + this.tabObj = res; + const { homePage, deepWeb } = res; + // 首页增加 最新 + homePage.unshift({ + id: 'newest111111111', + moduleName: '最新', + showJG: false, + showType: 100, + type: 100, + }); + if (homePage) { + const ids = (localStorage.getItem('homePageIds') || '').split(','); + if (ids.length) { + const arr = [...homePage]; + const sortedArr: Types.Home.HomeTabItem[] = []; + ids.forEach((id) => { + const index = arr.findIndex((item) => item.id === id); + if (index !== -1) { + sortedArr.push(arr[index]); + } + }); + arr.forEach((item) => { + if (!ids.includes(item.id)) { + sortedArr.push(item); + } + }); + this.homePageList = sortedArr; + } else { + this.homePageList = homePage; + } + } + if (deepWeb) { + const ids = (localStorage.getItem('darkNetPageIds') || '').split(','); + if (ids.length) { + const arr = [...deepWeb]; + const sortedArr: Types.Home.HomeTabItem[] = []; + ids.forEach((id) => { + const index = arr.findIndex((item) => item.id === id); + if (index !== -1) { + sortedArr.push(arr[index]); + } + }); + arr.forEach((item) => { + if (!ids.includes(item.id)) { + sortedArr.push(item); + } + }); + this.darkNetPageList = sortedArr; + } else { + this.darkNetPageList = homePage; + } + } + }); + this.fetchContentUpdateMarkers(); + }, + fetchContentUpdateMarkers() { + HomeApi.getContentUpdateMarkers() + .then((res) => { + this.contentUpdateMarkers = res; + }) + .catch((e) => { + console.log(e); + }); + }, + // 设置跑马灯数据 + setAnnounce() { + HomeApi.queryAnnounce().then((res: any) => { + this.marqueeDatas = res; + }); + }, + /************************************************************** 帖子列表 ************************************************************ */ + /** + * @description 保存帖子列表 + * @param postList 帖子列表 + */ + savePostList(postList: any[], index: number) { + this.postList.list = []; + this.postList.list = postList; + this.postList.currentIndex = index; + this.updatePostListIndex(index); + }, + /** + * @description 修改当前播放视频的索引 + * @param index 修改视频的索引 + */ + updatePostListIndex(index: number) { + this.postList.currentIndex = index; + }, + // 设置是否显示侧边栏 + setShowDrawer(flag: boolean, elType: string) { + switch (elType) { + case 'home': + this.showHomeDrawer = flag; + break; + case 'darkNet': + this.showDarkNetDrawer = flag; + break; + } + }, + // 设置上一个的导航index + setPreIndex(index: number, elType: string) { + switch (elType) { + case 'home': + this.preHomeIndex = index; + break; + case 'darkNet': + this.preDarkNetIndex = index; + break; + } + }, + // 设置社区当前的导航index + setCommunityActiveIndex(index: number) { + this.communityActiveIndex = index; + }, + // 设置当前的导航index + setActiveIndex(index: number, elType: string) { + switch (elType) { + case 'home': + this.activeIndex = index; + break; + case 'darkNet': + this.darkNetActiveIndex = index; + break; + } + }, + updateHomePageList(arr: Types.Home.HomeTabItem[], elType: string) { + // type==1 更改默认数据 + + switch (elType) { + case 'home': + this.homePageList = arr; + break; + case 'darkNet': + this.darkNetPageList = arr; + break; + } + }, + }, + persist: { + key: 'global', + storage: window.sessionStorage, + }, +}); diff --git a/src/stores/index.ts b/src/stores/index.ts new file mode 100644 index 0000000..143bf10 --- /dev/null +++ b/src/stores/index.ts @@ -0,0 +1,5 @@ +import { createPinia } from 'pinia'; +import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'; +const store = createPinia(); +store.use(piniaPluginPersistedstate); +export default store; diff --git a/src/stores/user.ts b/src/stores/user.ts new file mode 100644 index 0000000..37cfad6 --- /dev/null +++ b/src/stores/user.ts @@ -0,0 +1,115 @@ +import UserApi from '@/service/user'; +import MineApi from '@/service/mine'; +import { defineStore } from 'pinia'; + +/** 兼容扁平 user、以及 { userInfo, token } 嵌套回包 */ +function normalizeLoginPayload(payload: { + userInfo: Types.User.UserInfoType; + token: string; +}): { userInfo: Types.User.UserInfoType; token: string } { + const raw = (payload.userInfo && typeof payload.userInfo === 'object' + ? payload.userInfo + : {}) as unknown as Record; + const nested = + raw.userInfo && typeof raw.userInfo === 'object' ? (raw.userInfo as Record) : null; + const hasOuterUid = raw.uid != null && String(raw.uid) !== ''; + const userInfo = (!hasOuterUid && nested?.uid != null ? nested : raw) as unknown as Types.User.UserInfoType; + const token = String(payload.token || raw.token || nested?.token || userInfo?.token || '').trim(); + + if (!token) { + throw new Error('登录失败:未返回 token'); + } + if (userInfo?.uid == null || String(userInfo.uid) === '') { + throw new Error('登录失败:未返回用户信息'); + } + return { userInfo, token }; +} + +export const useUserStore = defineStore({ + id: 'user', + state: () => { + return { + isNewsTip: false, + userInfo: {}, //用户信息 + token: '', + walletInfo: {}, + }; + }, + actions: { + /** 登录/找回账号:必须先写业务 token,再写 userInfo */ + async saveLoginResult(payload: { userInfo: Types.User.UserInfoType; token: string }) { + const { userInfo, token } = normalizeLoginPayload(payload); + this.saveToken(token); + await this.saveUserInfo(userInfo); + }, + //保存用户信息 + async saveUserInfo(userInfo: Types.User.UserInfoType) { + localStorage.setItem('userInfo', JSON.stringify(userInfo)); + this.userInfo = userInfo; + }, + //保存token + saveToken(token: string) { + localStorage.setItem('token', JSON.stringify(token)); + this.token = token; + }, + //更新钱包信息 + updateWallet() { + UserApi.queryWallet().then((data) => { + this.walletInfo = data; + }); + }, + getCheckMessageTip() { + MineApi.getCheckMessageTip().then((data) => { + const { newsTip } = data; + this.isNewsTip = newsTip || false; + }); + }, + // 调用预售消耗 + requestPrivilegeConsume(type: any) { + const req = { + count: 1, + privilegeType: type, + }; + MineApi.privilegeConsume(req); + }, + //更新用户信息 + async updateUserInfo(params: any = null) { + await UserApi.queryUserInfo(params).then((data) => { + this.userInfo = data; + }); + }, + }, + getters: { + //是否为vip + isVip: (state) => { + const vipExpireDate = new Date(state.userInfo?.vipExpireDate)?.getTime(); + const nowTime = new Date().getTime(); + const isvipExpire = vipExpireDate > nowTime ? true : false; + const isVip = state.userInfo.isVip || false; + return isvipExpire && isVip ? true : false; + }, + //30金币以下免费观看权限 + freeVideo30: (state) => { + const goldVideoFreeExpire = new Date(state.userInfo?.goldVideoFreeExpire)?.getTime(); + const videoFreeExpiration = new Date(state.userInfo?.videoFreeExpiration)?.getTime(); + const nowTime = new Date().getTime(); + return goldVideoFreeExpire > nowTime || videoFreeExpiration > nowTime ? true : false; + }, + // 是否为新人 + isNewUser: (state) => { + const createdTime = new Date(state.userInfo?.createdAt)?.getTime(); + const nowTime = new Date().getTime(); + const diffTime = nowTime - createdTime; + const dayTime = 1000 * 60 * 60 * 24; + return diffTime < dayTime; + }, + // vip等级 + vipLevel: (state) => { + return state.userInfo.vipLevel; + }, + }, + persist: { + key: 'user', + storage: window.sessionStorage, + }, +}); diff --git a/src/stores/video.ts b/src/stores/video.ts new file mode 100644 index 0000000..9b1035a --- /dev/null +++ b/src/stores/video.ts @@ -0,0 +1,259 @@ +import { defineStore } from 'pinia'; + +export const useVideoStore = defineStore({ + id: 'video', + state: () => { + return { + //推荐 + videoRecommend: { + index: 0, //当前播放视频的索引 + pageNumber: 1, //推荐视频列表页码 + list: [], // 推荐视频列表 + hasNext: true, //是否有下一页 + }, + //关注 + videoFocus: { + index: 0, //当前播放视频的索引 + pageNumber: 1, //推荐视频列表页码 + list: [], // 关注视频列表 + hasNext: true, //是否有下一页 + }, + //同城 + videoSamecity: { + index: 0, //当前播放视频的索引 + pageNumber: 1, //推荐视频列表页码 + list: [], // 同城视频列表 + hasNext: true, //是否有下一页 + }, + //跳转短视频列表 + videoList: { + index: 0, //当前播放视频的索引 + list: [], // 视频列表 + }, + }; + }, + actions: { + /************************************************************** 推荐视频 ************************************************************ */ + /** + * @description 保存推荐短视频 + * @param videoList 视频列表 + */ + saveVideoRecommend(videoList: Types.Video.VInfosItem[]) { + this.videoRecommend.list = videoList; + }, + /** + * @description 重置推荐短视频流(每次进入重新拉推荐队列) + */ + resetVideoRecommend() { + this.videoRecommend.index = 0; + this.videoRecommend.pageNumber = 1; + this.videoRecommend.list = []; + this.videoRecommend.hasNext = true; + }, + /** + * @description 修改当前播放视频的索引 + * @param index 修改视频的索引 + */ + updateVideoRecommendIndex(index: number) { + this.videoRecommend.index = index; + }, + /** + * @description 从列表头删除视频 + * @param index 从列表头开始删除数量 + */ + deleteVideoRecommend(index: number) { + this.videoRecommend.list.splice(0, index); + }, + /** + * @description 修改页码 + * @param pageNumber 页码 + */ + updateVideoRecommendPage(pageNumber?: number, hasNext?: boolean) { + if (pageNumber != null && pageNumber != undefined) { + this.videoRecommend.pageNumber = pageNumber; + } + if (hasNext != null && hasNext != undefined) { + this.videoRecommend.hasNext = hasNext; + } + }, + /** + * @description 更改当前关注博主的所有视频设置为关注 + * @param uid 更改的用户id + * @param isFocus 更改关注的状态 + */ + update_all_video_foucus(uid: number, isFocus = true) { + const list: Types.Video.VInfosItem[] = this.videoRecommend.list; + for (let i = 0; i < list.length; i++) { + if (list[i]?.publisher?.uid == uid) { + if (isFocus) { + list[i].publisher.hasFollowed = true; + } else { + list[i].publisher.hasFollowed = false; + } + } + } + }, + /************************************************************** 关注视频 ************************************************************ */ + /** + * @description 保存关注视频 + * @param videoList 视频列表 + */ + saveVideoFocus(videoList: Types.Video.VInfosItem[]) { + this.videoFocus.list = videoList; + }, + /** + * @description 重置最新短视频流(每次进入重新拉取) + */ + resetVideoFocus() { + this.videoFocus.index = 0; + this.videoFocus.pageNumber = 1; + this.videoFocus.list = []; + this.videoFocus.hasNext = true; + }, + /** + * @description 修改当前播放视频的索引 + * @param index 修改视频的索引 + */ + updateVideoFocusIndex(index: number) { + this.videoFocus.index = index; + }, + /** + * @description 从列表头删除视频 + * @param index 从列表头开始删除数量 + */ + deleteVideoFocus(index: number) { + this.videoFocus.list.splice(0, index); + }, + /** + * @description 修改页码 + * @param pageNumber 页码 + */ + updateVideoFocusPage(pageNumber?: number, hasNext?: boolean) { + if (pageNumber != null && pageNumber != undefined) { + this.videoFocus.pageNumber = pageNumber; + } + if (hasNext != null && hasNext != undefined) { + this.videoFocus.hasNext = hasNext; + } + }, + /** + * @description 更改当前关注博主的所有视频设置为关注 + * @param uid 更改的用户id + * @param isFocus 更改关注的状态 + */ + update_all_video_foucus_on(uid: number, isFocus = true) { + const list: Types.Video.VInfosItem[] = this.videoFocus.list; + for (let i = 0; i < list.length; i++) { + if (list[i]?.publisher?.uid == uid) { + if (isFocus) { + list[i].publisher.hasFollowed = true; + } else { + list[i].publisher.hasFollowed = false; + } + } + } + }, + /************************************************************** 同城视频 ************************************************************ */ + /** + * @description 保存同城视频 + * @param videoList 视频列表 + */ + saveVideoSamecity(videoList: Types.Video.VInfosItem[]) { + this.videoSamecity.list = videoList; + }, + /** + * @description 修改当前播放视频的索引 + * @param index 修改视频的索引 + */ + updateVideoSamecityIndex(index: number) { + this.videoSamecity.index = index; + }, + /** + * @description 从列表头删除视频 + * @param index 从列表头开始删除数量 + */ + deleteVideoSamecity(index: number) { + this.videoSamecity.list.splice(0, index); + }, + /** + * @description 修改页码 + * @param pageNumber 页码 + */ + updateVideoSamecityPage(pageNumber?: number, hasNext?: boolean) { + if (pageNumber != null && pageNumber != undefined) { + this.videoSamecity.pageNumber = pageNumber; + } + if (hasNext != null && hasNext != undefined) { + this.videoSamecity.hasNext = hasNext; + } + }, + /** + * @description 更改当前关注博主的所有视频设置为关注 + * @param uid 更改的用户id + * @param isFocus 更改关注的状态 + */ + update_all_video_samecity(uid: number, isFocus = true) { + const list: Types.Video.VInfosItem[] = this.videoSamecity.list; + for (let i = 0; i < list.length; i++) { + if (list[i]?.publisher?.uid == uid) { + if (isFocus) { + list[i].publisher.hasFollowed = true; + } else { + list[i].publisher.hasFollowed = false; + } + } + } + }, + /************************************************************** 短视频列表 ************************************************************ */ + /** + * @description 保存短视频 + * @param videoList 视频列表 + */ + saveVideoList(videoList: Types.Video.VInfosItem[], videoInfo: Types.Video.VInfosItem) { + const list = (videoList || []).filter((item: Types.Video.VInfosItem) => item?.newsType === 'SHORT'); + let currentIndex = list.findIndex((item: Types.Video.VInfosItem) => item.id == videoInfo?.id); + // 被时长误判进短视频页时,当前条可能不是 SHORT;至少保留当前条,避免空列表一直转圈 + if (currentIndex < 0 && videoInfo?.id) { + list.unshift(videoInfo); + currentIndex = 0; + } + this.videoList.list = list; + this.updateVideoListIndex(currentIndex); + }, + /** + * @description 修改当前播放视频的索引 + * @param index 修改视频的索引 + */ + updateVideoListIndex(index: number) { + this.videoList.index = index; + }, + /** + * @description 从列表头删除视频 + * @param index 从列表头开始删除数量 + */ + deleteVideoList() { + this.videoList.list.splice(0, this.videoList.list.length); + }, + /** + * @description 更改当前关注博主的所有视频设置为关注 + * @param uid 更改的用户id + * @param isFocus 更改关注的状态 + */ + update_all_video_list(uid: number, isFocus = true) { + const list: Types.Video.VInfosItem[] = this.videoList.list; + for (let i = 0; i < list.length; i++) { + if (list[i]?.publisher?.uid == uid) { + if (isFocus) { + list[i].publisher.hasFollowed = true; + } else { + list[i].publisher.hasFollowed = false; + } + } + } + }, + }, + persist: { + key: 'video', + storage: window.sessionStorage, + }, +}); diff --git a/src/typings/globals.d.ts b/src/typings/globals.d.ts new file mode 100755 index 0000000..6bb10f5 --- /dev/null +++ b/src/typings/globals.d.ts @@ -0,0 +1,2 @@ +declare module '*.js'; +declare module 'qrcodejs2'; diff --git a/src/typings/interface/acg.d.ts b/src/typings/interface/acg.d.ts new file mode 100644 index 0000000..e63b95c --- /dev/null +++ b/src/typings/interface/acg.d.ts @@ -0,0 +1,361 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Acg { + interface TagsItem { + id: string; + name: string; + } + // 单篇 + interface SingleRecommend { + id: string; + type: number; + mediaId: string; + recommendTag: string; + title: string; + desc: string; + background: string; + peopleImg: string; + titleImg: string; + startTime: string; + endTime: string; + tags: TagsItem[]; + isCollect: boolean; + style: number; + horizontalCover: string; + verticalCover: string; + mediaTitle: string; + mediaType: 'video' | 'image' | 'text'; + completeAllTask: completeAllTask; + } + + interface AwardListItem { + type: number; + num: number; + } + + // 单篇任务 + interface TaskListItem { + id: string; + objId: string; + type: number; + title: string; + recommendId: string; + targetEnum: number; + target: number; + progress: number; + state: number; + awardList: AwardListItem[]; + startTime: string; + endTime: string; + icon: string; + } + + // 单篇推荐数据 + interface SingleData { + allVideoInfo: string; + allMediaInfo: string; + allSection: string; + hasNext: boolean; + singleRecommend: SingleRecommend; + dailyRecommend: string; + taskList: TaskListItem[]; + } + + // 金刚区 + interface SectionListItem { + id: string; + name: string; + cover: string; + count: number; + userId: number; + portrait: string; + type: number; + } + + // 内容子集列表 + interface MediaContentListItem { + id: string; + mediaId: string; + episodeNumber: number; + listenPermission: number; + price: number; + discountPrice: number; + name: string; + hasBuy: boolean; + createdAt: string; + cover: string; + audioUrl: string; + videoUrl: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + playTime: number; + inDiscountArea: boolean; + } + + // 子集内容详情 + interface MediaContentInfo { + id: string; + mediaId: string; + episodeNumber: number; + listenPermission: number; + price: number; + discountPrice: number; + name: string; + text: string; + md5: string; + videoUrl: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + audioUrl: string; + urlSet: any[]; + height: number; + weight: number; + mediaSize: number; + playTime: number; + isActive: boolean; + ratio: number; + createdAt: string; + updateTime: string; + hasBuy: boolean; + } + + interface ReadData extends MediaContentListItem { + [key: string]: any; + } + + interface RankingTabItem { + type: number; + name: string; + } + + interface DefaultAcgRanking { + tab: RankingTabItem[]; + list: Types.Media.ModuleItem[]; + } + + interface SortTypeItem { + key: string; + value: number; + } + + interface TagDetailsItem { + id: string; + name: string; + } + + interface MediaStatus { + hasAddBookshelf: boolean; + hasPaid: boolean; + hasRead: boolean; + hasLiked: boolean; + hasDisliked: boolean; + hasCollected: boolean; + } + + interface ListItem { + id: string; + sortCode: number; + status: number; + title: string; + horizontalCover: string; + verticalCover: string; + tags: string[]; + tagDetails: TagDetailsItem[]; + actressId: string; + actress: string; + summary: string; + totalEpisode: number; + currentEpisode: number; + updateStatus: number; + mediaType: string; + mediaSubType: number; + kind: number; + permissionIconHide: boolean; + permission: number; + vipGoldResourcesFree: boolean; + price: number; + direction: number; + sellType: number; + freeTime: number; + mId: string; + moduleName: string; + sectionName: string; + sId: string; + sectionSort: number; + contents: string; + countComment: number; + countPurchases: number; + hasFollow: boolean; + countBrowse: number; + countCollect: number; + countLike: number; + countDisLike: number; + countView: number; + mediaStatus: MediaStatus; + number: number; + createdAt: string; + updateTime: string; + videoTypeId: string; + videoTypeName: string; + } + + interface GuessYouLikeMedia { + sectionID: string; + sectionName: string; + sectionCover: string; + sortType: SortTypeItem[]; + defaultSortType: number; + list: ListItem[]; + pageNumber: number; + pageSize: number; + hasNext: boolean; + } + + interface AwardListItem { + type: number; + num: number; + } + + export interface CompleteAllTask { + id: string; + objId: string; + type: number; + title: string; + recommendId: string; + targetEnum: number; + target: number; + progress: number; + state: number; + awardList: AwardListItem[]; + startTime: string; + endTime: string; + icon: string; + } + interface AcgRankingTab { + type: number; + name: string; + } + interface AcgRankingItem { + id: string; + sortCode: number; + status: number; + title: string; + horizontalCover: string; + verticalCover: string; + tags: string[]; + tagDetails: TagDetailsItem[]; + actressId: string; + actressHasFollow: boolean; + actress: string; + summary: string; + totalEpisode: number; + currentEpisode: number; + freeEpisode: number; + updateStatus: number; + mediaType: string; + mediaSubType: number; + defaultContent: DefaultContent; + kind: number; + style: number; + permissionIconHide: boolean; + permission: number; + price: number; + discountPrice: number; + inDiscountArea: boolean; + contentsPrice: number; + direction: number; + freeTime: number; + mId: string; + moduleName: string; + sectionName: string; + sId: string; + sectionSort: number; + countComment: number; + countPurchases: number; + hasFollow: boolean; + countBrowse: number; + countCollect: number; + countLike: number; + countDisLike: number; + countView: number; + mediaStatus: MediaStatus; + number: number; + createdAt: string; + updateTime: string; + todayFreeNum: number; + } + + interface AcgRankingListItem { + tab: AcgRankingTab; + list: AcgRankingItem[]; + } + + interface DiscountChildListItem { + id: string; + dataType: string; + title: string; + cover: string; + originalPrice: number; + discountPrice: number; + playTime: number; + playCount: number; + commentCount: number; + tags: string; + updateStatus: number; + totalEpisode: number; + currentEpisode: number; + mediaType: string; + mediaSubType: number; + } + + interface DiscountListItem { + info: { + id: string; + title: string; + type: number; + dataType: string; + desc: string; + discount: number; + status: number; + sortCode: number; + recommendNum: number; + updatedAt: string; + createdAt: string; + }; + list: DiscountChildListItem[]; + } + + interface ActressInfo { + id: string; + name: string; + chineseName: string; + type: number; + alias: string; + englishName: string; + seriesCover: string[]; + portrait: string; + summary: string; + region: string; + birthday: string; + score: string; + height: string; + age: string; + weight: string; + bloodType: string; + cupSize: string; + threeDimensions: string; + debutTime: string; + office: string; + viewCount: number; + videoCount: number; + picsCount: number; + gifsCount: number; + acgCount: number; + commentCount: number; + likeCount: number; + dislikeCount: number; + collectCount: number; + hasCollected: boolean; + hasLiked: boolean; + hasDisliked: boolean; + } +} diff --git a/src/typings/interface/ai.d.ts b/src/typings/interface/ai.d.ts new file mode 100644 index 0000000..5e075da --- /dev/null +++ b/src/typings/interface/ai.d.ts @@ -0,0 +1,6 @@ +declare interface AITextToImgMod { + id: string; + title: string; + cover: string; + styleType: number; +} diff --git a/src/typings/interface/app.d.ts b/src/typings/interface/app.d.ts new file mode 100644 index 0000000..0221a97 --- /dev/null +++ b/src/typings/interface/app.d.ts @@ -0,0 +1,276 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace App { + interface AdsInfoListItem { + id: string; + title: string; + description: string; + cover: string; + href: string; + position: number; //广告id + positionName: string; //广告名称 + sortCode: number; + watchTime: number; + } + + interface AnnounListItem { + id: string; + title: string; + content: string; + cover: string; + href: string; + type: number; + } + + interface DomainItem { + weight: number; + url: string; + status: number; + } + + interface SourceListItem { + id: string; + domain: DomainItem[]; + isActive: boolean; + type: string; + } + + interface SystemConfigListItem { + id: string; + type: number; + location: number; + content: string; + isActive: boolean; + createdAt: string; + updatedAt: string; + } + export interface AdvanceStatusItem { + activityStatus: boolean; + balanceAmount: number; + balancePayment: boolean; + endTime: string; + oid: string; + startTime: string; + status: number; + activityPopUp: boolean; + gameActivityPopUp: boolean; + privilegeLimit: PrivilegeLimitItem; + } + interface PrivilegeLimitItem { + hasLimit: boolean; + limit: Limit; + remain: Remain; + } + interface Limit { + coinVideoLimitPerDay: number; + luckyDrawLimitPerDay: number; + aiUndressLimitPerDay: number; + downloadLimitPerDay: number; + } + interface Remain { + todayCoinVideoCount: number; + todayLuckyDrawCount: number; + todayAiUndressCount: number; + todayDownloadCount: number; + } + /** 我的 tab 等位置的付费分层弹窗配置(JSON 字符串字段需 parse) */ + interface PaymentStatusPopupConfig { + homepage?: string; + homepageFlot?: string; + playPage?: string; + meTab?: string; + vipCard?: string; + lastDiscountTime?: number | string; + } + + /** /ping/domain/refresh paymentPopup 响应 */ + interface PaymentPopupRefreshItem { + paymentStatusPopup?: string; + homepage?: string; + homepageFlot?: string; + playPage?: string; + meTab?: string; + vipCard?: string; + lastDiscountTime?: number | string; + } + + interface PaymentPopupRefreshResponse { + paymentPopup?: PaymentPopupRefreshItem; + } + + /** /ping/domain/refresh paymentGuide 响应 */ + interface PaymentGuideRefreshResponse { + paymentGuide?: Types.Payment.PaymentGuidePing; + } + + /** + * @description 配置信息 + * @interface ConfigInfo + */ + interface ConfigInfo { + adsInfoList: AdsInfoListItem[]; + announList: AnnounListItem[]; + sourceList: SourceListItem[]; + domain: string; + systemConfigList: SystemConfigListItem[]; + totalWatch: number; + eKey: string; + louFengH5: string; + luckyDrawH5: string; + luckyDrawIcon: string; + dataBuriedPoint: string; + playGame: boolean; + randomBanner: string; + active_2023_url: string; + jingangArea: JingGangList; + adsTimeLongVideo: number; + advancePage: any; + advanceStatus: AdvanceStatusItem; + aiUndressPrice: number; + aiChangeFaceImgPrice: number; + aiBubble: string[]; + storeIsOpen: boolean; + backgroundTheme: number; + shopIosLink: string; + festivalUi: string; + bannerJump: any; + aiCharacterImg: string; + darkWebVipName: string; + darkWebVipId: string; + jgArea: JingGangItem[]; + aiImageToVideoPrice: number; + aiTextToImagePrice: number; + recommendVipIds: string[]; + returnSaleVipIds: string[]; + newbieSaleTime: number; + oldReturnSaleTime: number; + aiGirlFriend: boolean; + aiImageChangeFace: boolean; + aiVideoChangeFace: boolean; + aiUndress: boolean; + personalCenterBackground: string; + searchHintWord: string[]; + aiTextToNovelPrice: number; + freeMark: boolean; // 免费角标是否展示 + vipMark: boolean; // vip角标是否展示 + coinMark: boolean; // 金币角标是否展示 + /** 免费试看角标总开关(运营后台配置;列表项以 showFreeTrialBadge 为准) */ + freeTrialBadgeEnabled?: boolean; + darkWebEnable: boolean; // 暗网是否开启 + darkWebImg: string; // 暗网图片 + darkWebIcon: string; // 暗网图标 + darkWebIconName: string; // 暗网图标名称 + signIcon: string; // 签到图标 + aiSwitchConf: AiSwitchConfigItem[]; + bannerJumpList: BannerJump[]; + /** 私信单条扣费金币数;后端可能在 userInfo 或 appConfig 任一处下发 */ + sendMsgPrice?: number; + /** 用户付费状态分层标识 */ + paymentStatusPopup?: string; + /** 对应状态的弹窗配置 */ + paymentStatusPopupConfig?: PaymentStatusPopupConfig; + /** Ping 下发的付费引导(普通场景读缓存;上新场景仅用 enabled) */ + paymentGuide?: Types.Payment.PaymentGuidePing; + /** 会员中心 AB:true 新版 UI,false/未下发走现有版本 */ + memberCenterNewUi?: boolean; + /** + * Ping(/ping/domain/h5) 下发的默认短剧卡商品 ID; + * 短剧播放页 VIP 弹窗优先选中(须在 /vip/product 可见列表中),未配置为空字符串 + */ + shortDramaCardId?: string; + } + /** + * @description AI开关配置项 + * @interface AiSwitchConfigItem + */ + interface AiSwitchConfigItem { + type: number; // AI类型 1:AI脱衣 2:AI视频换脸 3:AI图片换脸 4:图生视频 5:文生图 6:AI小说 + sort: number; // 排序 越小越靠前 + isOpen: boolean; // 是否开启 + } + interface JingGangList { + list: JingGangItem[]; + } + interface BannerJump { + /** 浮窗ID(24位 ObjectID hex);按ID单查/同步刷新时使用 */ + id: string; + banner: string; + endAt: string; + position: number; + startAt: string; + title: string; + url: string; + /** 倒计时类型:0 无倒计时(默认) / 1 红包雨场次倒计时 */ + countdownType: number; + } + /** 评论区 Banner 媒体类型 */ + type CommentBannerMediaType = 'IMAGE' | 'GIF'; + /** 评论区 Banner 跳转类型 */ + type CommentBannerLinkType = 'INTERNAL' | 'EXTERNAL' | 'NONE'; + /** GET /banner/list 单项 */ + interface CommentBannerItem { + id: string; + imageUrl: string; + mediaType: CommentBannerMediaType; + linkType: CommentBannerLinkType; + linkValue: string; + sort: number; + } + /** GET /banner/list 响应 */ + interface CommentBannerListResponse { + list: CommentBannerItem[]; + } + /** + * @description 金刚区数据模型 + * @interface SourceInfo + */ + interface JingGangItem { + id: string; + name: string; + img: string; + desc: string; + link_type: number; + link_url: string; + sort: number; + status: number; + createdAt: string; + updatedAt: string; + mid: string; + } + /** + * @description 资源配置 + * @interface SourceInfo + */ + interface SourceInfo { + GROUP: string; + IMAGE: string; + GUIDE: string; + AUDIO: string; + VID: any[]; + LAND: string; + PROXYRULE: string; + FAQ: string; + QRCODE: string; + WELFARE: string; + ACT: string; + AppStore: string; + UP: string; + PRESALEBGIMG: string; + } + + /** + * @description 基础错误 + * @interface ErrorType + */ + interface ErrorType { + code: number; + tip: string; + msg: string; + } + /** + * @description 跑马灯 + * @interface Marquee + */ + interface Marquee { + announcement: string[]; + } +} diff --git a/src/typings/interface/home.d.ts b/src/typings/interface/home.d.ts new file mode 100644 index 0000000..52805b2 --- /dev/null +++ b/src/typings/interface/home.d.ts @@ -0,0 +1,217 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Home { + interface HaiJiaoStyle { + defaultShow: number; + sectionStyle: number; + showChosenVideo: number; + sortShow: number; + sortRules: sortRules[]; + } + interface sortRules { + name: string; + top: boolean; + val: number; + refreshMode?: string; + randomCandidateN?: number; + } + + interface ContentUpdateModuleMarker { + moduleId: string; + latestAt: string; + } + + interface ContentUpdateMarkers { + homeLatestAt?: string; + todayLatestAt?: string; + modules?: ContentUpdateModuleMarker[]; + } + + interface ModuleRefreshResult { + allVideoInfo?: Types.Video.VInfosItem[]; + candidateCount?: number; + refreshMode?: string; + refreshToken?: string; + } + interface HomeTabItem { + id: string; + moduleName: string; + subModuleName: string; + status: number; + sectionLimit: number; + sortNum: number; + showType: number; + createdAt: string; + updatedAt: string; + deletedAt: string; + type: number; + haiJiaoStyle: HaiJiaoStyle; + pureVersion: boolean; + } + interface TagsItem { + id: string; + name: string; + coverImg: string; + description: string; + playCount: number; + hasCollected: boolean; + } + interface TagItem { + id: string; + tagName: string; + } + interface Publisher { + uid: number; + name: string; + gender: string; + portrait: string; + hasLocked: boolean; + hasBanned: boolean; + vipLevel: number; + isVip: boolean; + rechargeLevel: number; + superUser: boolean; + activeValue: number; + officialCert: boolean; + age: number; + follows: number; + fans: number; + summary: string; + hasFollowed: boolean; + } + + interface Location { + id: string; + city: string; + cover: string; + visit: number; + createdAt: string; + } + + interface VidStatus { + hasLiked: boolean; + hasPaid: boolean; + hasCollected: boolean; + todayRank: number; + todayPlayCnt: number; + } + + interface Comment { + uid: number; + name: string; + portrait: string; + cid: string; + content: string; + likeCount: number; + isAuthor: boolean; + createdAt: string; + } + + interface Watch { + watchCount: number; + isWatch: boolean; + isFreeWatch: boolean; + } + + interface VideoInfoItem { + id: string; + newsType: string; + title: string; + tags: TagsItem[]; + sourceURL: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + playTime: number; + cover: string; + coverThumb: string; + seriesCover: string[]; + playCount: number; + purchaseCount: number; + likeCount: number; + commentCount: number; + shareCount: number; + coins: number; + size: number; + resolution: string; + ratio: number; + status: number; + reason: string; + freeTime: number; + isHideLocation: boolean; + freeArea: boolean; + createdAt: string; + reviewAt: string; + isTopping: boolean; + isRecommend: boolean; + isChoosen: boolean; + rewarded: string; + originCoins: number; + publisher: Publisher; + location: Location; + vidStatus: VidStatus; + comment: Comment; + watch: Watch; + /** 是否展示免费试看角标(后端已综合开关/剩余次数/可试看) */ + showFreeTrialBadge?: boolean; + /** 剩余免费试看次数 */ + freeTrialRemaining?: number; + /** 当前是否可使用免费试看 */ + canUseFreeTrial?: boolean; + } + + interface OriginalBloggerInfo { + uid: number; + name: string; + portrait: string; + officialCert: boolean; + summary: string; + } + + interface SectionsItem { + sectionID: string; + sectionName: string; + description: string; + sectionCover: string; + videoInfo: Types.Video.VInfosItem[]; + originalBloggerInfo: OriginalBloggerInfo; + hasFollowed: boolean; + showType: number; + } + + interface SectionDetail { + id: string; + sectionName: string; + sectionCover: string; + subModuleID: string; + originalUserID: string; + status: number; + sort: number; + createdAt: string; + updatedAt: string; + deletedAt: string; + showType: number; + tags: any[]; + videoCount: number; + playCount: number; + mtSectionId: number; + belongCollection: string; + letter: string; + sectionListSort: number; + description: string; + } + + interface Sign { + id: string; + title: string; + desc: string; + prizes: PrizesItem[]; + finishCondition: number; + finishValue: number; + status: number; + boonType: number; + } + + interface Data { + sections: SectionsItem[]; + hasNext: boolean; + } +} diff --git a/src/typings/interface/index.d.ts b/src/typings/interface/index.d.ts new file mode 100644 index 0000000..f8e93bb --- /dev/null +++ b/src/typings/interface/index.d.ts @@ -0,0 +1,23 @@ +/** + * project type declaration + */ +export as namespace Types; + +export * from './request'; +export * from './user'; +export * from './app'; +export * from './video'; +export * from './community'; +export * from './home'; +export * from './recharge'; +export * from './mien'; +export * from './live'; +export * from './acg'; +export * from './media'; +export * from './ai'; +export * from './payment'; +export * from './short-drama'; + +export interface PlainObject { + [key: string]: any; +} diff --git a/src/typings/interface/live.d.ts b/src/typings/interface/live.d.ts new file mode 100644 index 0000000..53ea168 --- /dev/null +++ b/src/typings/interface/live.d.ts @@ -0,0 +1,34 @@ +export namespace Live { + interface ModuleItem { + id: string; + title: string; + } + + interface AnchorsItem { + id: string; + name: string; + coverImg: string; + url: string; + country: string; + vidWidth: number; + vidHeight: number; + isOnline: boolean; + isNew: boolean; + viewCount: number; + } + + interface RecomItem { + anchors: AnchorsItem[]; + recoShowType: string; + } + + interface ModuleListData { + module: ModuleItem[]; + recom: RecomItem[]; + } + + interface AnchorListData { + hasNext: boolean; + list: AnchorsItem[]; + } +} diff --git a/src/typings/interface/media.d.ts b/src/typings/interface/media.d.ts new file mode 100644 index 0000000..29f48ae --- /dev/null +++ b/src/typings/interface/media.d.ts @@ -0,0 +1,436 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Media { + interface listParams { + pageNumber: number; + pageSize: number; + } + + interface AllMediaInfoItem { + id: string; + mid: string; + sortCode: number; + status: number; + title: string; + name: string; + horizontalCover: string; + verticalCover: string; + tags: string[]; + tagDetails: TagDetailsItem[]; + summary: string; + totalEpisode: number; + mediaType: string; + kind: number; + permissionIconHide: boolean; + permission: number; + price: number; + direction: number; + sellType: number; + freeTime: number; + mId: string; + moduleName: string; + sectionName: string; + sId: string; + sectionSort: number; + countComment: number; + countPurchases: number; + countBrowse: number; + countCollect: number; + countLike: number; + countView: number; + number: number; + createdAt: string; + updateTime: string; + hasFollow: boolean; + mediaStatus: MediaStatus; + quoteID: string; + quoteImg: string; + quoteTitle: string; + quoteType: string; + updateStatus: number; + currentEpisode: number; + mediaSubType: number; + } + + interface MediaStatus { + hasAddBookshelf: boolean; + hasPaid: boolean; + hasRead: boolean; + hasLiked: boolean; + hasDisliked: boolean; + hasCollected: boolean; + } + + interface ModuleItem { + sectionID: string; + sectionName: string; + sectionTitle: string; + type: number; + linkType: number; + linkUrl: string; + showType: number; + allTags: string; + allVideoInfo: string; + allMediaInfo: AllMediaInfoItem[]; + allActress: string; + + voteCount: number; // 大胸投票 + disVoteCount: number; // 贫胸投票 + } + + interface TagDetailsItem { + id: string; + name: string; + } + + interface Actress { + id: string; + name: string; + chineseName: string; + type: number; + pinyin: string; + alias: string; + englishName: string; + cover: string; + coverThumb: string; + sections: string[]; + seriesCover: string[]; + portrait: string; + summary: string; + region: string; + birthday: string; + score: string; + height: string; + age: string; + weight: string; + bloodType: string; + cupSize: string; + threeDimensions: string; + debutTime: string; + office: string; + feature: any[]; + status: number; + sortCode: number; + isRecommend: boolean; + videoCount: number; + picsCount: number; + gifsCount: number; + audioCount: number; + viewCount: number; + commentCount: number; + isDelete: boolean; + likeCount: number; + dislikeCount: number; + collectCount: number; + updatedAct: string; + createTime: string; + updateTime: string; + lastUpdateVideo: string; + acgCount: number; + } + + interface MediaInfo { + choice: string; + choiceSort: number; + countBrowse: number; + countCollect: number; + countComment: number; + countLike: number; + countPurchases: number; + countPurchasesRate: number; + countView: number; + createdAt: string; + direction: number; + freeTime: number; + horizontalCover: string; + id: string; + isDelete: boolean; + kind: number; + mId: string; + mediaType: string; + mediaSubType: 0 | 1 | 2; //0:文本 1:有声小说 2:有声漫 + moduleName: string; + number: number; + permission: number; + permissionIconHide: boolean; + price: number; + sId: string; + sectionName: string; + sectionSort: number; + sellType: number; + sortCode: number; + status: number; + updateStatus: number; + summary: string; + tagDetails: TagDetailsItem[]; + tags: string[]; + title: string; + totalEpisode: number; + updateTime: string; + updatedAct: string; + verticalCover: string; + hasFollow: boolean; + contents: MediaInfoContent[]; + mediaStatus: MediaStatus; + style: number; + contentsPrice: number; + defaultContent: { + cover: string; + id: string; + name: string; + urlSet: string[]; + }; + currentEpisode: number; + historyEpisodeNumber: number; + historyReadData: Types.Acg.ReadData[]; + actress: Actress; + todayFreeNum: number; + discountPrice: number; + inDiscountArea: boolean; + everyDayFreeRead: number; + freeEpisode: number; + novel_type_id: string; + novel_type_name: string; + comic_type_id: string; + comic_type_name: string; + lsjId: string; + } + interface MediaInfoContent { + id: string; + mediaId: string; + episodeNumber: number; + listenPermission: number; + price: number; + name: string; + text: string; + md5: string; + videoUrl: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + urlSet: string[]; + height: number; + weight: number; + mediaSize: number; + playTime: number; + ratio: number; + createdAt: string; + updateTime: string; + mediaStatus: MediaStatus; + } + + interface LibraryTag { + id: string; + name: string; + } + + interface LibraryDimension { + key: string; + name: string; + tag: LibraryTag[]; + } + + interface LibraryKind { + dimension: LibraryDimension[]; + key: string; + name: string; + cover: string; + } + + interface Library { + key: string; + kind: LibraryKind[]; + name: string; + } + + interface RandomPara extends listParams { + sId: string; + // 种类 1、动漫,2、漫画 + type: number; + } + + interface TopicParam extends listParams { + sId: string; + // 排序 1、精选,2、最新,3、最热 + sortType: number; + } + + interface ContentsItem { + createdAt: string; + episodeNumber: number; + height: number; + id: string; + listenPermission: number; + md5: string; + mediaId: string; + mediaSize: number; + name: string; + playTime: number; + price: number; + ratio: number; + text: string; + updateTime: string; + urlSet: string[]; + videoUrl: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + weight: number; + } + + interface TagDetailsItem { + id: string; + name: string; + } + + interface ListItem { + contents: ContentsItem[]; + countBrowse: number; + countCollect: number; + countComment: number; + countDisLike: number; + countLike: number; + countPurchases: number; + countView: number; + createdAt: string; + direction: number; + freeTime: number; + hasFollow: boolean; + horizontalCover: string; + id: string; + kind: number; + mId: string; + mediaType: string; + moduleName: string; + number: number; + permission: number; + permissionIconHide: boolean; + price: number; + sId: string; + sectionName: string; + sectionSort: number; + sellType: number; + sortCode: number; + status: number; + summary: string; + tagDetails: TagDetailsItem[]; + tags: string[]; + title: string; + totalEpisode: number; + updateStatus: number; + updateTime: string; + verticalCover: string; + } + + interface Section { + commentCount: number; + count: number; + cover: string; + id: string; + likeCount: number; + name: string; + portrait: string; + type: number; + userId: number; + userName: string; + mediaStatus: { + hasCollected: boolean; + hasLiked: boolean; + hasPaid: boolean; + }; + } + + interface Topic { + hasNext: boolean; + list: ListItem[]; + section: Section; + total: number; + } + + interface SearchParam extends listParams { + kind: number; + keyword: string; + } + + /** 片库标签搜索(含短剧标签页) */ + interface LibrarySearchParam extends listParams { + tagIds: string[]; + sortType: number; + mediaType: string; + } + + interface LibrarySearchData { + total: number; + hasNext: boolean; + list: AllMediaInfoItem[]; + } + + interface VidSctionParam extends listParams { + pageSize: number; + pageNumber: number; + sectionID: string; + coverType?: string; + // 1:大于10分钟 2:小于10分钟 + playTimeType?: 1 | 2; + // hot:最热,watch:最多播放,like:最多喜欢:new:最新, recommend:推荐 collect: 收藏 + sortType?: string; + } + + interface allSection { + allTags: any; + sectionID: string; + sectionName: string; + } + interface AiMediaBoxItem { + id: string; + /** + * {"1":"Ai图片换脸","2":"Ai视频换脸","3":"Ai脱衣","4":"Ai图生视频","5":"Ai绘画"} + */ + type: 1 | 2 | 3 | 4 | 5; + template: string; + uid: number; + name: string; + gender: string; + portrait: string; + title: string; + originalImage: string; + originalVideo: string; + originalVideoCover: string; + originContent: string; + generateImage: string; + generateVideo: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + generateVideoCover: string; + status: number; + reason: string; + sortCode: number; + hasCollected: boolean; + hasLiked: boolean; + viewCount: number; + likeCount: number; + collectCount: number; + commentCount: number; + reviewAt: string; + createdAt: string; + updatedAt: string; + } +} + +export { + listParams, + ModuleItem, + AllMediaInfoItem, + MediaInfo, + Library, + LibraryKind, + LibraryDimension, + LibraryTag, + RandomPara, + TopicParam, + Topic, + Section, + SearchParam, + LibrarySearchParam, + LibrarySearchData, + VidSctionParam, + allSection, + AiMediaBoxItem, +}; diff --git a/src/typings/interface/mien.d.ts b/src/typings/interface/mien.d.ts new file mode 100644 index 0000000..9f668bd --- /dev/null +++ b/src/typings/interface/mien.d.ts @@ -0,0 +1,58 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Mien { + interface CollectionListItem { + id: string; + newsType: string; + title: string; + tags: TagsItem[]; + sourceURL: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + playTime: number; + cover: string; + coverThumb: string; + seriesCover: string[]; + playCount: number; + purchaseCount: number; + likeCount: number; + commentCount: number; + shareCount: number; + coins: number; + size: number; + resolution: string; + ratio: number; + status: number; + reason: string; + freeTime: number; + isHideLocation: boolean; + freeArea: boolean; + createdAt: string; + reviewAt: string; + isTopping: boolean; + isRecommend: boolean; + isChoosen: boolean; + rewarded: string; + originCoins: number; + publisher: Publisher; + location: Location; + vidStatus: VidStatus; + comment: Comment; + watch: Watch; + } + + interface LocationItem { + city: string; + cover: string; + createdAt: string; + id: string; + visit: number; + } + interface TagsItem { + id: string; + name: string; + coverImg: string; + description: string; + playCount: number; + hasCollected: boolean; + } +} diff --git a/src/typings/interface/payment.d.ts b/src/typings/interface/payment.d.ts new file mode 100644 index 0000000..0184512 --- /dev/null +++ b/src/typings/interface/payment.d.ts @@ -0,0 +1,88 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Payment { + interface GuideAction { + type: string; + value: string; + } + + /** 会员内容上新弹窗内的视频卡片 */ + interface GuideVideoItem { + id: string; + title: string; + cover: string; + /** 列表优先用缩略图,为空时回退 cover */ + coverThumb?: string; + playTime: number; + playCount: number; + } + + /** + * Ping / 上新接口下发的单场景配置。 + * 普通场景 enabled=true 时带完整展示字段(与 show 无关); + * VIP_CONTENT_UPDATE 在 Ping 中通常仅有 enabled; + * DISCOUNT_COUNTDOWN / VIP_CENTER 的倒计时由前端冷启动固定 2 小时,不读 durationSeconds。 + */ + interface PaymentGuideSceneConfig { + enabled: boolean; + show?: boolean; + configId?: string; + style?: string; + title?: string; + description?: string; + cover?: string; + productId?: string; + durationSeconds?: number; + action?: GuideAction; + } + + /** Ping 下发的付费引导总配置 */ + interface PaymentGuidePing { + enabled: boolean; + segment?: string; + scenes?: Partial>; + } + + interface PaymentGuide { + show: boolean; + configId?: string; + /** 最新内容版本;展示回执需原样传回 */ + contentVersion?: string; + segment?: string; + /** 接口可能下发,前端弹层样式以场景 UI 为准,不消费此字段 */ + style?: string; + title?: string; + description?: string; + /** 会员卡宣传图;底部/居中引导优先用此图,空则用本地默认卡图 */ + cover?: string; + /** 兼容字段;渲染优先使用 videos */ + videoIds?: string[]; + /** 最新 VIP 内容列表,最多 4 条,前端无需再排序/拉详情 */ + videos?: GuideVideoItem[]; + productId?: string; + /** 引导有效时长(秒);DISCOUNT_COUNTDOWN / VIP_CENTER 由前端注入本地 2 小时剩余值 */ + durationSeconds?: number; + action?: GuideAction; + } + + interface GetPaymentGuideParams { + scene: string; + videoId?: string; + } + + interface GuideImpressionParams { + configId: string; + scene: string; + /** 普通场景传空字符串;VIP_CONTENT_UPDATE 原样回传 contentVersion */ + contentVersion: string; + videoId?: string; + requestId: string; + } + + /** 免费试看次数,用于「剩余免费次数」样式 */ + interface GuideFreeCount { + /** 剩余免费次数(与 /vid/user/count.watchCount 一致);展示前需 Number 归一化 */ + watchCount: number; + /** 免费观看总次数 */ + totalWatchCount?: number; + } +} diff --git a/src/typings/interface/recharge.d.ts b/src/typings/interface/recharge.d.ts new file mode 100644 index 0000000..7dc00af --- /dev/null +++ b/src/typings/interface/recharge.d.ts @@ -0,0 +1,247 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Recharge { + interface Data { + daichong: Daichong; + list: ListItem[]; + } + interface Daichong { + isReconnect: boolean; + traders: any[]; + url: string; + wsUrl: string; + picUrl: string; + ordUrl: string; + traderUrl: string; + userInfo: UserInfo; + chargeMoney: number; + limit: number; + } + interface UserInfo { + uid: number; + gender: string; + name: string; + portrait: string; + } + interface ListItem { + id: string; + amount: number; + money: number; + couponDesc: string; + giveVipDays: number; + louFengUnlockTimes: number; + giveGameCoin: number; + typeName: string; + giveGold: number; + rchgType: RchgTypeItem[]; + couponDescTopLeft: string; + } + interface RchgTypeItem { + type: string; + typeName: string; + channel: string; + } + interface CouponItem { + id: string; + uid: number; + name: string; + amount: number; + used: boolean; + expired: string; + desc: string; + source: string; + createdAt: string; + updatedAt: string; + } + interface VipItem { + productID: string; + vipLevel: number; + productName: string; + alias: string; + desc: string; + duration: number; + bgImg: string; + outBgImg: string; + originalPrice: number; + discountedPrice: number; + discountedPriceIos: number; + discountedPriceAnd: number; + productType: number; + sort: number; + status: boolean; + position: string; + unitPriceDisplay: boolean; + actionDesc: string; + /** 角标类型,如 MOST_POPULAR */ + badgeType?: string; + /** 角标文案(配合 badgeType) */ + badgeText?: string; + privilegeDesc: string; + showCountdownTime: number; + isAmountPay: boolean; + isUpgrade: boolean; + timesAWeek: number; + louFengDiscount: number; + loufengBookDiscount: number; + loufengBookDiscountDays: number; + videoDiscount: number; + privilege: string; + giveCoin: number; + giveFruitCoin: number; + giveGameCoin: number; + louFengUnlockTimes: number; + goldVideoFreeDay: number; + chanSplitMod: number; + serviceTime: number; + payVidDiscount: number; + goldVideoCouponNum: number; + goldVideoCouponCount: number; + balanceAmount: number; + advanceAmount: number; + newName: string; + newBgImg: string; + exclusiveOffer: string; + vipCardDesc: string; + newPrivilege: PrivilegeItem[]; + updatedAt: string; + createdAt: string; + endBgImg: string; + endBgSelectImg: string; + discountCard: DiscountCard; + rchgType: RchgTypeItem[]; + isRecommend?: boolean; + /** 短剧权益天数;>0 表示可作为短剧付费墙默认卡 */ + dramaDays?: number; + } + interface DiscountCard { + isReceived: boolean; + expiration: string; + expirationTime: string; + isBrought: boolean; + } + interface RchgTypeItem { + type: string; + typeName: string; + channel: string; + incrAmount: number; + } + interface PrivilegeItem { + img: string; + privilegeDesc: string; + privilegeName: string; + keyword?: string; + keywordColor?: string; + isCore?: boolean; + } + interface BankCardItem { + id: string; + actName: string; + act: string; + bankCode: string; + cardType: string; + checked: boolean; + } + interface RechargeRecord { + productName: string; + orderId: string; + money: number; + paymentAt: string; + createdAt: string; + payType: string; + status: number; + } + interface WithdrawRecordItem { + id: string; + cid: string; + uid: number; + name: string; + amount: number; + oid: string; + money: number; + payMoney: number; + payType: string; + withdrawType: number; + actName: string; + act: string; + userIp: string; + deviceType: string; + devID: string; + status: number; + statusDesc: string; + checkedAt: string; + progressAt: string; + failureAt: string; + successAt: string; + updatedAt: string; + createdAt: string; + receivedAt: string; + districtRemark: string; + productType: number; + bankCode: string; + districtCode: string; + promSeqe: string; + isDirect: boolean; + DiscBindAt: string; + } + interface IntegralList { + id: string; + name: string; + duration: number; + desc: string; + price: number; + type: number; + img: string; + } + /** VIP 套餐分组(会员卡 / 预售卡等) */ + interface VipProductGroup { + position: string; + list: VipItem[]; + } + /** VIP 页面 UI 配置:角标样式 */ + interface VipBadgeStyle { + badgeType: string; + backgroundColor: string; + textColor: string; + } + /** VIP 页面 UI 配置(背景图、角标样式等) */ + interface VipUiConfig { + backgroundImage?: string; + badgeStyles?: VipBadgeStyle[]; + } + /** GET /vip/product 响应(含 A/B 实验字段) */ + interface VipProductResponse { + experimentId?: string; + /** ACTIVE 时启用卡片统计与下单实验字段;非 ACTIVE 则都不带 */ + experimentStatus?: string; + variant?: string; + defaultProductId?: string; + list: VipProductGroup[]; + integralList: IntegralList[]; + daichong: Daichong; + isNewUser?: boolean; + uiConfig?: VipUiConfig; + } + /** 下单来源页 */ + type PaySourcePage = + | 'HOME_USER_SEGMENT' + | 'HOME_FLOAT_WINDOW' + | 'VIDEO_BOTTOM_BANNER' + | 'VIDEO_BOTTOM_SHEET' + | 'DRAMA_PAYWALL' + | 'VIP_CENTER' + | 'H5_ACTIVITY' + | 'UNKNOWN'; + /** POST /mine/topay 可选追踪字段 */ + interface PayTrackingFields { + sourcePage?: PaySourcePage; + sourceRef?: string; + videoId?: string; + /** 短剧整部 ID(media) */ + mediaId?: string; + /** 短剧当前子集 ID(content) */ + contentId?: string; + activityId?: string; + experimentId?: string; + experimentVariant?: string; + sessionId?: string; + } +} diff --git a/src/typings/interface/request.d.ts b/src/typings/interface/request.d.ts new file mode 100644 index 0000000..11e5ffe --- /dev/null +++ b/src/typings/interface/request.d.ts @@ -0,0 +1,15 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Http { + /** + * @description 基本业务数据结构 + * @interface BaseResponseType + */ + interface BaseResponseType { + code: number; + data: any; + hash: boolean; + time: string; + msg: string; + tip: string; + } +} diff --git a/src/typings/interface/short-drama.d.ts b/src/typings/interface/short-drama.d.ts new file mode 100644 index 0000000..06592d6 --- /dev/null +++ b/src/typings/interface/short-drama.d.ts @@ -0,0 +1,208 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace ShortDrama { + type HotDramaSort = 'hot' | 'latest' | 'collect'; + type DramaSortType = 1 | 2 | 4; + /** 短剧标签页 library/search 排序:热门推荐1 / 最新上架2 / 最多收藏4 */ + type DramaTagSortType = 1 | 2 | 4; + type EpisodeLockStatus = 'free' | 'locked' | 'unlocked'; + type SeriesStatus = 'serializing' | 'finished'; + type AccessType = 'free' | 'bought' | 'card' | 'coin'; + + interface DramaTag { + id: string; + name: string; + } + + interface MediaUserStatus { + hasPaid: boolean; + hasCollected: boolean; + hasLiked: boolean; + } + + interface DramaResume { + contentId: string; + episodeNumber: number; + progressSeconds: number; + updatedAt: string; + } + + interface DramaInfo { + id: string; + title: string; + horizontalCover: string; + verticalCover: string; + tagDetails: DramaTag[]; + summary: string; + totalEpisode: number; + currentEpisode: number; + freeEpisode: number; + updateStatus: 1 | 2; + mediaType: 'drama'; + countComment: number; + countCollect: number; + countLike: number; + /** 播放/浏览数(短剧热度展示) */ + countBrowse: number; + countView: number; + mediaStatus: MediaUserStatus; + hasDramaCard: boolean; + resume: DramaResume | null; + } + + interface PaywallInfo { + checkoutContextId: string; + title: string; + coinBalance: number; + unlockCoin: number; + coinButtonText: string; + cardButtonText: string; + } + + interface AdjacentEpisode { + id: string; + episodeNumber: number; + name: string; + cover: string; + } + + interface EpisodeListItem { + id: string; + mediaId: string; + mediaType: 'drama'; + episodeNumber: number; + listenPermission: 0 | 1 | 2; + price: number; + name: string; + cover: string; + videoUrl: string; + h265Url: string; + audioUrl: string; + playTime: number; + ratio: number; + isFree: boolean; + hasBuy: boolean; + hasDramaCard: boolean; + canPlay: boolean; + accessType: AccessType; + progressSeconds: number; + } + + interface EpisodeInfo extends EpisodeListItem { + text: string; + md5: string; + urlSet: string[]; + height: number; + weight: number; + mediaSize: number; + isActive: boolean; + prev: AdjacentEpisode | null; + next: AdjacentEpisode | null; + paywall: PaywallInfo | null; + } + + interface DramaFeedItem { + media: DramaInfo; + content: EpisodeListItem; + } + + interface DramaFeedData { + queueVersion: string; + hasNext: boolean; + list: DramaFeedItem[]; + } + + interface DramaListData { + total: number; + hasNext: boolean; + list: DramaInfo[]; + } + + interface EpisodeListData { + total: number; + hasNext: boolean; + list: EpisodeListItem[]; + } + + interface BuyDramaEpisodeRequest { + productType: 19; + productID: string; + contentID: string; + checkoutContextId: string; + } + + interface BuyDramaEpisodeData { + orderId: string; + mediaId: string; + contentId: string; + accessType: 'bought'; + canPlay: true; + paidCoin: number; + coinBalance: number; + } + + /** UI 剧信息,由 DramaInfo 映射 */ + interface DramaSeries { + id: string; + title: string; + coverUrl: string; + totalEpisodes: number; + heatCount: number; + commentCount: number; + likeCount: number; + collectCount: number; + hasLiked?: boolean; + hasCollected?: boolean; + tags: DramaTag[]; + seriesStatus?: SeriesStatus; + resume?: DramaResume | null; + } + + /** UI 单集信息,由 EpisodeListItem / EpisodeInfo 映射 */ + interface DramaEpisode { + id: string; + mediaId?: string; + episodeNumber: number; + title?: string; + coverUrl: string; + /** 播放资源 key(H.264) */ + videoUrl?: string; + /** 播放资源 key(H.265) */ + h265Url?: string; + playUrl?: string; + likeCount: number; + commentCount: number; + collectCount: number; + hasLiked?: boolean; + hasCollected?: boolean; + durationSec?: number; + currentTimeSec?: number; + /** 视频宽高比 width/height;>1 为横屏 */ + ratio?: number; + tags?: DramaTag[]; + lockStatus?: EpisodeLockStatus; + unlockCoins?: number; + canPlay?: boolean; + accessType?: AccessType; + } + + interface AiDramaFeedItem { + series: DramaSeries; + episode: DramaEpisode; + } + + interface AiDramaFeedResp { + list: AiDramaFeedItem[]; + hasNext: boolean; + queueVersion?: string; + } + + interface HotDramaListResp { + list: DramaSeries[]; + hasNext: boolean; + } + + interface DramaDetailResp { + series: DramaSeries; + episodes: DramaEpisode[]; + } +} diff --git a/src/typings/interface/user.d.ts b/src/typings/interface/user.d.ts new file mode 100644 index 0000000..549896c --- /dev/null +++ b/src/typings/interface/user.d.ts @@ -0,0 +1,187 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace User { + /** + * @description 用户信息 + * @interface UserInfoType + */ + interface UserInfoType { + age: number; + like: number; + follow: number; + fans: number; + collectionCount: number; + likeCount: number; + favoriteCount: number; + isVip: boolean; + isFollow: boolean; + promoteURL: string; + inviterCode: string; + city: string; + buyVidCount: number; + webToken: string; + loginType: number; + louFengDiscount: number; + appStoreCode: string; + lfCheatGuide: string; + videoDiscountExpiration: string; + newGoldVideoCoupon: string; + loufengDiscountExpiration: string; + loufengBookDiscount: number; + loufengBookDiscountExpiration: string; + boughtLoufengCount: number; + boughtNudeChatCount: number; + likeImageCount: number; + happinessPlazaCount: number; + allGoldVideoFree: number; + id: string; + uid: number; + devID: string; + devType: string; + devToken: string; + registerIP: string; + mobile: string; + totalInvite: number; + gender: string; + name: string; + portrait: string; + vipName: string; + summary: string; + region: string; + birthday: string; + vipLevel: number; + hasLocked: boolean; + lockReason: string; + hasBanned: boolean; + forbidUpload: boolean; + token: string; + watchCount: number; + appLock: string; + trueScore: number; + ver: string; + lastVer: string; + sysType: string; + lastVisitAt: string; + lastSysType: string; + vipExpireDate: string; + createdAt: string; + updatedAt: string; + mobileBindAt: string; + mobileUnBindAt: string; + isDAgent: boolean; + promotionCode: string; + districtCode: string; + promSeqe: string; + isDirect: boolean; + DiscBindAt: string; + superUser: boolean; + activeValue: number; + officialCert: boolean; + isMadou: boolean; + taxLevel: number; + loginDays: number; + rewarded: string; + follows: number; + followsSetFlag: boolean; + snapVip: number; + autoFollow: boolean; + hasEnteredGame: boolean; + louFengUnlockTimes: number; + goldVideoFreeExpire: string; + goldVideoCoupon: any; + weeklyActiveValue: number; + bankActName: string; + originalSort: number; + puc: string; + videoDeduction: number; + videoDeductionPayCount: number; + videoDeductionCount: number; + hasFirstChargeWaLi: boolean; + hasFirstChargeVID: boolean; + merchantAccount: string; + payVidDiscount: number; + goldVideoCouponCount: number; + videoFreeExpiration: string; + passWord: string; + email: string; + emailCheckedAt: string; + account: string; + accountBindAt: string; + userType: number; + agentAccount: string; + payable: boolean; + deposit: number; + introduce: string; + vidUploadCount: number; + coverUploadCount: number; + showProxy: boolean; + level: number; + current: number; + limit: number; + broadcastExpire: string; + goldVideoFreeLimit: number; + sendMsgPrice: number; + urrPortraitStatus: number; + isUpgrade: boolean; + } + /** + * @description 钱包信息 + * @interface UserInfoType + */ + interface WalletInfo { + id: string; + uid: number; + amount: number; + freezeAmount: number; + income: number; + integral: number; + incomePot: number; + consumption: number; + money: number; + takeOut: number; + performance: number; + vidIncome: number; + proxyIncome: number; + proxyConsumption: number; + rewardIncome: string; + dedIncome: string; + usdtAmount: number; + waliProxyIncome: number; + nudeChatIncome: string; + fruitCoin: number; + } + + /** + * @description 优惠卷信息 + * @interface CouponInfo + */ + interface CouponInfo { + id: string; + uid: number; + createTimt: string; + expiredTime: string; + goodsDesc: string; + goodsName: string; + goodsOrigin: string; + goodsType: number; + goodsValue: number; + status: number; + useTime: string; + } + + /** + * @description 加赠卷信息 + * @interface AddCoupon + */ + interface AddCoupon { + id: string; + uid: number; + name: string; + amount: number; + used: boolean; + expired: string; + desc: string; + source: string; + createdAt: string; + updatedAt: string; + } +} diff --git a/src/typings/interface/video.d.ts b/src/typings/interface/video.d.ts new file mode 100644 index 0000000..188be29 --- /dev/null +++ b/src/typings/interface/video.d.ts @@ -0,0 +1,245 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ +export namespace Video { + interface TagsItem { + id: string; + name: string; + coverImg: string; + description: string; + playCount: number; + hasCollected: boolean; + } + + interface Publisher { + uid: number; + name: string; + gender: string; + portrait: string; + hasLocked: boolean; + hasBanned: boolean; + vipLevel: number; + isVip: boolean; + rechargeLevel: number; + superUser: boolean; + activeValue: number; + officialCert: boolean; + age: number; + follows: number; + fans: number; + summary: string; + hasFollowed: boolean; + } + + interface Location { + id: string; + city: string; + cover: string; + visit: number; + createdAt: string; + } + + interface VidStatus { + hasLiked: boolean; + hasPaid: boolean; + hasCollected: boolean; + todayRank: number; + todayPlayCnt: number; + } + + interface Comment { + uid: number; + name: string; + portrait: string; + cid: string; + content: string; + likeCount: number; + isAuthor: boolean; + createdAt: string; + } + + interface Watch { + watchCount: number; + isWatch: boolean; + isFreeWatch: boolean; + } + + interface VInfosItem { + previewURL: string; + id: string; + /** 竖滑列表插入全屏广告时的稳定 key,避免同源广告 id 重复导致 Vue 复用错乱 */ + feedSlotKey?: string; + newsType: string; + title: string; + tags: TagsItem[]; + sourceURL: string; + /** H.265 资源 key;无资源时为空字符串或 null */ + h265Url?: string | null; + playTime: number; + cover: string; + coverThumb: string; + seriesCover: string[]; + playCount: number; + purchaseCount: number; + likeCount: number; + commentCount: number; + shareCount: number; + coins: number; + size: number; + resolution: string; + ratio: number; + status: number; + reason: string; + freeTime: number; + isHideLocation: boolean; + freeArea: boolean; + createdAt: string; + reviewAt: string; + isTopping: boolean; + isRecommend: boolean; + isChoosen: boolean; + rewarded: string; + originCoins: number; + publisher: Publisher; + location: Location; + vidStatus: VidStatus; + comment: Comment; + watch: Watch; + type: string; + belongCollection: string; + sectionId: string; + previewStart: number; + collectCount: number; + pageViewCount: number; + showType: number; + freeTime: number; + videoTypeId: string; + videoTypeName: string; + lsjId: string; + searchAccessTicket?: string; + /** 是否展示免费试看角标(后端已综合开关/剩余次数/可试看) */ + showFreeTrialBadge?: boolean; + /** 剩余免费试看次数 */ + freeTrialRemaining?: number; + /** 当前是否可使用免费试看 */ + canUseFreeTrial?: boolean; + } + + /** + * @description 短视频数据模型 + * @interface VideoModel + */ + interface VideoModel { + vInfos?: VInfosItem[] | null; + totalPages?: number; + hasNext?: boolean; + queueVersion?: string; + list?: VInfosItem[] | null; + } + + /** + * @description 购买接口 + * @interface ProductBuyType + */ + interface ProductBuyType { + productType?: ProductType; //产品类型 + productID: string; //产品id + chapterID?: string; //章节名字 + couponId?: string; //优惠卷ID + serviceId?: string; //裸聊服务ID + goldVideoCouponNum?: number; //金币视频抵用券金币面值 + IsH5?: boolean; //是否H5 + } + /** + * @description 用户免费次数 + * @interface UserFreeCount + */ + interface UserFreeCount { + isCan: boolean; + watchCount: number; + totalWatchCount?: number; + } + /** + * @description 视频博主数据返回 + * @interface upVideo + */ + interface UpVideo { + uid: number; + name: string; + gender: string; + portrait: string; + hasLocked: boolean; + hasBanned: boolean; + fans: number; + hasFollowed: boolean; + list: VInfosItem[]; + } + /** + * @description 热门视频博主数据返回 + * @interface searchUpVideo + */ + interface SearchUpVideo { + uid: number; + name: string; + age: number; + gender: string; + portrait: string; + region: string; + summary: string; + vipLevel: number; + rechargeLevel: number; + superUser: boolean; + activeValue: number; + officialCert: boolean; + videoInfo: VInfosItem[]; + hasFollowed: boolean; + fansCount: number; + } + // 评论接口 + interface CommentItem { + id: string; + objID: string; + userID: number; + userName: string; + userPortrait: string; + content: string; + likeCount: number; + commCount: number; + commCountBurden: number; + isAuthor: boolean; + isLike: boolean; + isFollow: boolean; + isDelete: boolean; + gender: string; + status: number; + city: string; + createdAt: string; + age: number; + level: number; + Info: any[]; + isShow: boolean; + officialCert: boolean; + subComments: any; + isInputShow: boolean; + } + interface Tag { + id: string; + name: string; + hot: number; + } + interface MediaStatus { + hasPaid: boolean; + hasLiked: boolean; + hasCollected: boolean; + } + interface Library { + category: CategoryItem[]; + orderBy: CategoryItem[]; + canvas: CategoryItem[]; + paymentType: CategoryItem[]; + tags: TagsItem[]; + } + interface CategoryItem { + key: string; + name: string; + tags: TagsItem[]; + } +} diff --git a/src/utils/appActiveTime.ts b/src/utils/appActiveTime.ts new file mode 100644 index 0000000..8cabdee --- /dev/null +++ b/src/utils/appActiveTime.ts @@ -0,0 +1,51 @@ +/** App 前台累计活跃达到该时长后,才允许触发依赖「App 活跃」的付费引导 */ +export const APP_ACTIVE_READY_MS = 3 * 60 * 1000; + +let elapsedMs = 0; +let activeSince = 0; +let isTracking = false; +let isForeground = false; + +const flushActiveSlice = () => { + if (!isForeground || !activeSince) return; + elapsedMs += Date.now() - activeSince; + activeSince = Date.now(); +}; + +const handleVisibilityChange = () => { + if (document.hidden) { + flushActiveSlice(); + isForeground = false; + activeSince = 0; + return; + } + isForeground = true; + activeSince = Date.now(); +}; + +/** 启动 App 前台累计计时(幂等),切后台暂停 */ +export const startAppActiveTracking = () => { + if (isTracking) return; + isTracking = true; + isForeground = !document.hidden; + activeSince = isForeground ? Date.now() : 0; + document.addEventListener('visibilitychange', handleVisibilityChange); +}; + +export const stopAppActiveTracking = () => { + if (!isTracking) return; + flushActiveSlice(); + isForeground = false; + activeSince = 0; + isTracking = false; + document.removeEventListener('visibilitychange', handleVisibilityChange); +}; + +export const getAppActiveElapsedMs = () => { + if (isForeground && activeSince) { + return elapsedMs + (Date.now() - activeSince); + } + return elapsedMs; +}; + +export const isAppActiveReady = (thresholdMs = APP_ACTIVE_READY_MS) => getAppActiveElapsedMs() >= thresholdMs; diff --git a/src/utils/bankCardList.ts b/src/utils/bankCardList.ts new file mode 100644 index 0000000..78ed494 --- /dev/null +++ b/src/utils/bankCardList.ts @@ -0,0 +1,658 @@ +const list = [ + { + value: 'CDB', + text: '国家开发银行', + }, + { + value: 'ICBC', + text: '中国工商银行', + }, + { + value: 'ABC', + text: '中国农业银行', + }, + { + value: 'BOC', + text: '中国银行', + }, + { + value: 'CCB', + text: '中国建设银行', + }, + { + value: 'PSBC', + text: '中国邮政储蓄银行', + }, + { + value: 'COMM', + text: '交通银行', + }, + { + value: 'CMB', + text: '招商银行', + }, + { + value: 'SPDB', + text: '上海浦东发展银行', + }, + { + value: 'CIB', + text: '兴业银行', + }, + { + value: 'HXBANK', + text: '华夏银行', + }, + { + value: 'GDB', + text: '广东发展银行', + }, + { + value: 'CMBC', + text: '中国民生银行', + }, + { + value: 'CITIC', + text: '中信银行', + }, + { + value: 'CEB', + text: '中国光大银行', + }, + { + value: 'EGBANK', + text: '恒丰银行', + }, + { + value: 'CZBANK', + text: '浙商银行', + }, + { + value: 'BOHAIB', + text: '渤海银行', + }, + { + value: 'SPABANK', + text: '平安银行', + }, + { + value: 'SHRCB', + text: '上海农村商业银行', + }, + { + value: 'YXCCB', + text: '玉溪市商业银行', + }, + { + value: 'YDRCB', + text: '尧都农商行', + }, + { + value: 'BJBANK', + text: '北京银行', + }, + { + value: 'SHBANK', + text: '上海银行', + }, + { + value: 'JSBANK', + text: '江苏银行', + }, + { + value: 'HZCB', + text: '杭州银行', + }, + { + value: 'NJCB', + text: '南京银行', + }, + { + value: 'NBBANK', + text: '宁波银行', + }, + { + value: 'HSBANK', + text: '徽商银行', + }, + { + value: 'CSCB', + text: '长沙银行', + }, + { + value: 'CDCB', + text: '成都银行', + }, + { + value: 'CQBANK', + text: '重庆银行', + }, + { + value: 'DLB', + text: '大连银行', + }, + { + value: 'NCB', + text: '南昌银行', + }, + { + value: 'FJHXBC', + text: '福建海峡银行', + }, + { + value: 'HKB', + text: '汉口银行', + }, + { + value: 'WZCB', + text: '温州银行', + }, + { + value: 'QDCCB', + text: '青岛银行', + }, + { + value: 'TZCB', + text: '台州银行', + }, + { + value: 'JXBANK', + text: '嘉兴银行', + }, + { + value: 'CSRCB', + text: '常熟农村商业银行', + }, + { + value: 'NHB', + text: '南海农村信用联社', + }, + { + value: 'CZRCB', + text: '常州农村信用联社', + }, + { + value: 'H3CB', + text: '内蒙古银行', + }, + { + value: 'SXCB', + text: '绍兴银行', + }, + { + value: 'SDEB', + text: '顺德农商银行', + }, + { + value: 'WJRCB', + text: '吴江农商银行', + }, + { + value: 'ZBCB', + text: '齐商银行', + }, + { + value: 'GYCB', + text: '贵阳市商业银行', + }, + { + value: 'ZYCBANK', + text: '遵义市商业银行', + }, + { + value: 'HZCCB', + text: '湖州市商业银行', + }, + { + value: 'DAQINGB', + text: '龙江银行', + }, + { + value: 'JINCHB', + text: '晋城银行JCBANK', + }, + { + value: 'ZJTLCB', + text: '浙江泰隆商业银行', + }, + { + value: 'GDRCC', + text: '广东省农村信用社联合社', + }, + { + value: 'DRCBCL', + text: '东莞农村商业银行', + }, + { + value: 'MTBANK', + text: '浙江民泰商业银行', + }, + { + value: 'GCB', + text: '广州银行', + }, + { + value: 'LYCB', + text: '辽阳市商业银行', + }, + { + value: 'JSRCU', + text: '江苏省农村信用联合社', + }, + { + value: 'LANGFB', + text: '廊坊银行', + }, + { + value: 'CZCB', + text: '浙江稠州商业银行', + }, + { + value: 'DYCB', + text: '德阳商业银行', + }, + { + value: 'JZBANK', + text: '晋中市商业银行', + }, + { + value: 'BOSZ', + text: '苏州银行', + }, + { + value: 'GLBANK', + text: '桂林银行', + }, + { + value: 'URMQCCB', + text: '乌鲁木齐市商业银行', + }, + { + value: 'CDRCB', + text: '成都农商银行', + }, + { + value: 'ZRCBANK', + text: '张家港农村商业银行', + }, + { + value: 'BOD', + text: '东莞银行', + }, + { + value: 'LSBANK', + text: '莱商银行', + }, + { + value: 'BJRCB', + text: '北京农村商业银行', + }, + { + value: 'TRCB', + text: '天津农商银行', + }, + { + value: 'SRBANK', + text: '上饶银行', + }, + { + value: 'FDB', + text: '富滇银行', + }, + { + value: 'CRCBANK', + text: '重庆农村商业银行', + }, + { + value: 'ASCB', + text: '鞍山银行', + }, + { + value: 'NXBANK', + text: '宁夏银行', + }, + { + value: 'BHB', + text: '河北银行', + }, + { + value: 'HRXJB', + text: '华融湘江银行', + }, + { + value: 'ZGCCB', + text: '自贡市商业银行', + }, + { + value: 'YNRCC', + text: '云南省农村信用社', + }, + { + value: 'JLBANK', + text: '吉林银行', + }, + { + value: 'DYCCB', + text: '东营市商业银行', + }, + { + value: 'KLB', + text: '昆仑银行', + }, + { + value: 'ORBANK', + text: '鄂尔多斯银行', + }, + { + value: 'XTB', + text: '邢台银行', + }, + { + value: 'JSB', + text: '晋商银行', + }, + { + value: 'TCCB', + text: '天津银行', + }, + { + value: 'BOYK', + text: '营口银行', + }, + { + value: 'JLRCU', + text: '吉林农信', + }, + { + value: 'SDRCU', + text: '山东农信', + }, + { + value: 'XABANK', + text: '西安银行', + }, + { + value: 'HBRCU', + text: '河北省农村信用社', + }, + { + value: 'NXRCU', + text: '宁夏黄河农村商业银行', + }, + { + value: 'GZRCU', + text: '贵州省农村信用社', + }, + { + value: 'FXCB', + text: '阜新银行', + }, + { + value: 'HBHSBANK', + text: '湖北银行黄石分行', + }, + { + value: 'ZJNX', + text: '浙江省农村信用社联合社', + }, + { + value: 'XXBANK', + text: '新乡银行', + }, + { + value: 'HBYCBANK', + text: '湖北银行宜昌分行', + }, + { + value: 'LSCCB', + text: '乐山市商业银行', + }, + { + value: 'TCRCB', + text: '江苏太仓农村商业银行', + }, + { + value: 'BZMD', + text: '驻马店银行', + }, + { + value: 'GZB', + text: '赣州银行', + }, + { + value: 'WRCB', + text: '无锡农村商业银行', + }, + { + value: 'BGB', + text: '广西北部湾银行', + }, + { + value: 'GRCB', + text: '广州农商银行', + }, + { + value: 'JRCB', + text: '江苏江阴农村商业银行', + }, + { + value: 'BOP', + text: '平顶山银行', + }, + { + value: 'TACCB', + text: '泰安市商业银行', + }, + { + value: 'CGNB', + text: '南充市商业银行', + }, + { + value: 'CCQTGB', + text: '重庆三峡银行', + }, + { + value: 'XLBANK', + text: '中山小榄村镇银行', + }, + { + value: 'HDBANK', + text: '邯郸银行', + }, + { + value: 'KORLABANK', + text: '库尔勒市商业银行', + }, + { + value: 'BOJZ', + text: '锦州银行', + }, + { + value: 'QLBANK', + text: '齐鲁银行', + }, + { + value: 'BOQH', + text: '青海银行', + }, + { + value: 'YQCCB', + text: '阳泉银行', + }, + { + value: 'SJBANK', + text: '盛京银行', + }, + { + value: 'FSCB', + text: '抚顺银行', + }, + { + value: 'ZZBANK', + text: '郑州银行', + }, + { + value: 'SRCB', + text: '深圳农村商业银行', + }, + { + value: 'BANKWF', + text: '潍坊银行', + }, + { + value: 'JJBANK', + text: '九江银行', + }, + { + value: 'JXRCU', + text: '江西省农村信用', + }, + { + value: 'HNRCU', + text: '河南省农村信用', + }, + { + value: 'GSRCU', + text: '甘肃省农村信用', + }, + { + value: 'SCRCU', + text: '四川省农村信用', + }, + { + value: 'GXRCU', + text: '广西省农村信用', + }, + { + value: 'SXRCCU', + text: '陕西信合', + }, + { + value: 'WHRCB', + text: '武汉农村商业银行', + }, + { + value: 'YBCCB', + text: '宜宾市商业银行', + }, + { + value: 'KSRB', + text: '昆山农村商业银行', + }, + { + value: 'SZSBK', + text: '石嘴山银行', + }, + { + value: 'HSBK', + text: '衡水银行', + }, + { + value: 'XYBANK', + text: '信阳银行', + }, + { + value: 'NBYZ', + text: '鄞州银行', + }, + { + value: 'ZJKCCB', + text: '张家口市商业银行', + }, + { + value: 'XCYH', + text: '许昌银行', + }, + { + value: 'JNBANK', + text: '济宁银行', + }, + { + value: 'CBKF', + text: '开封市商业银行', + }, + { + value: 'WHCCB', + text: '威海市商业银行', + }, + { + value: 'HBC', + text: '湖北银行', + }, + { + value: 'BOCD', + text: '承德银行', + }, + { + value: 'BODD', + text: '丹东银行', + }, + { + value: 'JHBANK', + text: '金华银行', + }, + { + value: 'BOCY', + text: '朝阳银行', + }, + { + value: 'LSBC', + text: '临商银行', + }, + { + value: 'BSB', + text: '包商银行', + }, + { + value: 'LZYH', + text: '兰州银行', + }, + { + value: 'BOZK', + text: '周口银行', + }, + { + value: 'DZBANK', + text: '德州银行', + }, + { + value: 'SCCB', + text: '三门峡银行', + }, + { + value: 'AYCB', + text: '安阳银行', + }, + { + value: 'ARCU', + text: '安徽省农村信用社', + }, + { + value: 'HURCB', + text: '湖北省农村信用社', + }, + { + value: 'HNRCC', + text: '湖南省农村信用社', + }, + { + value: 'NYNB', + text: '广东南粤银行', + }, + { + value: 'LYBANK', + text: '洛阳银行', + }, + { + value: 'NHQS', + text: '农信银清算中心', + }, + { + value: 'CBBQS', + text: '城市商业银行资金清算中心', + }, +]; + +export function getBank() { + return list; +} diff --git a/src/utils/clipboard.ts b/src/utils/clipboard.ts new file mode 100644 index 0000000..2e671a0 --- /dev/null +++ b/src/utils/clipboard.ts @@ -0,0 +1,25 @@ +import useClipboard from 'vue-clipboard3'; + +export default (text: string) => { + return new Promise((resolve, reject) => { + const { toClipboard } = useClipboard(); + if (navigator.clipboard) { + navigator.clipboard + .writeText(text) + .then(() => { + resolve(void 0); + }) + .catch((e) => { + reject(e); + }); + } else { + toClipboard(text) + .then(() => { + resolve(void 0); + }) + .catch((e) => { + reject(e); + }); + } + }); +}; diff --git a/src/utils/communityCombinedFunc.ts b/src/utils/communityCombinedFunc.ts new file mode 100644 index 0000000..6b71575 --- /dev/null +++ b/src/utils/communityCombinedFunc.ts @@ -0,0 +1,17 @@ +import { computed } from 'vue'; +import { useGlobalStore } from '@/stores/global'; + +const globalStore = useGlobalStore(); +const keepScroll = computed(() => { + return globalStore.keepScroll; +}); +const arr = keepScroll.value['/community']; +export function setShowBackTopBtn(index: any, flag: boolean) { + arr.map((item: any) => { + if (item.scrollObj == index) { + item.showBackTopBtn = flag; + } + return item; + }); + keepScroll.value['/community'] = arr; +} diff --git a/src/utils/contentUpdateMarkers.ts b/src/utils/contentUpdateMarkers.ts new file mode 100644 index 0000000..35383fc --- /dev/null +++ b/src/utils/contentUpdateMarkers.ts @@ -0,0 +1,72 @@ +const STORAGE_KEY = 'content_update_markers_viewed'; + +/** 首页「最新」模块 showType */ +const HOME_LATEST_SHOW_TYPE = 100; + +export interface ContentUpdateMarkersViewed { + homeLatestAt?: string; + todayLatestAt?: string; + /** 历史字段保留兼容;一级 Tab 红点不再按亚模块判断 */ + modules: Record; +} + +const readViewed = (): ContentUpdateMarkersViewed => { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return { modules: {} }; + const parsed = JSON.parse(raw) as ContentUpdateMarkersViewed; + return { + homeLatestAt: parsed.homeLatestAt, + todayLatestAt: parsed.todayLatestAt, + modules: parsed.modules || {}, + }; + } catch { + return { modules: {} }; + } +}; + +const writeViewed = (data: ContentUpdateMarkersViewed) => { + localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); +}; + +const isNewer = (markerAt?: string, viewedAt?: string) => { + if (!markerAt) return false; + if (!viewedAt) return true; + return Date.parse(markerAt) > Date.parse(viewedAt); +}; + +const isHomeLatestTab = (item: Types.Home.HomeTabItem) => item.showType === HOME_LATEST_SHOW_TYPE; + +/** + * 首页一级 Tab 更新红点:仅「最新」模块需要,对比 homeLatestAt。 + * 其他模块不展示;「今日最新」二级红点见 shouldShowTodayLatestDot。 + */ +export const shouldShowHomeTabUpdateDot = ( + item: Types.Home.HomeTabItem, + markers?: Types.Home.ContentUpdateMarkers | null, +) => { + if (!markers || !isHomeLatestTab(item)) return false; + return isNewer(markers.homeLatestAt, readViewed().homeLatestAt); +}; + +/** 标记首页「最新」Tab 已查看;其他模块不写本地已读 */ +export const markHomeTabViewed = (item: Types.Home.HomeTabItem, markers?: Types.Home.ContentUpdateMarkers | null) => { + if (!markers?.homeLatestAt || !isHomeLatestTab(item)) return; + const viewed = readViewed(); + viewed.homeLatestAt = markers.homeLatestAt; + writeViewed(viewed); +}; + +/** 「今日最新」二级 Tab 是否展示更新红点 */ +export const shouldShowTodayLatestDot = (markers?: Types.Home.ContentUpdateMarkers | null) => { + if (!markers) return false; + return isNewer(markers.todayLatestAt, readViewed().todayLatestAt); +}; + +/** 标记「今日最新」已查看 */ +export const markTodayLatestViewed = (markers?: Types.Home.ContentUpdateMarkers | null) => { + if (!markers?.todayLatestAt) return; + const viewed = readViewed(); + viewed.todayLatestAt = markers.todayLatestAt; + writeViewed(viewed); +}; diff --git a/src/utils/darkNetCombinedFunc.ts b/src/utils/darkNetCombinedFunc.ts new file mode 100644 index 0000000..14683b3 --- /dev/null +++ b/src/utils/darkNetCombinedFunc.ts @@ -0,0 +1,17 @@ +import { computed } from 'vue'; +import { useGlobalStore } from '@/stores/global'; + +const globalStore = useGlobalStore(); +const keepScroll = computed(() => { + return globalStore.keepScroll; +}); +const arr = keepScroll.value['/darkNet']; +export function setShowBackTopBtn(index: any, flag: boolean) { + arr.map((item: any) => { + if (item.scrollObj == index) { + item.showBackTopBtn = flag; + } + return item; + }); + keepScroll.value['/darkNet'] = arr; +} diff --git a/src/utils/discountCountdownLocal.ts b/src/utils/discountCountdownLocal.ts new file mode 100644 index 0000000..aa75238 --- /dev/null +++ b/src/utils/discountCountdownLocal.ts @@ -0,0 +1,44 @@ +import { PaymentGuideScene } from '@/enums/home'; + +/** 冷启动本地固定 2 小时倒计时(优惠倒计时 / 返回引导 / 会员中心共用) */ +export const DISCOUNT_COUNTDOWN_MS = 2 * 60 * 60 * 1000; + +/** + * 截止时间挂 window,避免 Vite HMR 复制模块后出现多份 deadline。 + */ +const WINDOW_DEADLINE_KEY = '__paymentGuideDiscountDeadlineMs'; + +type DeadlineHost = typeof globalThis & { + [WINDOW_DEADLINE_KEY]?: number; +}; + +const getHost = (): DeadlineHost => globalThis as DeadlineHost; + +/** 优惠倒计时场景:同一次启动是否已展示过 */ +let hasShownThisSession = false; + +/** 确保截止时间已初始化,并返回截止时间戳 */ +export const ensureDiscountCountdownDeadlineMs = () => { + const host = getHost(); + if (host[WINDOW_DEADLINE_KEY] == null) { + host[WINDOW_DEADLINE_KEY] = Date.now() + DISCOUNT_COUNTDOWN_MS; + } + return host[WINDOW_DEADLINE_KEY] as number; +}; + +/** 当前冷启动剩余倒计时毫秒;到期为 0 */ +export const getDiscountCountdownRemainingMs = () => { + const remaining = ensureDiscountCountdownDeadlineMs() - Date.now(); + return remaining > 0 ? remaining : 0; +}; + +/** 同一次启动是否仍可展示优惠倒计时(未展示过且倒计时未结束) */ +export const canShowDiscountCountdownThisSession = () => + !hasShownThisSession && getDiscountCountdownRemainingMs() > 0; + +export const markDiscountCountdownShownThisSession = () => { + hasShownThisSession = true; +}; + +export const isDiscountCountdownScene = (scene: PaymentGuideScene | string) => + scene === PaymentGuideScene.DISCOUNT_COUNTDOWN; diff --git a/src/utils/eventBus.ts b/src/utils/eventBus.ts new file mode 100644 index 0000000..dfabb49 --- /dev/null +++ b/src/utils/eventBus.ts @@ -0,0 +1,5 @@ +import mitt from 'mitt'; + +const emiter = mitt(); + +export default emiter; diff --git a/src/utils/getConfig.ts b/src/utils/getConfig.ts new file mode 100644 index 0000000..6099581 --- /dev/null +++ b/src/utils/getConfig.ts @@ -0,0 +1,38 @@ +import { AdType } from '@/enums/app'; +import { useConfigStore } from '@/stores/config'; + +/** + * 获取广告 + * @param {*} type 广告类型 + * @returns 广告数据 + */ +export function getAdItem(type: AdType): Types.App.AdsInfoListItem[] { + const configStore = useConfigStore(); + if (!configStore?.appConfig || configStore?.appConfig?.adsInfoList?.length == 0) { + return []; + } + const adsInfoList = configStore?.appConfig?.adsInfoList; + const advList: Types.App.AdsInfoListItem[] = adsInfoList?.filter((item: any) => { + if (item.position == type) { + return item; + } + }); + if (!advList || advList.length == 0) return []; + return advList; +} + +/** + * 获取资源地址(有声和文本小说) + */ +export function getResourcesVIDUrl() { + const configStore = useConfigStore(); + return configStore?.sourceInfo?.VID; +} + +/** + * 获取资源地址(图片) + */ +export function getResourcesIMAGEUrl() { + const configStore = useConfigStore(); + return configStore?.sourceInfo?.IMAGE; +} diff --git a/src/utils/h265Playback.ts b/src/utils/h265Playback.ts new file mode 100644 index 0000000..6398f41 --- /dev/null +++ b/src/utils/h265Playback.ts @@ -0,0 +1,132 @@ +/** H.265 硬解探测候选(MSE / canPlayType) */ +const H265_MIME_CANDIDATES = [ + 'video/mp4; codecs="hvc1.1.6.L93.B0"', + 'video/mp4; codecs="hev1.1.6.L93.B0"', + 'video/mp4; codecs="hvc1"', + 'video/mp4; codecs="hev1"', +] as const; + +/** 起播超时(毫秒):超时仍未有效起播则降级 H.264 */ +export const H265_STARTUP_TIMEOUT_MS = 10000; + +let cachedSupportH265: boolean | null = null; + +/** + * 检测当前环境是否支持 H.265 硬解(非软解)。 + * 同会话缓存结果。 + */ +export function detectSupportH265(): boolean { + if (cachedSupportH265 !== null) return cachedSupportH265; + + let supported = false; + try { + const video = document.createElement('video'); + for (const mime of H265_MIME_CANDIDATES) { + const canPlay = video.canPlayType(mime); + if (canPlay === 'probably' || canPlay === 'maybe') { + supported = true; + break; + } + } + if (!supported && typeof MediaSource !== 'undefined' && typeof MediaSource.isTypeSupported === 'function') { + supported = H265_MIME_CANDIDATES.some((mime) => MediaSource.isTypeSupported(mime)); + } + } catch { + supported = false; + } + + cachedSupportH265 = supported; + return supported; +} + +export interface ResolvePlayResourceKeyOptions { + /** H.264 资源 key(必填兜底) */ + h264Key: string; + /** H.265 资源 key,空则不用 */ + h265Key?: string | null; + /** 已降级过,强制走 H.264 */ + forceH264?: boolean; +} + +export interface ResolvePlayResourceKeyResult { + resourceKey: string; + isH265: boolean; +} + +/** + * 选择实际用于拼接 m3u8 的资源 key。 + * 试看场景请勿传入 h265Key(或先自行选用 previewURL)。 + */ +export function resolvePlayResourceKey(options: ResolvePlayResourceKeyOptions): ResolvePlayResourceKeyResult { + const h264Key = options.h264Key || ''; + const h265Key = (options.h265Key || '').trim(); + if (!options.forceH264 && h265Key && detectSupportH265()) { + return { resourceKey: h265Key, isH265: true }; + } + return { resourceKey: h264Key, isH265: false }; +} + +export interface BindH265FallbackOptions { + /** 当前是否正在播 H.265 且尚未降级 */ + shouldFallback: () => boolean; + /** 触发降级;resumeAt 为当前进度秒数 */ + onFallback: (resumeAt: number) => void; + startupTimeoutMs?: number; +} + +/** + * 绑定 H.265 播放失败自动降级(error / fatal hlsError / 起播超时)。 + * 返回解绑函数;内部用 settled 防止重复回调。 + */ +export function bindH265PlaybackFallback(player: any, options: BindH265FallbackOptions): () => void { + let settled = false; + const startupTimeoutMs = options.startupTimeoutMs ?? H265_STARTUP_TIMEOUT_MS; + + const trigger = () => { + if (settled) return; + if (!options.shouldFallback()) return; + settled = true; + window.clearTimeout(startupTimer); + const resumeAt = Number(player?.currentTime ?? player?.video?.currentTime ?? 0) || 0; + options.onFallback(resumeAt); + }; + + const onError = () => trigger(); + const onPlaying = () => { + window.clearTimeout(startupTimer); + }; + const onCanplay = () => { + window.clearTimeout(startupTimer); + }; + const onHlsError = (_event: unknown, data?: { fatal?: boolean }) => { + if (data?.fatal) trigger(); + }; + + player.on?.('error', onError); + player.on?.('playing', onPlaying); + player.on?.('canplay', onCanplay); + + const hls = player?.hls; + if (hls?.on) { + hls.on('hlsError', onHlsError); + } + + const startupTimer = window.setTimeout(() => { + if (!options.shouldFallback()) return; + const currentTime = Number(player?.currentTime ?? player?.video?.currentTime ?? 0) || 0; + const readyState = Number(player?.video?.readyState ?? 0); + // 长时间无法起播:未进入可播状态或进度仍为 0 + if (readyState < 2 || currentTime <= 0) { + trigger(); + } + }, startupTimeoutMs); + + return () => { + settled = true; + window.clearTimeout(startupTimer); + player.off?.('error', onError); + player.off?.('playing', onPlaying); + player.off?.('canplay', onCanplay); + hls?.off?.('hlsError', onHlsError); + }; +} diff --git a/src/utils/homeCombinedFunc.ts b/src/utils/homeCombinedFunc.ts new file mode 100644 index 0000000..1f88932 --- /dev/null +++ b/src/utils/homeCombinedFunc.ts @@ -0,0 +1,17 @@ +import { computed } from 'vue'; +import { useGlobalStore } from '@/stores/global'; + +const globalStore = useGlobalStore(); +const keepScroll = computed(() => { + return globalStore.keepScroll; +}); +const arr = keepScroll.value['/home']; +export function setShowBackTopBtn(index: any, flag: boolean) { + arr.map((item: any) => { + if (item.scrollObj == index) { + item.showBackTopBtn = flag; + } + return item; + }); + keepScroll.value['/home'] = arr; +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..cbae4c4 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,707 @@ +/* eslint-disable @typescript-eslint/ban-types */ +import moment from 'moment'; +import router from '@/router/index'; +import type { HistoryVideoType } from '../enums/app'; +import HomeApi from '@/service/home'; +import MineApi from '@/service/mine'; +import { useGlobalStore } from '@/stores/global'; +import { + closeDB, + cursorGetDataByIndexAndPage, + deleteDB, + getDataByKey, + getDataCount, + openDB, + UpdateData, + tableNames, + dbName, + dbVersion, +} from '@/utils/indexDB'; + +/** 保证 saveTime 唯一且可按观看先后排序(IndexedDB saveTime 索引 unique) */ +let historySaveSeq = 0; +function nextHistorySaveTime() { + historySaveSeq = (historySaveSeq + 1) % 1000; + return Date.now() * 1000 + historySaveSeq; +} +/** + * @description 获取设备类型 + * @returns {string} ios | android | pc + */ +export function getDevType(): string { + const ua = navigator.userAgent || ''; + // Safari「请求桌面网站」后 UA 常变成 Macintosh,需用触屏特征兜回 ios + const isTouchMac = + /Macintosh/i.test(ua) && typeof navigator.maxTouchPoints === 'number' && navigator.maxTouchPoints > 1; + + if (/(iPhone|iPad|iPod|iOS)/i.test(ua) || isTouchMac) { + return 'ios'; + } + if (/(Android)/i.test(ua)) { + return 'android'; + } + return 'ios'; +} + +/** + * @description 二进制数据转hex + * @param arrBytes + * @returns base64 + */ + +export function Bytes2HexString(arrBytes: any) { + let str = ''; + for (let i = 0; i < arrBytes.length; i++) { + let tmp: string; + const num = arrBytes[i]; + if (num < 0) { + //此处填坑,当byte因为符合位导致数值为负时候,需要对数据进行处理 + tmp = (255 + num + 1).toString(16); + } else { + tmp = num.toString(16); + } + if (tmp.length == 1) { + tmp = '0' + tmp; + } + str += tmp; + } + return str; +} + +let debounceTimer: NodeJS.Timeout | null, throttleTimer: NodeJS.Timeout | null; +/** + * 防抖 + * @param fn + * @param delay + * @returns + */ +export const debounce = (fn: Function, delay: number): Function => { + return (...args: unknown[]) => { + if (debounceTimer) { + clearTimeout(debounceTimer); + } + debounceTimer = setTimeout(() => { + fn.apply(this, args); + }, delay); + }; +}; + +/** + * @description 节流 + * @param fn + * @param delay + * @returns + */ +export const throttle = (fn: Function, delay: number): Function => { + return (...args: unknown[]) => { + if (throttleTimer) { + return; + } + throttleTimer = setTimeout(() => { + fn.apply(this, args); + throttleTimer = null; + }, delay); + }; +}; + +/** + * 是否按长视频详情页打开。 + * 优先 newsType(SP=长视频,SHORT=短视频);playTime 仅作兜底。 + */ +export function isLongFormVideo(videoInfo?: { newsType?: string; } | null): boolean { + if (!videoInfo) return false; + const newsType = videoInfo.newsType; + if (newsType === 'SP') return true; + return false; +} + +/** + * 格式化视频播放时长 + * @param value 时长 + * @returns + */ +export function videoTime(value: number) { + //视频时长过滤器 + if (!value) return '00:00'; + if (value >= 3600) { + //如果大于一个小时 + return ( + (Math.floor(value / 3600) < 10 ? '0' + Math.floor(value / 3600) : Math.floor(value / 3600)) + + ':' + + (Math.floor((value % 3600) / 60) < 10 ? '0' + Math.floor((value % 3600) / 60) : Math.floor((value % 3600) / 60)) + + ':' + + ((value % 3600) % 60 < 10 ? '0' + Math.floor((value % 3600) % 60) : Math.floor((value % 3600) % 60)) + ); + } else if (value >= 60) { + //如果大于一分钟 + return ( + (Math.floor(value / 60) < 10 ? '0' + Math.floor(value / 60) : Math.floor(value / 60)) + + ':' + + (value % 60 < 10 ? '0' + (value % 60) : value % 60) + ); + } else { + return '00:' + (value < 10 ? '0' + value : value); + } +} + +/** + * @description 点赞 观看数量过滤器 例如超过一万就显示1.几万 + * @param value 需要格式化的数据 + * @returns + */ +export function watchCount(value: number) { + let str: any = value || 0; + if (value >= 100000000) { + const totleNum = (value / 100000000).toFixed(1); + str = `${parseFloat(totleNum)}亿`; + } else if (value >= 10000) { + const totleNum = (value / 10000).toFixed(1); + str = `${parseFloat(totleNum)}W`; + } + // else if (value >= 1000) { + // const totleNum = (value / 1000).toFixed(1); + // str = `${parseFloat(totleNum)}K`; + // } + return str; +} + +/** + * @description 点赞 观看数量过滤器 例如超过一万就显示1.几万 + * @param value 需要格式化的数据 + * @returns + */ +export function watchCountText(value: number) { + let str: any = value || 0; + if (value >= 10000) { + const totleNum = (value / 10000).toFixed(1); + str = `${parseFloat(totleNum)}万`; + } else if (value >= 1000) { + const totleNum = (value / 1000).toFixed(1); + str = `${parseFloat(totleNum)}千`; + } + return str; +} + +/** + * 日期时间格式化 yyyy-mm-dd hh:mm:ss + * @param date + */ +export function dateFormat(date: string) { + const newDate = new Date(date); + const year = newDate.getFullYear(); // 年 + const month = showTime(newDate.getMonth() + 1); // 月 + const day = showTime(newDate.getDate()); // 日 + const hours = showTime(newDate.getHours()); // 小时 + const minutes = showTime(newDate.getMinutes()); // 分钟 + const second = showTime(newDate.getSeconds()); // 秒 + return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + second; +} + +/** + * 日期时间格式化 yyyy-mm-dd + * @param date + */ +export function dateFormatYyyyMmDd(date: string) { + const newDate = new Date(date); + const year = newDate.getFullYear(); // 年 + const month = showTime(newDate.getMonth() + 1); // 月 + const day = showTime(newDate.getDate()); // 日 + return year + '-' + month + '-' + day; +} + +/** + * 日期时间格式化 mm月dd日 + * @param date + */ +export function dateFormatMmDd(date: string) { + const newDate = new Date(date); + const year = newDate.getFullYear(); // 年 + const month = showTime(newDate.getMonth() + 1); // 月 + const day = showTime(newDate.getDate()); // 日 + return month + '月' + day + '日'; +} + +/** + * 判断时间是否超过当前时间 + * @param date + */ +export function judgeTime(date: string) { + // 时间 + const date1 = new Date(date); + // 当前时间 + const date2 = new Date(); + // 判断时间是否超出 + return date2 > date1 ? true : false; +} + +/** + * 日期时间格式化 yyyy.mm.dd + * @param date + */ +export function dateFormat1(date: string) { + const newDate = new Date(date); + const year = newDate.getFullYear(); // 年 + const month = showTime(newDate.getMonth() + 1); // 月 + const day = showTime(newDate.getDate()); // 日 + return year + '.' + month + '.' + day; +} + +// 不够两位数就补零的函数 +function showTime(t: number) { + const time = t >= 10 ? t : '0' + t; + return time; +} + +/** + * @description 相对时间并支持中文,如:1分钟前 + * @param value 需要对比的时间 + * @returns + */ +export function fromNowTime(time: any) { + moment.updateLocale('zh-cn', { + relativeTime: { + future: '%s内', + past: '%s前', + s: '几秒', + m: '1分钟', + mm: '%d分钟', + h: '1小时', + hh: '%d小时', + d: '1天', + dd: '%d天', + M: '1个月', + MM: '%d个月', + y: '1年', + yy: '%d年', + }, + }); + return moment(time).fromNow(); +} + +/** + * 广告与内链跳转模块 + */ +/** + * 截取URL参数 + * @param name 需要截取url的参数 + * @returns + */ +function getUrlParam(url: string, name: string) { + const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); //构造一个含有目标参数的正则表达式对象 + const r = url.substr(1).match(reg); //匹配目标参数 + + if (r != null) return unescape(r[2]); + return null; //返回参数值 +} +// 转Shanghai时区 +export function changeTimeZone(time: any) { + if (!time) { + return '-'; + } + const sjc = new Date(time); + // 获取上海时区的日期和时间 + const sd = + sjc.toLocaleDateString(undefined, { + hour12: false, + timeZone: 'Asia/Shanghai', + }) + + ' ' + + sjc.toLocaleTimeString(undefined, { + hour12: false, + timeZone: 'Asia/Shanghai', + }); + // 处理24点的情况 + const cxk = sd.replace(/ 24/g, ' 00'); + return cxk; +} +export type JumpAdvOptions = { + /** 跳转会员中心时透传到 /member?sourcePage= */ + sourcePage?: Types.Recharge.PaySourcePage; +}; + +export function innerJump(url: string, options: JumpAdvOptions = {}) { + const globalStore = useGlobalStore(); + const urlIndex = url.indexOf('?'); + let newUrl = url; + if (urlIndex != -1) { + newUrl = url.substring(0, urlIndex); + } + //原味商店 + if (url === 'shop_page') { + toOrigin(); + return; + } + const routeMap: any = { + vip_page: '/member', //VIP中心 + wallet_page: '/wallet', //金币钱包 + universal_agent: '/share', //分享推广 + Lottery: '/lotteryPage', // 抽奖 + rankingList: '/rankingList', // 排行榜 + taskHall: '/freeBenefits?tabActive=1', // 福利任务 + advancePage: '/presale', //预售 + science: '/aiUndress', //AI科技 + live_streaming: '/shortVideo?type=0', // 直播 + + kefu: '/customerService', //在线客服 + community_page: '/community', //跳转社区 + publish_page: '/publishGraphics', //跳转发布 + binding_page: '/bindingPhone', //跳转绑定手机号 + gameAdvancePage: '/jointGamingActivitie', //游戏活动配置 + }; + // 跳转导航栏 + if (newUrl == 'Navigation_bar') { + globalStore.setShowDrawer(!globalStore.showHomeDrawer, 'home'); + return; + } + // 跳转长视频 + if (newUrl == 'video_page') { + const id = getUrlParam(url.substring(urlIndex), 'id'); + router.push({ + path: '/movieDetails', + query: { + vid: id, + }, + }); + return; + } + // 跳转帖子详情 + if (newUrl == 'postdetail') { + const id = getUrlParam(url.substring(urlIndex), 'id'); + router.push({ + path: '/postDetail', + query: { + postid: id, + }, + }); + return; + } + // 社区指定板块 + if (newUrl == 'Community_module') { + const id = getUrlParam(url.substring(urlIndex), 'id'); + jumpCommunity(id as string); + return; + } + // 跳转亚模块 + if (newUrl == 'submodule') { + const id = getUrlParam(url.substring(urlIndex), 'id'); + jumpHome(id as string); + return; + } + const routePath = routeMap[newUrl]; + if (routePath) { + // 会员中心:保留内链 id,并按需附带下单来源 sourcePage + if (routePath === '/member') { + const id = urlIndex != -1 ? getUrlParam(url.substring(urlIndex), 'id') : null; + router.push({ + path: '/member', + query: { + ...(id ? { id } : {}), + ...(options.sourcePage ? { sourcePage: options.sourcePage } : {}), + }, + }); + return; + } + router.push(routePath); + return; + } +} +// 跳转亚模块 +export function jumpHome(id: string) { + const globalStore = useGlobalStore(); + const tabObj: any = globalStore.tabObj; + let index = tabObj.homePage.findIndex((item: any) => item.id === id); + if (index == -1) { + index = 0; + } + globalStore.setActiveIndex(index, 'home'); + if (router.currentRoute.value.path !== '/home') { + router.push('/home'); + } +} +// 跳转社区指定板块 +export function jumpCommunity(id: string) { + const globalStore = useGlobalStore(); + const tabObj: any = globalStore.tabObj; + let tabName = ''; + let index = -1; + index = tabObj.community.findIndex((item: any) => item.id === id); + if (index > -1) { + tabName = 'community'; + globalStore.setCommunityActiveIndex(index); + router.push(`/community?type=${tabName}`); + return; + } + index = tabObj.pics.findIndex((item: any) => item.id === id); + if (index > -1) { + tabName = 'seek'; + globalStore.setCommunityActiveIndex(index); + router.push(`/community?type=${tabName}`); + return; + } + index = tabObj.game.findIndex((item: any) => item.id === id); + if (index > -1) { + tabName = 'game'; + globalStore.setCommunityActiveIndex(index); + router.push(`/community?type=${tabName}`); + return; + } + index = tabObj.novel.findIndex((item: any) => item.id === id); + if (index > -1) { + tabName = 'fiction'; + globalStore.setCommunityActiveIndex(index); + router.push(`/community?type=${tabName}`); + return; + } +} +/** http(s) 外链判断 */ +function isHttpExternalUrl(url: string) { + return /^https?:\/\//i.test(url.trim()); +} + +/** + * url 是否需要走站内 iframe 内嵌打开 + * - inner=1:通用约定开关 + * - type=hongbaoRain:红包雨场次外链固定走内嵌(与 useHongbaoRainCountdown 中 isHongbaoRainBanner 一致,大小写不敏感) + */ +function hasInnerQueryParam(url: string) { + try { + const parsed = new URL(url); + if (parsed.searchParams.get('inner') === '1') return true; + if (parsed.searchParams.get('type')?.toLowerCase() === 'hongbaorain') return true; + return false; + } catch { + const queryIndex = url.indexOf('?'); + if (queryIndex === -1) return false; + const query = url.substring(queryIndex); + if (getUrlParam(query, 'inner') === '1') return true; + return getUrlParam(query, 'type')?.toLowerCase() === 'hongbaorain'; + } +} + +/** + * 跳转广告 + * @param {*} item 广告信息 + */ +export async function jumpAdv( + item: any, + clickTypeOrOptions?: 'ads' | 'recreation' | JumpAdvOptions, + maybeOptions?: JumpAdvOptions, +) { + const clickType = typeof clickTypeOrOptions === 'string' ? clickTypeOrOptions : undefined; + const options: JumpAdvOptions = + typeof clickTypeOrOptions === 'object' && clickTypeOrOptions + ? clickTypeOrOptions + : maybeOptions || {}; + const url = item.href || item.link || item.url || item.link_url || item.linkUrl; + if (!url) return; + try { + if (clickType === 'recreation') { + // 娱乐模块广告点击 + HomeApi.upperRecreatio({ id: item.id, type: 'adv', sysType: getDevType() }); + } + } catch (e) { + console.log(e); + } + const index = url.indexOf('yinseinner://'); + if (index != -1) { + innerJump(url.substring(13), options); + return; + } + // 外链 + inner=1:走站内 iframe 内嵌,不开浏览器新窗口 + if (isHttpExternalUrl(url) && hasInnerQueryParam(url)) { + router.push({ + path: '/activityWeb', + query: { url }, + }); + return; + } + compatibleAppStoreJump(url); +} +// 兼容商店包跳转外部方法 +export function compatibleAppStoreJump(url: any) { + if (isHttpExternalUrl(url) && hasInnerQueryParam(url)) { + router.push({ + path: '/activityWeb', + query: { url }, + }); + return; + } + if (localStorage.getItem('isAppStore')) { + window.webkit?.messageHandlers?.getMessage?.postMessage({ + id: 'openOutLink', + data: { + url: url, + }, + }); + } else { + window.open(url); + } +} +// 到原味商城 +export function toOrigin() { + MineApi.getStoreUrl().then((res: any) => { + const backUrl = encodeURIComponent(window.location.href); + const recharge = encodeURIComponent(window.location.origin + '/wallet'); + if (localStorage.getItem('isAppStore')) { + window.webkit?.messageHandlers?.getMessage?.postMessage({ + id: 'openOutLink', + data: { + url: res + '&backUrl=' + backUrl + '&recharge=' + recharge, + }, + }); + } else { + window.location.href = res + '&backUrl=' + backUrl + '&recharge=' + recharge; + } + }); +} +/** + * 保存历史 + * @param data 视频数据 + * @param type videos 短视频 movies 长视频 + */ +export async function addVideoHistory(data: any, type: HistoryVideoType, time: any) { + if (!data?.id) return; + const infoData = JSON.parse(JSON.stringify(data)); + // 乘 1000 + 序号:同毫秒多次写入不撞 unique 索引,且仍按先后排序 + infoData.saveTime = nextHistorySaveTime(); + infoData.watchtime = time; + const db = await openDB(dbName, dbVersion); + try { + const queryVideo = await getDataByKey(db, type, infoData.id); + // 新记录才裁最旧;已存在则 put 更新 saveTime,置顶到最近观看 + if (!queryVideo) { + const count: number = await getDataCount(db, type, null); + if (count >= 50) { + const list: any[] = await cursorGetDataByIndexAndPage(db, type, 1, 1, 'next', 'saveTime'); + const oldestId = list?.[0]?.id; + if (oldestId != null) { + await deleteDB(db, type, oldestId); + } + } + } + // put 覆盖同 id,避免 delete+add 未 await / 提前 closeDB 导致丢记录或旧 saveTime 残留 + await UpdateData(db, type, infoData); + closeDB(db); + } catch (error) { + closeDB(db); + } +} + +export async function getVideoHistoryByKey(id: any, type: HistoryVideoType) { + const db = await openDB('91porn_db', 1); + try { + const queryVideo = await getDataByKey(db, type, id); + closeDB(db); + return queryVideo; + } catch (error) { + closeDB(db); + return {}; + } +} + +/** + * 查询视频历史记录 + * @param page 页码 + * @param size 每次多少条 + * @param type videos 短视频 movies 长视频 + * @returns Array + */ +export async function queryHistoryVideo(page: any, size: any, type: HistoryVideoType) { + const db = await openDB(dbName, dbVersion); + const list = await cursorGetDataByIndexAndPage(db, type, page, size, 'prev', 'saveTime'); + closeDB(db); + return list || []; +} + +export function sec_to_time(s: any) { + let t = ''; + if (s > -1) { + const hour = Math.floor(s / 3600); + const min = Math.floor(s / 60) % 60; + const sec = s % 60; + if (hour < 10) { + t = '0' + hour + ':'; + } else { + t = hour + ':'; + } + + if (min < 10) { + t += '0'; + } + t += min + ':'; + if (sec < 10) { + t += '0'; + } + t += sec; + } + return t; +} + +export function InitURL(url: string) { + if (!/https?:\/\/./.test(url)) { + url += 'https://'; + } + return new URL(url); +} + +/** + * 分割数组 + * @param date + */ +export function sliceArray(array: any, length: any) { + let index = 0; + const newArray = []; + while (index < array.length) { + newArray.push(array.slice(index, (index += length))); + } + return newArray; +} + +/** + * 资源跳转 + * @param {*} item 资源跳转 + */ +export async function jumpResource(item: any) { + // 跳转长视频 + if (item.quoteType == 'vid') { + router.push({ + path: '/movieDetails', + query: { + vid: item.quoteID, + }, + }); + } else if (item.quoteType == 'post') { + // 跳转帖子 + router.push({ + path: '/postDetail', + query: { postid: item.quoteID }, + }); + } else if (item.quoteType == 'col') { + // 跳转用户播单 + router.push({ + path: '/playOrderColDetails', + query: { sectionId: item.quoteID, type: '1' }, + }); + } else { + // 跳转图集 + router.push({ path: '/coverPreview', query: { index: 1, id: item.quoteID } }); + // router.push({ + // path: '/coverDetail', + // query: { + // id: item.quoteID, + // }, + // }); + } +} + +// 显示时分秒 +export function secondsToTimeFormat(seconds: number) { + const duration = moment.duration(seconds, 'seconds'); + + const hours = String(Math.floor(duration.asHours())).padStart(2, '0'); // 小时 + const minutes = String(duration.minutes()).padStart(2, '0'); // 分钟 + const secs = String(duration.seconds()).padStart(2, '0'); // 秒 + + // 返回格式化字符串 + return `${hours}:${minutes}:${secs}`; +} diff --git a/src/utils/indexDB.ts b/src/utils/indexDB.ts new file mode 100644 index 0000000..2df52cf --- /dev/null +++ b/src/utils/indexDB.ts @@ -0,0 +1,399 @@ +import { HistoryVideoType } from '@/enums/app'; +//兼容浏览器 +const indexedDB = + (window as any).indexedDB || + (window as any).mozIndexedDB || + (window as any).webkitIndexedDB || + (window as any).msIndexedDB; +const IDBTransaction = (window as any).IDBTransaction || + (window as any).webkitIDBTransaction || + (window as any).msIDBTransaction || { + READ_WRITE: 'readwrite', + }; +const IDBKeyRange = (window as any).IDBKeyRange || (window as any).webkitIDBKeyRange || (window as any).msIDBKeyRange; +const dbName = '91porn_db'; // 数据库名称 +const dbVersion = 1; // 数据库版本 +const tableNames = Object.values(HistoryVideoType); // 表名 +/** + * 打开数据库 + * @param {*} dbName 数据库实例 + * @param {*} version 仓库民 + * @returns + */ +function openDB(dbName: string, version = 1) { + return new Promise((resolve, reject) => { + let db: any; + const openRequest = indexedDB.open(dbName, version); + openRequest.onerror = (event: any) => { + //打开数据库失败 + reject(event); + }; + openRequest.onsuccess = (event: any) => { + // 打开数据库成功 + db = event.target.result; + resolve(db); + }; + // 数据库有更新时使用 + openRequest.onupgradeneeded = function (event: any) { + db = event.target.result; + // const tableNames = Object.values(HistoryVideoType); + tableNames.forEach((tableName) => { + if (!db.objectStoreNames.contains(tableName)) { + const objectStore = db.createObjectStore(tableName, { + keyPath: 'id', + }); + // 创建id为索引 + objectStore.createIndex('id', 'id', { + unique: true, + }); + // 创建时间为索引 + objectStore.createIndex('saveTime', 'saveTime', { + unique: true, + }); + } + }); + }; + }); +} + +/** + * 插入数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @param {*} data 插入的数据 + */ +function addData(db: any, storeName: string, data: any) { + return new Promise((resolve) => { + const request = db.transaction([storeName], 'readwrite').objectStore(storeName).add(data); + request.onsuccess = function () { + // 数据写入成功 + resolve(true); + }; + request.onerror = function () { + // 数据写入失败 + resolve(false); + }; + }); +} + +/** + * 更新数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @param {*} data 更新数据 + */ +function UpdateData(db: any, storeName: string, data: any) { + return new Promise((resolve) => { + const request = db.transaction([storeName], 'readwrite').objectStore(storeName).put(data); + request.onsuccess = function () { + // 数据更新成功 + resolve(true); + }; + request.onerror = function (err: any) { + // 数据更新失败 + console.log(err); + resolve(false); + }; + }); +} + +/** + * 通过主键读取数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @param {*} key 主键名 + * @returns + */ +function getDataByKey(db: any, storeName: string, key: any) { + return new Promise((resolve, reject) => { + const request = db.transaction([storeName]).objectStore(storeName).get(key); + request.onsuccess = function () { + resolve(request.result); + }; + request.onerror = function (event: any) { + // 事务失败 + reject(event); + }; + }); +} + +/** + * 查询所有数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @returns 查询所有数据 + */ +function getAllData(db: any, storeName: string) { + return new Promise((resolve, reject) => { + const request = db.transaction([storeName]).objectStore(storeName).getAll(); + request.onsuccess = function () { + resolve(request.result); + }; + request.onerror = function (event: any) { + // 事务失败 + reject(event); + }; + }); +} + +/** + * 查询仓库多少条数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @param {*} count 查询的条数 + */ +function getDataCount(db: any, storeName: string, count: any) { + return new Promise((resolve, reject) => { + const store = db.transaction(storeName, 'readwrite').objectStore(storeName); + let request: any; + if (count) { + request = store.count(count); + } + request = store.count(); + request.onsuccess = function () { + resolve(request.result); + }; + request.onerror = function (event: any) { + // 事务失败 + reject(event); + }; + }); +} + +/** + * 通过游标读取数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @param {*} date 索引日期 + * @param {*} solt 倒序还是正序 + * @returns 查询所有数据prev next + */ +function cursorGetData(db: any, storeName: string, date: any, solt: any) { + return new Promise((resolve, reject) => { + const list: any = []; + const store = db.transaction(storeName, 'readwrite').objectStore(storeName); + const index = store.index(date); + const cursorRequest = index.openCursor(null, solt); + cursorRequest.onsuccess = function (e: any) { + const cursor = e.target.result; + if (cursor) { + list.push(cursor.value); + cursor.continue(); //遍历了指针对象中的所有内容 + } else { + resolve(list); + } + }; + cursorRequest.onerror = function (e: any) { + reject(e); + }; + }); +} + +/** + * 通过索引获取数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @param {*} indexName 索引名 + * @param {*} indexValue 索引值 + * @returns 通过索引查询的数据 + */ +function getDataByIndex(db: any, storeName: string, indexName: any, indexValue: any) { + return new Promise((resolve, reject) => { + const store = db.transaction(storeName, 'readwrite').objectStore(storeName); + const request = store.index(indexName).get(indexValue); + request.onsuccess = function () { + resolve(request.result); + }; + request.onerror = function (event: any) { + // 事务失败 + reject(event); + }; + }); +} + +/** + * //通过索引和游标读取数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库民 + * @param {*} indexName 索引名 + * @param {*} indexValue 索引值 + * @returns 返回一个Promise 查询成功数据或者错误信息 + */ +function cursorGetDataBuIndex(db: any, storeName: string, indexName: any, indexValue: any) { + return new Promise((resolve, reject) => { + const list: any = []; + const store = db.transaction(storeName, 'readwrite').objectStore(storeName); + const request = store.index(indexName).openCursor(IDBKeyRange.only(indexValue)); + request.onsuccess = function (e: any) { + const cursor = e.target.result; + if (cursor) { + list.push(cursor.value); + cursor.continue(); //遍历了指针对象中的所有内容 + } else { + resolve(list); + } + }; + request.onerror = function (e: any) { + reject(e); + }; + }); +} + +/** + * + * @param {*} db 数据库实例 + * @param {*} storeName 仓库名 + * @param {*} page 页码 + * @param {*} size 每页多少条 + * @param {*} solt 倒序还是正序 + * @returns 分页查询的数据 + */ +function cursorGetDataByIndexAndPage(db: any, storeName: string, page: any, size: any, solt: any, date: any) { + return new Promise((resolve, reject) => { + const list: any = []; + let counter = 0; //计数器 + let advanced = true; // 是否跳过多少条数据查询 + const store = db.transaction(storeName, 'readwrite').objectStore(storeName); + const index = store.index(date); + const requset = index.openCursor(null, solt); + requset.onsuccess = function (e: any) { + let cursor: any = e.target.result; + if (page > 1 && advanced) { + advanced = false; + cursor?.advance((page - 1) * size); //跳过多少条数据 + return; + } + if (cursor) { + list.push(cursor.value); + counter++; + if (counter < size) { + cursor.continue(); + } else { + cursor = null; + resolve(list); + } + } else { + resolve(list); + } + }; + requset.onerror = function (e: any) { + reject(e); + }; + }); +} + +/** + * + * //通过索引和游标删除数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库名 + * @param {*} indexName 索引名 + * @param {*} indexValue 索引值 + * @returns 返回一个Promise true 删除成功, false 删除失败 + */ +function cursorDelete(db: any, storeName: string, indexName: any, indexValue: any) { + return new Promise((resolve, reject) => { + const store = db.transaction(storeName, 'readwrite').objectStore(storeName); + const request = store.index(indexName).openCursor(IDBKeyRange.only(indexValue)); + request.onsuccess = function (e: any) { + const cursor = e.target.result; + let deleteRequest; + if (cursor) { + deleteRequest = cursor.delete(); + deleteRequest.onerror = function () { + // 删除失败 + resolve(false); + }; + deleteRequest.onsuccess = function () { + // 删除成功 + resolve(true); + }; + cursor.continue(); + } + }; + request.onsuccess = function (e: any) { + // 事务失败 + reject(e); + }; + }); +} + +/** + * 通过主键删除数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库名 + * @param {*} id 主键ID + * @returns true 删除成功 + */ +function deleteDB(db: any, storeName: string, id: any) { + return new Promise((resolve, reject) => { + const request = db.transaction(storeName, 'readwrite').objectStore(storeName).delete(id); + request.onsuccess = function () { + resolve(true); + }; + request.onerror = function (event: any) { + // 事务失败 + reject(event); + }; + }); +} + +/** + * 批量删除数据 + * @param {*} db 数据库实例 + * @param {*} storeName 仓库名 + * @param {*} ids 要删除的id数组 + * @returns Promise 删除是否成功 + */ +function batchDeleteDB(db: any, storeName: string, ids: any[]) { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, 'readwrite'); + const store = transaction.objectStore(storeName); + let successCount = 0; + let errorCount = 0; + + ids.forEach(id => { + const request = store.delete(id); + request.onsuccess = () => { + successCount++; + if (successCount + errorCount === ids.length) { + resolve(successCount === ids.length); + } + }; + request.onerror = () => { + errorCount++; + if (successCount + errorCount === ids.length) { + resolve(successCount === ids.length); + } + }; + }); + }); +} + +/** + * 关闭数据库 + * @param {*} db 数据库实例 + */ +function closeDB(db: any) { + db.close(); +} + +export { + openDB, + addData, + getDataByKey, + getAllData, + cursorGetData, + getDataByIndex, + cursorGetDataBuIndex, + cursorGetDataByIndexAndPage, + cursorDelete, + deleteDB, + closeDB, + getDataCount, + UpdateData, + dbName, + dbVersion, + tableNames, + batchDeleteDB, +}; diff --git a/src/utils/key.ts b/src/utils/key.ts new file mode 100644 index 0000000..3eddcc7 --- /dev/null +++ b/src/utils/key.ts @@ -0,0 +1,177 @@ +import CryptoJS from 'crypto-js'; +import { Buffer } from 'buffer'; +import { Bytes2HexString } from '.'; + +export class Key { + static interfaceKey = '65dc07d1b7915c6b2937432b091837a7'; //接口解密key + static imgKey = '2019ysapp7527'; //图片解密key + static parameterKey = 'BxJand%xf5h3sycH'; //参数加密key + static parameterIv = 'BxJand%xf5h3sycH'; //参数加密IV +} + +// 生成一个随机字符串作为种子 +export function generateRandomString(length: number) { + const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let randomString = ''; + for (let i = 0; i < length; i++) { + const randomIndex = Math.floor(Math.random() * characters.length); + randomString += characters.charAt(randomIndex); + } + return randomString; +} + +//参数加密 +export function encrypt(data: Types.PlainObject) { + const word = JSON.stringify(data); //参数转成json字符串 + const iv = CryptoJS.enc.Utf8.parse(Key.parameterIv); + const key = CryptoJS.enc.Utf8.parse(Key.parameterKey); + const wordParse = CryptoJS.enc.Utf8.parse(word); + const encrypted = CryptoJS.AES.encrypt(wordParse, key, { + iv, + mode: CryptoJS.mode.CBC, //模式 + padding: CryptoJS.pad.Pkcs7, + }); + return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); +} + +// url参数加密,用于分享页 +export function encryptUrl(data: Types.PlainObject, theKey: string) { + const word = JSON.stringify(data); //参数转成json字符串 + const iv = CryptoJS.enc.Utf8.parse(theKey); + const key = CryptoJS.enc.Utf8.parse(theKey); + const wordParse = CryptoJS.enc.Utf8.parse(word); + const encrypted = CryptoJS.AES.encrypt(wordParse, key, { + iv, + mode: CryptoJS.mode.CBC, //模式 + padding: CryptoJS.pad.Pkcs7, + }); + return CryptoJS.enc.Base64.stringify(encrypted.ciphertext); +} + +// + 替换为 * +// / 替换为 - 中划线 +// = 替换为 _A 下划线加字母A +export function encodeConvertUrl(data: string) { + return data.replace(/\+/g, '*').replace(/\//g, '-').replace(/=/g, '_A'); +} + +// 参数解密 +export function decryptUrl(encryptedData: string, theKey: string): any { + const iv = CryptoJS.enc.Utf8.parse(theKey); + const key = CryptoJS.enc.Utf8.parse(theKey); + + const decrypted = CryptoJS.AES.decrypt(encryptedData, key, { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + + const decryptedText = CryptoJS.enc.Utf8.stringify(decrypted); + return JSON.parse(decryptedText); +} + +// * 替换为 + +// - 替换为 / +// _A 替换为 = +export function decodeConvertUrl(data: string) { + return data.replace(/\*/g, '+').replace(/-/g, '/').replace(/_A/g, '='); +} + +export function parseHexInChunks(hexData: any, chunkSize: number) { + const parsedResult = CryptoJS.lib.WordArray.create(); + for (let i = 0; i < hexData.length; i += chunkSize) { + const chunk = hexData.substring(i, i + chunkSize); + parsedResult.concat(CryptoJS.enc.Hex.parse(chunk)); + } + return parsedResult; +} + +function wordArrayToUint8Array(wordArray: any): Uint8Array { + const words = wordArray.words; + const sigBytes = wordArray.sigBytes; + const result = new Uint8Array(sigBytes); + for (let i = 0; i < sigBytes; i += 1) { + result[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + } + return result; +} + +function concatUint8(...parts: Uint8Array[]): Uint8Array { + const length = parts.reduce((sum, p) => sum + p.length, 0); + const result = new Uint8Array(length); + let offset = 0; + for (const part of parts) { + result.set(part, offset); + offset += part.length; + } + return result; +} + +function uint8ToWordArray(data: Uint8Array) { + return CryptoJS.lib.WordArray.create(data as any); +} + +const interfaceKeyBuf = new TextEncoder().encode(Key.interfaceKey); +const imgKeyBuf = new TextEncoder().encode(Key.imgKey); + +//接口解密 +export function cryptoDecrypt(data: string) { + const dataStr = (data + '').trim(); + const cipherBytes: Uint8Array = Buffer.from(dataStr, 'base64'); + const nonceLen = 12; + const nonce = cipherBytes.slice(0, nonceLen); + + // 1) 计算 msgKey + const largeShaRaw = concatUint8(interfaceKeyBuf, nonce); + const largeShaRawMid = largeShaRaw.length >> 1; + + const msgKeyLarge = CryptoJS.SHA256(uint8ToWordArray(largeShaRaw)); + const msgKeyLargeBytes = wordArrayToUint8Array(msgKeyLarge); + const msgKey = msgKeyLargeBytes.slice(8, 24); + + // 2) 计算 sha256a, sha256b + const shaRawA = concatUint8(msgKey, largeShaRaw.slice(0, largeShaRawMid)); + const shaRawB = concatUint8(largeShaRaw.slice(largeShaRawMid), msgKey); + + const sha256a = wordArrayToUint8Array(CryptoJS.SHA256(uint8ToWordArray(shaRawA))); + const sha256b = wordArrayToUint8Array(CryptoJS.SHA256(uint8ToWordArray(shaRawB))); + + // 3) 生成 AES key/iv + const aesKey = concatUint8(sha256a.slice(0, 8), sha256b.slice(8, 24), sha256a.slice(24)); + const aesIV = concatUint8(sha256b.slice(0, 4), sha256a.slice(12, 20), sha256b.slice(28)); + + const cipherPayload = cipherBytes.slice(nonceLen); + + const decryptedWordArray = CryptoJS.AES.decrypt( + { ciphertext: uint8ToWordArray(cipherPayload) }, + uint8ToWordArray(aesKey), + { + iv: uint8ToWordArray(aesIV), + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }, + ); + + const decrypt = CryptoJS.enc.Utf8.stringify(decryptedWordArray); + return JSON.parse(decrypt); +} + +/** + * 图片解密 + * @param buffer buffer + * @returns + */ +export function imgEncrypt(buffer: ArrayBuffer) { + if (!buffer || buffer.byteLength === 0) { + return ''; + } + const bytes = new Uint8Array(buffer); + const limit = Math.min(100, bytes.length); + for (let i = 0; i < limit; i += 1) { + bytes[i] ^= imgKeyBuf[i % imgKeyBuf.length]; + } + const blob = new Blob([bytes], { + type: 'image/png', + }); + return URL.createObjectURL(blob); +} diff --git a/src/utils/longStorage.ts b/src/utils/longStorage.ts new file mode 100644 index 0000000..4caacea --- /dev/null +++ b/src/utils/longStorage.ts @@ -0,0 +1,32 @@ +// 保存数据到 sessionStorage +export const setSessionItem = (key: any, value: any) => { + sessionStorage.setItem(key, value); +}; +// 从 sessionStorage 获取数据 +export const getSessionItem = (key: any) => { + return sessionStorage.getItem(key) || ''; +}; +// 从 sessionStorage 删除保存的数据 +export const removeSession = (key: any) => { + sessionStorage.removeItem(key); +}; +// 从 sessionStorage 删除所有保存的数据 +export const cleanAllSession = () => { + sessionStorage.clear(); +}; +// 保存数据到 sessionStorage +export const setLocalItem = (key: any, value: any) => { + localStorage.setItem(key, value); +}; +// 从 localStorage 获取数据 +export const getLocalItem = (key: any) => { + return localStorage.getItem(key) || ''; +}; +// 从 sessionStorage 删除保存的数据 +export const removeLocal = (key: any) => { + localStorage.removeItem(key); +}; +// 从 sessionStorage 删除所有保存的数据 +export const cleanAllLocal = () => { + localStorage.clear(); +}; diff --git a/src/utils/paySourcePage.ts b/src/utils/paySourcePage.ts new file mode 100644 index 0000000..acf7fb6 --- /dev/null +++ b/src/utils/paySourcePage.ts @@ -0,0 +1,14 @@ +/** 从会员中心入口 query 透传、可覆盖默认 VIP_CENTER 的来源 */ +const MEMBER_ENTRY_SOURCE_PAGES: Types.Recharge.PaySourcePage[] = [ + 'HOME_FLOAT_WINDOW', + 'HOME_USER_SEGMENT', +]; + +/** 会员页下单 sourcePage:合法入口 query 优先,否则 VIP_CENTER */ +export const resolveMemberPaySourcePage = (raw: unknown): Types.Recharge.PaySourcePage => { + const value = String(raw || ''); + if ((MEMBER_ENTRY_SOURCE_PAGES as string[]).includes(value)) { + return value as Types.Recharge.PaySourcePage; + } + return 'VIP_CENTER'; +}; diff --git a/src/utils/paymentGuide.ts b/src/utils/paymentGuide.ts new file mode 100644 index 0000000..abd5ffa --- /dev/null +++ b/src/utils/paymentGuide.ts @@ -0,0 +1,243 @@ +import AppApi from '@/service/app'; +import { useConfigStore } from '@/stores/config'; +import { useUserStore } from '@/stores/user'; +import { PaymentGuideScene } from '@/enums/home'; + +import { + isPaymentGuideLocalSwitchOn, +} from '@/utils/paymentGuideLocalSwitch'; + +/** 多实例 usePaymentGuide 互斥,避免全局与页面弹窗叠层 */ +let isPaymentGuidePresenting = false; +const presentLockListeners = new Set<(locked: boolean) => void>(); + +const notifyPresentLockListeners = () => { + const locked = isPaymentGuidePresenting; + presentLockListeners.forEach((listener) => listener(locked)); +}; + +export const tryAcquirePaymentGuidePresentLock = () => { + if (isPaymentGuidePresenting) return false; + isPaymentGuidePresenting = true; + notifyPresentLockListeners(); + return true; +}; + +export const releasePaymentGuidePresentLock = () => { + if (!isPaymentGuidePresenting) return; + isPaymentGuidePresenting = false; + notifyPresentLockListeners(); +}; + +/** 其它实例是否正在展示付费引导(首页吸底等需据此避让 / 补试) */ +export const isPaymentGuidePresentLocked = () => isPaymentGuidePresenting; + +/** 监听互斥锁变化;返回取消订阅函数 */ +export const onPaymentGuidePresentLockChange = (listener: (locked: boolean) => void) => { + presentLockListeners.add(listener); + return () => { + presentLockListeners.delete(listener); + }; +}; + +/** 读取 Ping 缓存的付费引导总配置;无缓存返回 undefined */ +export const getPaymentGuidePing = (): Types.Payment.PaymentGuidePing | undefined => { + const configStore = useConfigStore(); + return configStore.appConfig?.paymentGuide; +}; + +/** 新版 Ping 付费引导已启用(用于与旧 paymentStatusPopup 弹窗互斥) */ +export const isPaymentGuideSystemEnabled = () => getPaymentGuidePing()?.enabled === true; + +/** + * Ping 对会员/非会员下发配置相同;转化类付费引导需前端拦截会员。 + * 免费次数 / 新用户引导等非「老用户转化」场景只拦会员。 + */ +export const shouldBlockPaymentGuideForMember = () => useUserStore().isVip; + +/** + * 需「非会员 + 注册≥24小时」的转化场景(首页吸底 / 试看3s / 返回 / 进会员中心 / 上新)。 + * 免费次数、优惠倒计时等不在此列。 + */ +const PAYMENT_GUIDE_AUDIENCE_SCENES: ReadonlySet = new Set([ + PaymentGuideScene.HOME_OLD_USER, + PaymentGuideScene.VIDEO_PREVIEW_END, + PaymentGuideScene.VIDEO_BACK, + PaymentGuideScene.VIP_CENTER, + PaymentGuideScene.VIP_CONTENT_UPDATE, +]); + +export const isPaymentGuideAudienceScene = (scene: string) => PAYMENT_GUIDE_AUDIENCE_SCENES.has(scene); + +/** 受众场景:会员或注册未满 24h 则拦截;其它场景仅拦会员 */ +export const shouldBlockPaymentGuideByAudience = (scene: string) => { + if (shouldBlockPaymentGuideForMember()) return true; + if (isPaymentGuideAudienceScene(scene) && useUserStore().isNewUser) return true; + return false; +}; + +/** 上新场景是否允许发起独立接口(以 Ping 开关为准) */ +export const canFetchVipContentUpdateFromPing = () => { + const ping = getPaymentGuidePing(); + if (!ping?.enabled) return false; + return ping.scenes?.[PaymentGuideScene.VIP_CONTENT_UPDATE]?.enabled === true; +}; + +/** 取某普通场景的 Ping 配置 */ +export const getPaymentGuideSceneConfig = (scene: string) => { + const ping = getPaymentGuidePing(); + if (!ping?.enabled) return undefined; + return ping.scenes?.[scene]; +}; + +/** + * 长视频返回引导:非会员 + 注册≥24h + 全局开 + enabled + 后端 show + 本地震框开关 + configId。 + * 后端 show 只读不改;本地震框开关关弹窗后为 false,重新进入再开。 + */ +export const canShowVideoBackGuideFromPing = () => { + if (shouldBlockPaymentGuideByAudience(PaymentGuideScene.VIDEO_BACK)) return false; + if (!isPaymentGuideLocalSwitchOn(PaymentGuideScene.VIDEO_BACK)) return false; + const sceneConfig = getPaymentGuideSceneConfig(PaymentGuideScene.VIDEO_BACK); + if (!sceneConfig) return false; + return sceneConfig.enabled === true && sceneConfig.show === true && !!sceneConfig.configId; +}; + +/** + * 开播 3s 试看引导:非会员 + 注册≥24h + enabled + 后端 show + 本地震框开关 + configId。 + * 后端 show 只读不改。 + */ +export const canShowVideoPreviewEndGuideFromPing = () => { + if (shouldBlockPaymentGuideByAudience(PaymentGuideScene.VIDEO_PREVIEW_END)) return false; + if (!isPaymentGuideLocalSwitchOn(PaymentGuideScene.VIDEO_PREVIEW_END)) return false; + const sceneConfig = getPaymentGuideSceneConfig(PaymentGuideScene.VIDEO_PREVIEW_END); + if (!sceneConfig) return false; + return sceneConfig.enabled === true && sceneConfig.show === true && !!sceneConfig.configId; +}; + +/** + * 会员中心优惠:非会员 + 注册≥24h + enabled + 后端 show + configId + 本地震框开关。 + * 后端 show 为功能开关;进入会员中心的触发频次由前端控制,与 show 无关。 + */ +export const canShowVipCenterGuideFromPing = () => { + if (shouldBlockPaymentGuideByAudience(PaymentGuideScene.VIP_CENTER)) return false; + if (!isPaymentGuideLocalSwitchOn(PaymentGuideScene.VIP_CENTER)) return false; + const sceneConfig = getPaymentGuideSceneConfig(PaymentGuideScene.VIP_CENTER); + if (!sceneConfig) return false; + return sceneConfig.enabled === true && sceneConfig.show === true && !!sceneConfig.configId; +}; + +/** + * 普通场景是否可展示:受众 + enabled + 后端 show + 本地震框开关 + configId。 + * 后端 show 只读;本地震框开关与接口无关。 + */ +export const canShowPaymentGuideFromPing = (scene: string) => { + if (shouldBlockPaymentGuideByAudience(scene)) return false; + if (!isPaymentGuideLocalSwitchOn(scene)) return false; + if (scene === PaymentGuideScene.VIDEO_BACK) return canShowVideoBackGuideFromPing(); + if (scene === PaymentGuideScene.VIDEO_PREVIEW_END) return canShowVideoPreviewEndGuideFromPing(); + if (scene === PaymentGuideScene.VIP_CENTER) return canShowVipCenterGuideFromPing(); + const sceneConfig = getPaymentGuideSceneConfig(scene); + if (!sceneConfig) return false; + return sceneConfig.enabled === true && sceneConfig.show === true && !!sceneConfig.configId; +}; + +/** 将 Ping 场景配置转为弹窗用的 PaymentGuide */ +export const toPaymentGuideFromSceneConfig = ( + sceneConfig: Types.Payment.PaymentGuideSceneConfig, + segment?: string, +): Types.Payment.PaymentGuide => ({ + show: true, + configId: sceneConfig.configId, + segment, + style: sceneConfig.style, + title: sceneConfig.title, + description: sceneConfig.description, + cover: sceneConfig.cover, + productId: sceneConfig.productId, + durationSeconds: sceneConfig.durationSeconds, + action: sceneConfig.action, +}); + +/** 登录/退出/会员状态变化后刷新 paymentGuide 并覆盖本地缓存 */ +export const refreshPaymentGuideConfig = async () => { + const configStore = useConfigStore(); + + try { + const data = await AppApi.refreshPaymentGuide(); + if (!data?.paymentGuide) return; + + configStore.saveAppConfig({ + ...configStore.appConfig, + paymentGuide: data.paymentGuide, + }); + } catch (error) { + console.error('refreshPaymentGuideConfig failed:', error); + } +}; + +/** + * 旧逻辑曾把各场景 show 本地改成 false(误关功能开关)。 + * 同会话检测到本地 show=false 时拉一次后端覆盖,以恢复真实开关。 + */ +let paymentGuideShowHealAttempted = false; +export const healPaymentGuideShowFromServerIfNeeded = async (scene: string) => { + if (paymentGuideShowHealAttempted) return; + const sceneConfig = getPaymentGuideSceneConfig(scene); + if (!sceneConfig || sceneConfig.show !== false) return; + paymentGuideShowHealAttempted = true; + await refreshPaymentGuideConfig(); +}; + +/** + * HOME_OLD_USER:仅启动页跳首页时允许弹一次。 + * Splash goApp 打标,首页消费后清除;其它方式回首页不会再弹。 + */ +let homeOldUserGuidePendingFromSplash = false; + +export const markHomeOldUserGuidePendingFromSplash = () => { + homeOldUserGuidePendingFromSplash = true; +}; + +/** @returns 本次进入首页是否允许尝试老用户吸底(消费即清空) */ +export const consumeHomeOldUserGuideFromSplash = () => { + if (!homeOldUserGuidePendingFromSplash) return false; + homeOldUserGuidePendingFromSplash = false; + return true; +}; + +/** 已用免费次数看过的片:重进不弹 5 分钟额度引导(按用户隔离) */ +const FREE_WATCH_USED_VIDS_KEY = 'paymentGuide:freeWatchUsedVids'; +const FREE_WATCH_USED_VIDS_MAX = 200; + +const freeWatchUsedVidsStorageKey = (uid: string | number) => `${FREE_WATCH_USED_VIDS_KEY}:${uid}`; + +const readFreeWatchUsedVids = (uid: string | number): string[] => { + try { + const raw = localStorage.getItem(freeWatchUsedVidsStorageKey(uid)); + if (!raw) return []; + const parsed = JSON.parse(raw); + return Array.isArray(parsed) ? parsed.map(String).filter(Boolean) : []; + } catch { + return []; + } +}; + +/** 本片是否已记过「用免费次数看过」,重进应跳过 5 分钟额度引导 */ +export const hasMarkedFreeWatchUsedVideo = (uid: string | number | undefined, videoId: string) => { + if (uid == null || uid === '' || !videoId) return false; + return readFreeWatchUsedVids(uid).includes(String(videoId)); +}; + +/** 记下已用免费次数看过的片(FIFO 上限,避免 localStorage 无限涨) */ +export const markFreeWatchUsedVideo = (uid: string | number | undefined, videoId: string) => { + if (uid == null || uid === '' || !videoId) return; + const id = String(videoId); + const next = readFreeWatchUsedVids(uid).filter((item) => item !== id); + next.push(id); + while (next.length > FREE_WATCH_USED_VIDS_MAX) next.shift(); + try { + localStorage.setItem(freeWatchUsedVidsStorageKey(uid), JSON.stringify(next)); + } catch { + // 隐私模式 / 配额满时忽略,不影响主流程 + } +}; diff --git a/src/utils/paymentGuideLocalSwitch.ts b/src/utils/paymentGuideLocalSwitch.ts new file mode 100644 index 0000000..e31da64 --- /dev/null +++ b/src/utils/paymentGuideLocalSwitch.ts @@ -0,0 +1,24 @@ +/** + * 本地震框开关(与后端 paymentGuide.scenes.*.show 无关)。 + * - 默认 true:允许弹 + * - 关闭弹窗后 false:同一次停留内不再弹 + * - 重新进入场景对应页面后再置 true + */ + +/** scene -> 是否允许再弹;未写入时视为 true */ +const localPopupSwitchOn = new Map(); + +/** 本地震框开关是否打开(默认 true) */ +export const isPaymentGuideLocalSwitchOn = (scene: string) => localPopupSwitchOn.get(scene) !== false; + +/** 关掉本地震框开关(用户关闭弹窗后调用) */ +export const turnOffPaymentGuideLocalSwitch = (scene: string) => { + if (!scene) return; + localPopupSwitchOn.set(scene, false); +}; + +/** 重新打开本地震框开关(重新进入页面/换片时调用) */ +export const turnOnPaymentGuideLocalSwitch = (scene: string) => { + if (!scene) return; + localPopupSwitchOn.set(scene, true); +}; diff --git a/src/utils/paymentStatusPopup.ts b/src/utils/paymentStatusPopup.ts new file mode 100644 index 0000000..f1bc5b5 --- /dev/null +++ b/src/utils/paymentStatusPopup.ts @@ -0,0 +1,126 @@ +import AppApi from '@/service/app'; +import { useConfigStore } from '@/stores/config'; + +/** 无需展示付费分层弹窗的状态 */ +export const INACTIVE_PAYMENT_STATUS = ['normal', 'unregistered']; + +/** 播放页等位置需展示 playPage 的付费分层状态 */ +export const PAYMENT_PLAY_PAGE_STATUS = [ + 'new_unpay', + 'under_7_day_unpay', + 'over_7_day_unpay', + 'over_7_day_need_upgrade', +] as const; + +export type PaymentPlayPageStatus = (typeof PAYMENT_PLAY_PAGE_STATUS)[number]; + +type ParsedPaymentConfig = Record | string; + +/** 解析 paymentStatusPopupConfig 中的 JSON 字符串配置 */ +export const parsePaymentPopupConfig = (raw?: string): ParsedPaymentConfig | null => { + if (!raw || raw === '{}') return null; + try { + const parsed = JSON.parse(raw) as ParsedPaymentConfig; + if (typeof parsed === 'string' && parsed) return parsed; + if (parsed && typeof parsed === 'object' && Object.keys(parsed).length) return parsed; + return null; + } catch { + return null; + } +}; + +/** 解析优惠截止时间,兼容秒级/毫秒级时间戳与 ISO 字符串 */ +export const parseLastDiscountTime = (value?: number | string) => { + if (value === undefined || value === null || value === '') return 0; + if (typeof value === 'number') { + return value < 1e12 ? value * 1000 : value; + } + const parsed = Date.parse(value); + return Number.isNaN(parsed) ? 0 : parsed; +}; + +/** 从配置中提取浮窗/卡片图片地址 */ +export const getPaymentConfigImg = (config: ParsedPaymentConfig) => { + if (typeof config === 'string') return config; + const img = + config.img || config.bgImg || config.banner || config.background || config.icon || config.url; + return typeof img === 'string' ? img : ''; +}; + +/** 解析配置字段中的图片地址(兼容 JSON 字符串与纯 URL) */ +export const resolvePaymentConfigImg = (raw?: string) => { + if (!raw || raw === '{}') return ''; + const parsed = parsePaymentPopupConfig(raw); + if (parsed) return getPaymentConfigImg(parsed); + return raw.trim(); +}; + +/** 配置字段是否有有效值 */ +const isValidPaymentConfigValue = (value?: number | string) => { + if (value === undefined || value === null || value === '') return false; + if (typeof value === 'string') return value !== '{}' && !!value.trim(); + return true; +}; + +/** paymentStatusPopupConfig 指定字段满足其一即可 */ +export const hasAnyPaymentConfigField = ( + config?: Types.App.PaymentStatusPopupConfig, + fields: (keyof Types.App.PaymentStatusPopupConfig)[] = [ + 'homepageFlot', + 'playPage', + 'lastDiscountTime', + 'vipCard', + ], +) => { + if (!config) return false; + return fields.some((field) => isValidPaymentConfigValue(config[field])); +}; + +/** 付费分层弹窗是否处于活跃状态 */ +export const isActivePaymentStatus = (status?: string) => + !!status && !INACTIVE_PAYMENT_STATUS.includes(status); + +/** 是否属于播放页 playPage 展示范围 */ +export const isPaymentPlayPageStatus = (status?: string): status is PaymentPlayPageStatus => + !!status && (PAYMENT_PLAY_PAGE_STATUS as readonly string[]).includes(status); + +const formatTodayDate = () => new Date().toDateString(); + +export const getMovieDetailsPaymentPopupDailyKey = (uid: string | number) => `movieDetailsPaymentPopup_${uid}`; + +/** 视频详情页付费分层弹窗今日是否已触发过(含被限时优惠拦截的情况) */ +export const hasShownMovieDetailsPaymentPopupToday = (uid: string | number) => + localStorage.getItem(getMovieDetailsPaymentPopupDailyKey(uid)) === formatTodayDate(); + +/** 标记视频详情页付费分层弹窗今日已触发 */ +export const markMovieDetailsPaymentPopupShownToday = (uid: string | number) => { + localStorage.setItem(getMovieDetailsPaymentPopupDailyKey(uid), formatTodayDate()); +}; + +/** 支付完成后刷新 paymentPopup 并合并到 configStore */ +export const refreshPaymentPopupConfig = async () => { + const configStore = useConfigStore(); + + try { + const data = await AppApi.refreshPaymentPopup(); + const popup = data?.paymentPopup; + if (!popup) return; + + const prevConfig = configStore.appConfig.paymentStatusPopupConfig || {}; + configStore.saveAppConfig({ + ...configStore.appConfig, + paymentStatusPopup: popup.paymentStatusPopup ?? configStore.appConfig.paymentStatusPopup, + paymentStatusPopupConfig: { + ...prevConfig, + homepage: popup.homepage ?? prevConfig.homepage, + homepageFlot: popup.homepageFlot ?? prevConfig.homepageFlot, + playPage: popup.playPage ?? prevConfig.playPage, + meTab: popup.meTab ?? prevConfig.meTab, + vipCard: popup.vipCard ?? prevConfig.vipCard, + lastDiscountTime: popup.lastDiscountTime ?? prevConfig.lastDiscountTime, + }, + }); + } catch (error) { + console.error('refreshPaymentPopupConfig failed:', error); + } +}; diff --git a/src/utils/ping.ts b/src/utils/ping.ts new file mode 100644 index 0000000..23185cf --- /dev/null +++ b/src/utils/ping.ts @@ -0,0 +1,57 @@ +import { useConfigStore } from './../stores/config'; +import axios from 'axios'; + +/** + * 测试域名 + * @param url + * @returns + */ +async function testPing(url: string): Promise { + try { + const ret = await axios({ + method: 'GET', + url: url + '/api/app/ping/check', + timeout: 1000 * 10, // 10秒超时 + }); + + if (ret.data.code == 200) { + return true; + } + return false; + } catch (error) { + return false; + } +} + +/** + * 将数组乱序 + * @param arr + * @returns + */ +function shuffle(arr: Array): Array { + let m = arr.length; + while (m > 1) { + const index = Math.floor(Math.random() * m--); + [arr[m], arr[index]] = [arr[index], arr[m]]; + } + return arr; +} + +/** + * 选线 + * @returns + */ +export default async function pingCheck(): Promise { + const baseUrls: string = process.env.VITE_BASE_URL || '[]'; + const hosts = JSON.parse(baseUrls); + const allLine = shuffle(hosts); + for (const line of allLine) { + const isOk = await testPing(line); + if (isOk) { + //选线成功 + useConfigStore().saveBaseUrl(line); + return true; + } + } + return false; +} diff --git a/src/utils/privilegeTouch.ts b/src/utils/privilegeTouch.ts new file mode 100644 index 0000000..4fdcc53 --- /dev/null +++ b/src/utils/privilegeTouch.ts @@ -0,0 +1,88 @@ +const TOUCH_THRESHOLD = 8; + +type TouchDirection = '' | 'x' | 'y'; + +/** 核心权益横向滑动:锁定横向手势,纵向滑动交给父级弹框 */ +export const createPrivilegeTouchHandlers = () => { + const state = { + startX: 0, + startY: 0, + direction: '' as TouchDirection, + }; + + const reset = () => { + state.direction = ''; + }; + + const onTouchStart = (e: TouchEvent) => { + state.startX = e.touches[0].clientX; + state.startY = e.touches[0].clientY; + state.direction = ''; + }; + + const onTouchMove = (e: TouchEvent) => { + const dx = e.touches[0].clientX - state.startX; + const dy = e.touches[0].clientY - state.startY; + + if (!state.direction) { + if (Math.abs(dx) < TOUCH_THRESHOLD && Math.abs(dy) < TOUCH_THRESHOLD) return; + state.direction = Math.abs(dx) > Math.abs(dy) ? 'x' : 'y'; + } + + if (state.direction === 'y') return; + + const el = e.currentTarget as HTMLElement; + const atLeft = el.scrollLeft <= 0; + const atRight = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1; + if ((atLeft && dx > 0) || (atRight && dx < 0)) return; + + e.stopPropagation(); + }; + + return { + onTouchStart, + onTouchMove, + onTouchEnd: reset, + onTouchCancel: reset, + }; +}; + +/** 会员卡横向滑动:横向交给 Swiper,纵向滑动交给父级弹框 */ +export const createCardSwiperTouchHandlers = () => { + const state = { + startX: 0, + startY: 0, + direction: '' as TouchDirection, + }; + + const reset = () => { + state.direction = ''; + }; + + const onTouchStart = (e: TouchEvent) => { + state.startX = e.touches[0].clientX; + state.startY = e.touches[0].clientY; + state.direction = ''; + }; + + const onTouchMove = (e: TouchEvent) => { + const dx = e.touches[0].clientX - state.startX; + const dy = e.touches[0].clientY - state.startY; + + if (!state.direction) { + if (Math.abs(dx) < TOUCH_THRESHOLD && Math.abs(dy) < TOUCH_THRESHOLD) return; + state.direction = Math.abs(dx) > Math.abs(dy) ? 'x' : 'y'; + } + + if (state.direction === 'x') { + e.stopPropagation(); + } + }; + + return { + onTouchStart, + onTouchMove, + onTouchEnd: reset, + onTouchCancel: reset, + }; +}; diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..ecdc94d --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,326 @@ +import { useUserStore } from './../stores/user'; +import { useAppStore } from './../stores/app'; +import { HttpMethods, ResponseType } from '@/enums/http'; +import { useConfigStore } from '@/stores/config'; +import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'; +import qs from 'qs'; +import { showToast } from 'vant'; +import { getDevType } from '.'; +import { cryptoDecrypt, encrypt } from './key'; +import { resolveDeviceMetadata } from '@/plugins/device-metadata'; + +const PARAMETER_ENCRYPTION = process.env.VITE_PARAMETER_ENCRYPTION; //是否开启参数加密 0关闭 1开启 +//默认配置 +const config: AxiosRequestConfig = { + // 设置超时时间 + timeout: 30 * 1000, + responseType: ResponseType.JSON, +}; + +class RequestHttp { + // 定义成员变量并指定类型 + private service: AxiosInstance; + // 取消重复请求 + private pending = new Map(); + // 进行中请求去重(同一 URL+params) + private inFlight = new Map>(); + // GET 缓存(可按需开启) + private getCache = new Map(); + // 默认为 2 秒缓存当前 GET 请求结果 + private readonly cacheTtlMs = 2 * 1000; + public constructor(config: AxiosRequestConfig) { + // 实例化axios + this.service = axios.create(config); + + // 请求拦截器 + this.service.interceptors.request.use( + async (config: InternalAxiosRequestConfig) => { + this.addPending(config); + if ( + config.responseType == ResponseType.ARRAYBUFFER || + config.responseType == ResponseType.BLOB || + config.responseType == ResponseType.STREAM + ) + return config; + + this.setConfig(config); + await this.addHeader(config); + this.setParameterConfig(config); + + return config; + }, + (error: AxiosError) => { + return Promise.resolve(error || '服务器异常'); + }, + ); + + // 响应拦截器 + this.service.interceptors.response.use( + (response: AxiosResponse) => { + this.removePending(response.config); + if ( + response.config.responseType == ResponseType.ARRAYBUFFER || + response.config.responseType == ResponseType.BLOB || + response.config.responseType == ResponseType.STREAM || + response.config.url == '/sign_record/resign' + ) + return response.data; + const baseResponse: Types.Http.BaseResponseType = response.data; + if (baseResponse.code !== 200) { + showToast(baseResponse.tip || baseResponse.msg || '请求出错啦~'); + const error = new Error(baseResponse.code.toString()) as Error & { resData?: AxiosResponse }; + error.resData = response; + return Promise.reject(error); + } + if (baseResponse.hash) { + baseResponse.data = cryptoDecrypt(baseResponse.data); + } + return baseResponse.data; + }, + (error: AxiosError) => { + if (error?.config) { + this.removePending(error.config); + } + const { response } = error; + if ( + error?.config?.responseType == ResponseType.ARRAYBUFFER || + error?.config?.responseType == ResponseType.BLOB || + error?.config?.responseType == ResponseType.STREAM + ) + return Promise.reject(error?.message); + if (response && response.status) { + const { status, statusText } = response; + const errorText = codeMessage[status] || statusText; + showToast(errorText); + } else if (!response) { + showToast('您的网络发生异常,无法连接服务器'); + } + return Promise.reject(error); + }, + ); + } + /** + * @description 添加header 设置api域名 + * @param config + */ + private addHeader = async (config: AxiosRequestConfig): Promise => { + const token = this.getToken(); + config.headers = { + ...(config.headers || {}), + temp: 'test', + 'X-User-Agent': await this.getUserAgent(), + }; + if (token != null) { + config.headers['Authorization'] = token; + } + }; + + /** + * @description 基于本地 UA 解析设备字段 + */ + private getUserAgent = async (): Promise => { + const appStore = useAppStore(); + const SysType = getDevType(); + const DevID = appStore.uid; + const Ver = '1.0.0'; + const DevType = 'iPhone'; + const Terminal = PARAMETER_ENCRYPTION; + const IsH5 = 1; + + const { device_brand: DeviceBrand, device_model: DeviceModel, system_name: SystemName, system_version: SystemVersion } = + resolveDeviceMetadata(); + const Sid = ''; + + return `BuildID=com.abc.Butterfly;SysType=${SysType};DevID=${DevID};Ver=${Ver};DevType=${DevType};DeviceBrand=${DeviceBrand};DeviceModel=${DeviceModel};SystemName=${SystemName};SystemVersion=${SystemVersion};Terminal=${Terminal};IsH5=${IsH5};Sid=${Sid}`; + }; + + /** + * @description 获取token + */ + private getToken = (): string | null => { + const userStore = useUserStore(); + return userStore.token || null; + }; + + /** + * @description 设置api域名 + * @param config + */ + private setConfig = (config: AxiosRequestConfig): void => { + const configStore = useConfigStore(); + const baseUrl: string = process.env.VITE_APP_API_BASE_URL || '/'; + if (configStore.baseUrl != null) { + config.baseURL = configStore.baseUrl + baseUrl; + } + }; + + /** + * @description 参数加密 + * @param config + */ + private setParameterConfig = (config: AxiosRequestConfig): void => { + if (PARAMETER_ENCRYPTION === '0') return; + if (config.method == HttpMethods.POST || config.method == HttpMethods.PUT || config.method == HttpMethods.DELETE) { + const data = config.data || {}; + const keysData = Object.keys(data); + if (keysData.length === 0) return; + const filterData = keysData + .filter((key) => data[key] !== null && data[key] !== undefined) + .reduce((acc, key) => ({ ...acc, [key]: data[key] }), {}); + config.data = { + data: encrypt(filterData), + }; + } else if (config.method == HttpMethods.GET) { + const params = config.params || {}; + const keyParams = Object.keys(params); + if (keyParams.length === 0) return; + const filterData = keyParams + .filter((key) => params[key] !== null && params[key] !== undefined) + .reduce((acc, key) => ({ ...acc, [key]: String(params[key]) }), {}); + config.params = { + data: encrypt(filterData), + }; + } + }; + + /** + * @description 添加请求 + * @param {Object} config + */ + private getRequestKey(config: AxiosRequestConfig): string { + return [config.method, config.url, qs.stringify(config.params), qs.stringify(config.data)].join('&'); + } + + private addPending = (config: AxiosRequestConfig): void => { + const url = this.getRequestKey(config); + config.cancelToken = + config.cancelToken || + new axios.CancelToken((cancel) => { + if (!this.pending.has(url)) { + this.pending.set(url, cancel); + } + }); + }; + + /** + * @description 移除请求 + * @param {Object} config + */ + private removePending = (config: AxiosRequestConfig): void => { + if (config.responseType == ResponseType.ARRAYBUFFER) return; + const url = this.getRequestKey(config); + if (this.pending.has(url)) { + const cancel = this.pending.get(url); + cancel(url); + this.pending.delete(url); + } + }; + + private getCacheKey(method: string | undefined, url: string, params?: object): string { + return [method, url, qs.stringify(params)].join('&'); + } + + /** + * @description 公用GET方法 + * @param url + * @param params + * @param headers + * @returns + */ + async get(url: string, params?: object, config?: AxiosRequestConfig): Promise { + const finalConfig = { ...config }; + const key = this.getCacheKey('GET', url, params); + + const cached = this.getCache.get(key); + if (cached && cached.expires > Date.now()) { + return Promise.resolve(cached.value); + } + + if (this.inFlight.has(key)) { + return this.inFlight.get(key) as Promise; + } + + const req = this.service.get(url, { params, ...finalConfig }).then((res) => { + const data = res as unknown as T; + this.inFlight.delete(key); + this.getCache.set(key, { + value: data, + expires: Date.now() + this.cacheTtlMs, + }); + return data; + }).catch((err) => { + this.inFlight.delete(key); + return Promise.reject(err); + }); + + this.inFlight.set(key, req); + return req; + } + /** + * @description 公用POST方法 + * @param url + * @param params + * @param config + * @returns + */ + post(url: string, data?: object, config?: AxiosRequestConfig): Promise { + return this.service.post(url, data, config); + } + /** + * @description 公用PUT方法 + * @param url + * @param data + * @param config + * @returns + */ + put(url: string, data?: object, config?: AxiosRequestConfig): Promise { + return this.service.put(url, data, config); + } + /** + * @description 公用delete方法,url方式传参 + * @param url + * @param params + * @param headers + * @returns + */ + delete(url: string, params?: object, config?: AxiosRequestConfig): Promise { + return this.service.delete(url, { params, ...config }); + } + /** + * @description 公用delete方法,json方式传参 + * @param url + * @param data + * @param headers + * @returns + */ + deletes(url: string, data?: object, config?: AxiosRequestConfig): Promise { + return this.service.delete(url, { data, ...config }); + } + /** + * @description 清空 pending 中的请求(在路由跳转时调用) + */ + clearPending = (): void => { + for (const [url, cancel] of this.pending) { + cancel(url); + } + this.pending.clear(); + }; +} + +//HTTP状态码 +const codeMessage: Record = { + 400: '请求错误', + 401: '用户没有权限。', + 403: '用户得到授权,但是访问是被禁止的。', + 404: '请求地址不存在', + 405: '请求方法不允许', + 406: '请求的格式不可得。', + 410: '请求的资源被永久删除', + 422: '验证错误', + 500: '服务器发生错误', + 502: '网关错误。', + 503: '服务不可用,服务器暂时过载或维护。', + 504: '网关超时。', +}; + +export default new RequestHttp(config); diff --git a/src/utils/require.ts b/src/utils/require.ts new file mode 100644 index 0000000..eed95f5 --- /dev/null +++ b/src/utils/require.ts @@ -0,0 +1,9 @@ +/** 处理图片 */ +export const require = (imgPath: string) => { + try { + const handlePath = imgPath.replace('@', '..'); + return new URL(handlePath, import.meta.url).href; + } catch (error) { + console.warn(error); + } +}; \ No newline at end of file diff --git a/src/utils/resetTabPageScrollTop.ts b/src/utils/resetTabPageScrollTop.ts new file mode 100644 index 0000000..db917ba --- /dev/null +++ b/src/utils/resetTabPageScrollTop.ts @@ -0,0 +1,71 @@ +import { onActivated, onDeactivated } from 'vue'; + +class TabPageScroll { + scrollMap = new Map(); + domWeakMap = new WeakMap(); + scrollHanlder = (e: Event) => { + void 0; + }; + onScroll = (el: HTMLElement) => { + void 0; + }; + constructor({ onScroll } = { onScroll: () => void 0 }) { + this.scrollHanlder = this.scroll.bind(this); + this.onChange = this.onChange.bind(this); + this.onScroll = onScroll; + onActivated(() => { + for (const dom of this.scrollMap.values()) { + dom.addEventListener('scroll', this.scrollHanlder, true); + dom.scrollTo(0, this.domWeakMap.get(dom) || 0); + this.emitScroll(dom); + } + }); + + onDeactivated(() => { + for (const dom of this.scrollMap.values()) { + dom.removeEventListener('scroll', this.scrollHanlder, true); + } + }); + } + + add(selector: string) { + if (this.scrollMap.has(selector)) { + const dom = this.scrollMap.get(selector); + dom.scrollTo(0, this.domWeakMap.get(dom) || 0); + this.emitScroll(dom); + return; + } + + const dom = document.querySelector(selector); + if (!dom) return; + + this.scrollMap.set(selector, dom); + this.emitScroll(dom as HTMLElement); + dom.addEventListener('scroll', this.scrollHanlder, true); + } + del(selector: string) { + if (!this.scrollMap.has(selector)) return; + const { dom } = this.scrollMap.get(selector); + + dom.removeEventListener('scroll', this.scrollHanlder, true); + + this.scrollMap.delete(selector); + } + scroll(e: Event) { + const dom = e.currentTarget as HTMLElement; + this.domWeakMap.set(dom, dom.scrollTop); + this.emitScroll(dom); + } + emitScroll(dom: HTMLElement) { + if (this.onScroll && dom.offsetWidth > 0 && dom.offsetHeight > 0) { + this.onScroll(dom); + } + } + onChange(name: string | number) { + setTimeout(() => { + this.add(`#${name}`); + }, 100); + } +} + +export default TabPageScroll; diff --git a/src/utils/sharedFreeWatchCount.ts b/src/utils/sharedFreeWatchCount.ts new file mode 100644 index 0000000..24af453 --- /dev/null +++ b/src/utils/sharedFreeWatchCount.ts @@ -0,0 +1,64 @@ +import { ref } from 'vue'; +import VideoApi from '@/service/video'; + +/** 列表多卡片共享一次 /vid/user/count,避免 N 次请求 */ +export const sharedFreeWatchCount = ref(null); +let sharedFreeWatchCountPromise: Promise | null = null; + +/** + * 会员视频(可走免费次数): + * - 长视频/短视频:originCoins===0 且非免费区 + * - ACG:permission===0 + * 注意:已享免费特权时后端也可能带 hasPaid,不能用来排除 + */ +export const isVipMemberVideo = (info?: { + originCoins?: number; + freeArea?: boolean; + permission?: number; + mediaType?: string; +}) => { + if (!info) return false; + // 长视频可能也带 permission,优先认 originCoins + if (typeof info.originCoins === 'number') { + return info.originCoins === 0 && !info.freeArea; + } + return info.permission === 0; +}; + +type SetSharedFreeWatchCountOptions = { + watchCount: number; + isCan?: boolean; + videoInfo?: Parameters[0]; +}; + +/** + * 播放器等处同步剩余次数: + * 1. 仅会员视频写入 + * 2. isCan===true 且 watchCount===0(已享免费特权)不写入,避免把全局剩余盖成 0 + */ +export const setSharedFreeWatchCount = (options: SetSharedFreeWatchCountOptions) => { + const { watchCount, isCan, videoInfo } = options; + if (videoInfo !== undefined && !isVipMemberVideo(videoInfo)) return; + const n = Number(watchCount); + const remaining = Number.isFinite(n) ? n : 0; + if (isCan === true && remaining === 0) return; + sharedFreeWatchCount.value = remaining; +}; + +export const ensureSharedFreeWatchCount = (vid?: string) => { + if (sharedFreeWatchCount.value !== null || sharedFreeWatchCountPromise) return; + sharedFreeWatchCountPromise = VideoApi.getPlayCount(vid || '') + .then((res) => { + setSharedFreeWatchCount({ + watchCount: Number(res?.watchCount), + isCan: res?.isCan, + }); + }) + .catch(() => { + // 失败不阻断角标:仍按 showFreeTrialBadge / freeTrialRemaining 展示 + sharedFreeWatchCount.value = -1; + }) + .finally(() => { + sharedFreeWatchCountPromise = null; + }); +}; diff --git a/src/utils/shortVideoAudioUnlock.ts b/src/utils/shortVideoAudioUnlock.ts new file mode 100644 index 0000000..bddcb95 --- /dev/null +++ b/src/utils/shortVideoAudioUnlock.ts @@ -0,0 +1,30 @@ +/** 抖音等竖滑 Feed:用户手势解除静音后,本会话后续条可带声自动播 */ + +type UnlockListener = () => void; + +let audioUnlocked = false; +const listeners = new Set(); + +export function isShortVideoAudioUnlocked(): boolean { + return audioUnlocked; +} + +export function unlockShortVideoAudio(): void { + if (audioUnlocked) return; + audioUnlocked = true; + listeners.forEach((fn) => { + try { + fn(); + } catch { + /* ignore */ + } + }); +} + +/** 订阅解锁事件;返回取消订阅函数 */ +export function onShortVideoAudioUnlock(listener: UnlockListener): () => void { + listeners.add(listener); + return () => { + listeners.delete(listener); + }; +} diff --git a/src/utils/shortVideoFeedAds.ts b/src/utils/shortVideoFeedAds.ts new file mode 100644 index 0000000..1f70c17 --- /dev/null +++ b/src/utils/shortVideoFeedAds.ts @@ -0,0 +1,55 @@ +/** 竖滑预渲染窗口:含当前 ±3,避免全屏广告刚滑出 ±2 就被卸载导致闪没 */ +export const SHORT_VIDEO_NEARBY_SLIDES = 3; + +/** + * 相邻条 HLS 错峰预热延迟(ms)。 + * 当前条 / 紧邻 ±1:立即起播或预缓冲;更远的档位错开,避免首进同时 new 多个 HlsJSPlayer 卡主线程。 + */ +export function getShortVideoPlayerWarmDelay(distance: number): number { + if (distance <= 0) return 0; + if (distance === 1) return 60; + return 60 + (distance - 1) * 180; +} + +/** 统计竖滑列表里「非全屏广告」条数,用于 6+1 跨页对齐 */ +export function countNonAdvShortFeedItems(items: any[] | null | undefined): number { + if (!items?.length) return 0; + return items.filter((x) => x && x.newsType !== 'SHORT_ADV').length; +} + +/** + * 6+1 全屏广告:对本页接口返回的「纯视频」数组,在整条 feed 中每累计 6 条视频后插 1 条全屏广告。 + * `leadingVideoCount` = 拼接前列表里已有纯视频条数(不含 SHORT_ADV),避免分页各自从 0 计数导致节奏乱、看起来「不到 6 条又出广告」。 + * advPool:队头取出再 push 回队尾(轮转)。 + */ +export function mergeShortVideoPageWithFullScreenAds( + pageVideos: any[], + advPool: any[], + leadingVideoCount = 0, +): any[] { + if (!pageVideos?.length) return []; + const out: any[] = []; + for (let i = 0; i < pageVideos.length; i++) { + const globalVideoIdx = leadingVideoCount + i; + if (globalVideoIdx > 0 && globalVideoIdx % 6 === 0) { + const adv = pickRotatingAdv(advPool); + if (adv) { + const baseId = adv.id ?? adv.cover ?? 'adv'; + out.push({ + ...adv, + newsType: 'SHORT_ADV', + feedSlotKey: `SHORT_ADV_${baseId}_g${globalVideoIdx}_${out.length}`, + }); + } + } + out.push(pageVideos[i]); + } + return out; +} + +function pickRotatingAdv(pool: any[]): any | null { + if (!pool.length) return null; + const one = pool.shift(); + if (one) pool.push(one); + return one; +} diff --git a/src/utils/shortVideoSwiper.ts b/src/utils/shortVideoSwiper.ts new file mode 100644 index 0000000..f5fa96c --- /dev/null +++ b/src/utils/shortVideoSwiper.ts @@ -0,0 +1,66 @@ +import { nextTick } from 'vue'; +import { Mousewheel } from 'swiper'; +import type { Swiper as SwiperInstance, SwiperOptions } from 'swiper'; + +export type ShortVideoSwiperHandlers = { + onSlideChange?: (swiper: SwiperInstance) => void; + onSlideChangeTransitionEnd: (swiper: SwiperInstance) => void; +}; + +/** 短视频竖滑 Swiper 公共配置(推荐 / 最新 / 详情页复用) */ +export function createShortVideoSwiperOptions(handlers: ShortVideoSwiperHandlers): SwiperOptions { + const { onSlideChange, onSlideChangeTransitionEnd } = handlers; + return { + modules: [Mousewheel], + direction: 'vertical', + slidesPerView: 1, + spaceBetween: 0, + observer: true, + observeParents: true, + touchEventsTarget: 'container', + threshold: 8, + touchRatio: 1, + shortSwipes: true, + followFinger: true, + simulateTouch: true, + mousewheel: { + forceToAxis: true, + sensitivity: 1.2, + thresholdDelta: 10, + releaseOnEdges: true, + }, + noSwiping: true, + noSwipingSelector: + '.xgplayer-controls, .xgplayer-progress, .xgplayer-progress-btn, .footer, .rightSide, .popup-ads, .bottom-dock, .drama-play-bottom-bar, .drama-episode-sheet, .van-popup, .drama-bottom-info .bar, .unmute-btn, .no-swipe, .side-actions, .drama-side-actions, .eye-btn, .action-item, .speed-btn', + touchStartPreventDefault: false, + passiveListeners: true, + on: { + slideChange(swiper) { + onSlideChange?.(swiper); + }, + slideChangeTransitionEnd: onSlideChangeTransitionEnd, + }, + }; +} + +/** + * 列表过长时裁掉头部 chunk,保持当前视频不变。 + * 须先 splice 再 slideTo,否则 activeIndex 与列表错位会出现 slide-ph 黑屏。 + */ +export async function recycleShortVideoSwiperHead( + swiper: SwiperInstance, + activeIndex: number, + listLength: number, + chunkSize: number, + removeFromHead: (trimCount: number) => void, +): Promise { + if (activeIndex < 2 * chunkSize || listLength < 3 * chunkSize) { + return null; + } + const newIndex = activeIndex - chunkSize; + removeFromHead(chunkSize); + await nextTick(); + swiper.update(); + swiper.slideTo(newIndex, 0, false); + return newIndex; +} diff --git a/src/utils/swipeHook.ts b/src/utils/swipeHook.ts new file mode 100644 index 0000000..b22a5ba --- /dev/null +++ b/src/utils/swipeHook.ts @@ -0,0 +1,34 @@ +import { ref, onMounted, onUnmounted, onDeactivated } from 'vue'; + +export default function (callback: any) { + const startX = ref(0); + const startY = ref(0); + const threshold = 50; + const handleTouchStart = (event: any) => { + startX.value = event.touches[0].clientX; + startY.value = event.touches[0].clientY; + }; + const handleTouchEnd = (event: any) => { + const deltaX = event.changedTouches[0].clientX - startX.value; + const deltaY = event.changedTouches[0].clientY - startY.value; + if (Math.abs(deltaX) > Math.abs(deltaY)) { + if (deltaX > threshold) { + callback && callback('right'); + } else if (deltaX < -threshold) { + callback && callback('left'); + } + } + }; + onMounted(() => { + window.addEventListener('touchstart', handleTouchStart); + window.addEventListener('touchend', handleTouchEnd); + }); + onUnmounted(() => { + window.removeEventListener('touchstart', handleTouchStart); + window.removeEventListener('touchend', handleTouchEnd); + }); + onDeactivated(() => { + window.removeEventListener('touchstart', handleTouchStart); + window.removeEventListener('touchend', handleTouchEnd); + }); +} diff --git a/src/utils/tabAction.ts b/src/utils/tabAction.ts new file mode 100644 index 0000000..6e16741 --- /dev/null +++ b/src/utils/tabAction.ts @@ -0,0 +1,48 @@ +import { ref, watch, Ref } from 'vue'; +import TabPageScroll from '@/utils/resetTabPageScrollTop'; +interface item { + key: string | number; + [propName: string]: any; +} +export default (isInitScroll = false, prefixKey = '', onScroll?: any) => { + let tabPageScroll: any; + + const tabActive = ref('') as Ref; + const tabInitItems = ref([]); + + const tabIsInit = (key: string | number) => { + return tabInitItems.value.includes(key); + }; + + const onTabRendered = (key: string | number) => { + if (tabIsInit(key)) return; + tabInitItems.value.push(key); + }; + + if (isInitScroll) { + tabPageScroll = new TabPageScroll({ onScroll }); + + if (tabActive.value) { + tabPageScroll.onChange(tabActive.value); + } + watch( + () => tabActive.value, + (key: string | number) => { + tabPageScroll.onChange(prefixKey + key); + }, + ); + } + + const getTabActiveKey = (key: string, prefixKey: string) => { + return key.substring(prefixKey.length); + }; + + return { + tabActive, + tabInitItems, + tabIsInit, + onTabRendered, + tabPageScroll, + getTabActiveKey, + }; +}; diff --git a/src/utils/uuid.ts b/src/utils/uuid.ts new file mode 100644 index 0000000..8670066 --- /dev/null +++ b/src/utils/uuid.ts @@ -0,0 +1,11 @@ +/** 生成 UUID(优先 crypto.randomUUID) */ +export function createUuid(): string { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { + return crypto.randomUUID(); + } + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0; + const v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} diff --git a/src/utils/vipCardSelection.ts b/src/utils/vipCardSelection.ts new file mode 100644 index 0000000..b5bf7e9 --- /dev/null +++ b/src/utils/vipCardSelection.ts @@ -0,0 +1,84 @@ +import { isActivePaymentStatus } from '@/utils/paymentStatusPopup'; + +export type VipPresaleContext = { + isPayPresal?: boolean; +}; + +export const getVipCardPayAmount = ( + item: Types.Recharge.VipItem, + presale: VipPresaleContext = {}, +): number => { + if (item.productType == 21) { + return presale.isPayPresal ? item.balanceAmount : item.advanceAmount; + } + return item.discountedPrice; +}; + +export type PickDefaultVipCardOptions = { + cards: Types.Recharge.VipItem[]; + paymentStatus?: string; + configuredVipCardId?: string; + /** 显式指定卡 ID(如路由 query.id、父组件传入) */ + explicitVipCardId?: string; + /** VIP 套餐 A/B 默认卡 ID */ + defaultProductId?: string; + userInfo?: Types.User.UserInfoType & { isUpgrade?: boolean; vipLevel?: number }; + presale?: VipPresaleContext; +}; + +/** 默认选卡优先级:显式指定 > 用户分层卡 > A/B 默认卡 > 差价卡 > 第一张卡 */ +export const pickDefaultVipCard = ({ + cards, + paymentStatus, + configuredVipCardId, + explicitVipCardId, + defaultProductId, + userInfo, + presale = {}, +}: PickDefaultVipCardOptions): Types.Recharge.VipItem | null => { + if (!cards.length) return null; + + if (explicitVipCardId) { + const explicit = cards.find((card) => card.productID === explicitVipCardId); + if (explicit) return explicit; + } + + // 用户分层卡(paymentStatusPopupConfig.vipCard)优先于实验 defaultProductId + if (configuredVipCardId && isActivePaymentStatus(paymentStatus)) { + const layered = cards.find((card) => card.productID === configuredVipCardId); + if (layered) return layered; + } + + if (defaultProductId) { + const abDefault = cards.find((card) => card.productID === defaultProductId); + if (abDefault) return abDefault; + } + + const { isUpgrade, vipLevel } = userInfo || {}; + if (isUpgrade && vipLevel != 5) { + const upgradeCards = cards.filter((item) => item.isUpgrade); + if (upgradeCards.length) { + return upgradeCards.reduce((best, current) => { + const bestAmount = getVipCardPayAmount(best, presale); + const currentAmount = getVipCardPayAmount(current, presale); + + if (currentAmount < bestAmount) return current; + if (currentAmount > bestAmount) return best; + + // 差价相同时优先选中预售卡 + if (current.productType == 21 && best.productType != 21) return current; + if (best.productType == 21 && current.productType != 21) return best; + + return best; + }); + } + } + + return cards[0]; +}; + +export const pickDefaultVipCardIndex = (options: PickDefaultVipCardOptions): number => { + const card = pickDefaultVipCard(options); + if (!card) return -1; + return options.cards.findIndex((c) => c.productID === card.productID); +}; diff --git a/src/utils/vipContentUpdateGuideLocal.ts b/src/utils/vipContentUpdateGuideLocal.ts new file mode 100644 index 0000000..e6edef8 --- /dev/null +++ b/src/utils/vipContentUpdateGuideLocal.ts @@ -0,0 +1,73 @@ +import type { PaymentGuideScene } from '@/enums/home'; + +const STORAGE_KEY = 'payment_guide_vip_content_update_local'; + +interface VipContentUpdateGuideLocalState { + /** 已展示过的内容版本(与后端 contentVersion 对齐) */ + shownContentVersion?: string; + /** 兼容旧数据 / 无 contentVersion 时的兜底 */ + shownVideoIdsKey?: string; + shownConfigId?: string; + shownAt?: number; +} + +const readState = (): VipContentUpdateGuideLocalState => { + try { + const raw = localStorage.getItem(STORAGE_KEY); + if (!raw) return {}; + return JSON.parse(raw) as VipContentUpdateGuideLocalState; + } catch { + return {}; + } +}; + +const writeState = (data: VipContentUpdateGuideLocalState) => { + localStorage.setItem(STORAGE_KEY, JSON.stringify(data)); +}; + +const resolveVideoIds = (guide: Types.Payment.PaymentGuide) => { + if (guide.videos?.length) { + return guide.videos + .slice(0, 4) + .map((item) => item.id) + .filter(Boolean); + } + return (guide.videoIds || []).slice(0, 4).filter(Boolean); +}; + +/** 与弹窗展示一致:按接口原序取前 4 条,不做排序 */ +export const buildVipContentUpdateVideoIdsKey = (guide: Types.Payment.PaymentGuide) => + resolveVideoIds(guide).join('|'); + +/** + * 后端 show=true 时仍可能与本地不同步(回执延迟等)。 + * 优先按 contentVersion 去重;无版本时回退 videoIds / configId。 + */ +export const shouldShowVipContentUpdateGuide = (guide: Types.Payment.PaymentGuide) => { + if (!guide?.show) return false; + if (!resolveVideoIds(guide).length) return false; + + const state = readState(); + if (guide.contentVersion) { + return state.shownContentVersion !== guide.contentVersion; + } + + const videoIdsKey = buildVipContentUpdateVideoIdsKey(guide); + if (state.shownVideoIdsKey && state.shownVideoIdsKey === videoIdsKey) return false; + if (guide.configId && state.shownConfigId && state.shownConfigId === guide.configId) return false; + return true; +}; + +export const markVipContentUpdateGuideShown = (guide: Types.Payment.PaymentGuide) => { + const videoIdsKey = buildVipContentUpdateVideoIdsKey(guide); + if (!videoIdsKey && !guide.contentVersion) return; + const state = readState(); + if (guide.contentVersion) state.shownContentVersion = guide.contentVersion; + if (videoIdsKey) state.shownVideoIdsKey = videoIdsKey; + if (guide.configId) state.shownConfigId = guide.configId; + state.shownAt = Date.now(); + writeState(state); +}; + +export const isVipContentUpdateScene = (scene: PaymentGuideScene | string) => + scene === 'VIP_CONTENT_UPDATE'; diff --git a/src/utils/vipProductCache.ts b/src/utils/vipProductCache.ts new file mode 100644 index 0000000..742d40b --- /dev/null +++ b/src/utils/vipProductCache.ts @@ -0,0 +1,59 @@ +import MineApi from '@/service/mine'; + +const VIP_PRODUCT_CACHE_MS = 5_000; + +let cachedVipProduct: Types.Recharge.VipProductResponse | null = null; +let cachedVipProductAt = 0; +let inflightFetch: Promise | null = null; + +export const emptyVipProduct = (): Types.Recharge.VipProductResponse => ({ + list: [], + integralList: [], + daichong: {} as Types.Recharge.Daichong, +}); + +/** VIP AB 实验是否开启(仅 ACTIVE 时打统计、下单带实验字段) */ +export const isVipExperimentActive = (res?: Types.Recharge.VipProductResponse | null): boolean => + String(res?.experimentStatus || '').toUpperCase() === 'ACTIVE'; + +export type FetchVipProductOptions = { + /** 跳过短时缓存强制刷新 */ + force?: boolean; + /** 带参请求不走共享缓存,避免污染默认列表 */ + params?: Record; +}; + +/** 是否存在未过期的 /vip/product 短时缓存 */ +export const hasWarmVipProductCache = (): boolean => + Boolean(cachedVipProduct && Date.now() - cachedVipProductAt < VIP_PRODUCT_CACHE_MS); + +/** + * 短时复用 + inflight,避免会员页与支付弹窗等入口短时间重复打 /vip/product + */ +export const fetchVipProductCached = ( + options: FetchVipProductOptions = {}, +): Promise => { + const { force = false, params } = options; + + if (params && Object.keys(params).length > 0) { + return MineApi.queryVipProduct(params); + } + + const now = Date.now(); + if (!force && cachedVipProduct && now - cachedVipProductAt < VIP_PRODUCT_CACHE_MS) { + return Promise.resolve(cachedVipProduct); + } + if (inflightFetch) return inflightFetch; + + inflightFetch = MineApi.queryVipProduct() + .then((res) => { + cachedVipProduct = res; + cachedVipProductAt = Date.now(); + return res; + }) + .finally(() => { + inflightFetch = null; + }); + + return inflightFetch; +}; diff --git a/src/utils/vipProductList.ts b/src/utils/vipProductList.ts new file mode 100644 index 0000000..4f60233 --- /dev/null +++ b/src/utils/vipProductList.ts @@ -0,0 +1,53 @@ +type VipProductListOptions = { + includePresale?: boolean; + showPresal?: boolean; + activityDetailStatus?: number; + presaleActivityActive?: boolean; + /** 为 true 时保留接口原序;默认按 sort 排序(含 experimentStatus=ACTIVE) */ + preserveApiOrder?: boolean; +}; + +/** 与会员中心一致的会员卡列表解析 */ +export const parseVipProductResponse = ( + res: { + list?: Array<{ position: string; list: Types.Recharge.VipItem[] }>; + daichong?: Types.Recharge.Daichong; + }, + options: VipProductListOptions = {}, +) => { + const cards: Types.Recharge.VipItem[] = []; + + res?.list?.forEach((group) => { + if (group.position === '会员卡') { + cards.push(...group.list); + return; + } + + if ( + group.position === '预售卡' && + options.includePresale && + options.presaleActivityActive && + options.showPresal !== false && + options.activityDetailStatus != 4 + ) { + cards.push(...group.list); + } + }); + + if (!options.preserveApiOrder) { + cards.sort((a, b) => a.sort - b.sort); + } + + return { + cards, + dcInfo: res?.daichong || ({} as Types.Recharge.Daichong), + }; +}; + +/** 将 query cid 对应的卡旋转到列表首位,未命中则保持原序 */ +export const pinVipCardByQueryId = (cards: Types.Recharge.VipItem[], productId?: unknown) => { + if (productId == null || productId === '') return cards; + const highlightIndex = cards.findIndex((item) => item.productID == productId); + if (highlightIndex <= 0) return cards; + return [...cards.slice(highlightIndex), ...cards.slice(0, highlightIndex)]; +}; diff --git a/src/utils/xgHlsFeedOpts.ts b/src/utils/xgHlsFeedOpts.ts new file mode 100644 index 0000000..3c1a3c2 --- /dev/null +++ b/src/utils/xgHlsFeedOpts.ts @@ -0,0 +1,210 @@ +/** + * xgplayer-hls.js → hlsOpts(透传 hls.js) + * + * 策略: + * - startLevel: 0 —— 起播先锁最低码率档,首段体积小、更快出画;之后由内置 ABR 按带宽自动升档。 + * - 缓冲略收紧 —— 降低「为凑长缓冲而长时间黑屏/转圈」的体感(仍以可播为优先)。 + * - 续播时由调用方按需叠加 startPosition,直接从进度点拉分片(见 VerticalVideo)。 + * + * 代价:起播后极短时间内画面可能偏糊,再随升档变清晰;极弱网下若最低档仍很慢,需 CDN/切片侧配合。 + * capLevelToPlayerSize:不超播放器像素,省流并利于稳定升档(与 mrhs-h5-client 对齐)。 + */ +export const XG_HLS_FEED_OPTS = { + startLevel: 0, + capLevelToPlayerSize: true, + abrBandWidthUpFactor: 0.78, + abrBandWidthFactor: 0.9, + startFragPrefetch: true, + maxBufferHole: 0.45, + maxBufferLength: 12, + maxMaxBufferLength: 48, + backBufferLength: 22, + maxLoadingDelay: 2.5, + maxStarvationDelay: 3.2, +}; + +/** xgplayer 原生 poster(与列表封面字段一致) */ +export function posterUrlFromVideoInfo(info: { coverThumb?: string; cover?: string }): string { + const u = info.coverThumb || info.cover; + return typeof u === 'string' ? u : ''; +} + +/** 与 xgplayer 内置 format 一致 */ +export function formatXgplayerTime(time: number): string { + if (Number.isNaN(time)) return ''; + const pad = (n: number) => String(n).padStart(2, '0'); + const hour = Math.floor(time / 3600); + const minute = Math.floor((time - hour * 3600) / 60); + const second = Math.floor(time - hour * 3600 - minute * 60); + if (hour === 0) { + return `${pad(minute)}:${pad(second)}`; + } + return `${pad(hour)}:${pad(minute)}:${pad(second)}`; +} + +/** 试看拖动/seek 期间隐藏 video 帧,避免 iOS 上 HLS 先闪出越界画面 */ +export function setTrialVideoFrameHidden( + player: { root?: Element; video?: HTMLVideoElement } | null, + hidden: boolean, +) { + const videos: HTMLVideoElement[] = []; + if (player?.video) videos.push(player.video); + player?.root?.querySelectorAll('video').forEach((el) => { + if (!videos.includes(el)) videos.push(el); + }); + videos.forEach((video) => { + if (hidden) { + video.style.setProperty('visibility', 'hidden', 'important'); + video.style.setProperty('opacity', '0', 'important'); + } else { + video.style.removeProperty('visibility'); + video.style.removeProperty('opacity'); + } + }); +} + +/** 根据进度条触点位置计算 seek 目标时间(秒) */ +export function getSeekTimeFromXgProgressEvent( + player: { root?: Element; video?: HTMLVideoElement } | null, + e: MouseEvent | TouchEvent, +): number | null { + const progressEl = player?.root?.querySelector?.('.xgplayer-progress'); + const track = progressEl?.querySelector?.('.xgplayer-progress-outer') || progressEl; + if (!track || !player?.video?.duration) return null; + const rect = track.getBoundingClientRect(); + if (!rect.width) return null; + let clientX = 0; + if ('changedTouches' in e && e.changedTouches.length) { + clientX = e.changedTouches[0].clientX; + } else if ('touches' in e && e.touches.length) { + clientX = e.touches[0].clientX; + } else if ('clientX' in e) { + clientX = e.clientX; + } + const ratio = Math.min(1, Math.max(0, (clientX - rect.left) / rect.width)); + return ratio * player.video.duration; +} + +/** 试看回弹后同步进度条与 xgplayer-time-current(拖动时插件会单独改 DOM) */ +export function syncXgplayerSeekUi(player: { root?: Element; video?: HTMLVideoElement; isProgressMoving?: boolean } | null, currentTime: number) { + if (!player?.root || !player.video?.duration) return; + const duration = Number(player.video.duration) || 0; + if (!duration) return; + + const ratio = Math.min(1, Math.max(0, currentTime / duration)); + const timeRoot = player.root.querySelector('.xgplayer-time'); + if (timeRoot) { + timeRoot.innerHTML = `${formatXgplayerTime(currentTime)}${formatXgplayerTime(duration)}`; + } + const played = player.root.querySelector('.xgplayer-progress-played') as HTMLElement | null; + if (played) { + played.style.width = `${ratio * 100}%`; + } + player.isProgressMoving = false; +} + +export interface XgTrialProgressGuardOptions { + getPlayer: () => { + root?: Element; + video?: HTMLVideoElement; + isProgressMoving?: boolean; + } | null; + needsTrialSeekLimit: () => boolean; + getBackendTrialLimitSeconds: () => number | null; + getTrialMinTime?: () => number; + isSeekTimeBeyondTrialLimit: (time: number) => boolean; + handleTrialSeekOverflow: (beyondMax: boolean) => void; + setPlayerCurrentTime: (time: number) => void; + setTrialFrameBlocked: (blocked: boolean) => void; + clearTrialSeekBlock: () => void; + trialSeekEpsilon?: number; + /** 为 true 时在按下进度条瞬间即遮罩(预览片等) */ + maskOnDragStart?: () => boolean; +} + +/** 试看受限时拦截进度条拖动,避免 iOS 先解码越界帧(xgplayer 在 window 上监听 touchmove);返回解绑函数 */ +export function bindXgTrialProgressGuard(options: XgTrialProgressGuardOptions): () => void { + const player = options.getPlayer(); + const progressEl = player?.root?.querySelector?.('.xgplayer-progress') as HTMLElement | null; + if (!progressEl || progressEl.dataset.trialGuardBound) return () => {}; + progressEl.dataset.trialGuardBound = '1'; + + const epsilon = options.trialSeekEpsilon ?? 0.05; + let progressDragging = false; + let lastSnapAt = 0; + + const detachWindowDragListeners = () => { + window.removeEventListener('touchmove', onWindowProgressMove, true); + window.removeEventListener('mousemove', onWindowProgressMove, true); + }; + + const onWindowProgressMove = (e: MouseEvent | TouchEvent) => { + if (!progressDragging || !options.needsTrialSeekLimit()) return; + const targetTime = getSeekTimeFromXgProgressEvent(options.getPlayer(), e); + if (targetTime == null) return; + if (options.isSeekTimeBeyondTrialLimit(targetTime)) { + options.setTrialFrameBlocked(true); + const now = Date.now(); + if (now - lastSnapAt < 200) return; + lastSnapAt = now; + const limit = options.getBackendTrialLimitSeconds(); + if (limit != null) { + const min = options.getTrialMinTime?.() ?? 0; + const snapTime = Math.max(min, limit - epsilon); + options.setPlayerCurrentTime(snapTime); + } + } else { + options.setTrialFrameBlocked(false); + } + }; + + const onProgressInteractStart = () => { + if (!options.needsTrialSeekLimit()) return; + progressDragging = true; + if (options.maskOnDragStart?.()) { + options.setTrialFrameBlocked(true); + } + window.addEventListener('touchmove', onWindowProgressMove, { capture: true, passive: true }); + window.addEventListener('mousemove', onWindowProgressMove, true); + }; + + const onProgressInteractEnd = (e: MouseEvent | TouchEvent) => { + progressDragging = false; + detachWindowDragListeners(); + if (!options.needsTrialSeekLimit()) { + options.setTrialFrameBlocked(false); + return; + } + const targetTime = getSeekTimeFromXgProgressEvent(options.getPlayer(), e); + if (targetTime != null && options.isSeekTimeBeyondTrialLimit(targetTime)) { + e.stopImmediatePropagation(); + e.preventDefault(); + options.handleTrialSeekOverflow(true); + return; + } + options.clearTrialSeekBlock(); + }; + + const onProgressInteractCancel = () => { + progressDragging = false; + detachWindowDragListeners(); + options.clearTrialSeekBlock(); + }; + + progressEl.addEventListener('touchstart', onProgressInteractStart, { passive: true, capture: true }); + progressEl.addEventListener('mousedown', onProgressInteractStart, true); + progressEl.addEventListener('mouseup', onProgressInteractEnd, true); + progressEl.addEventListener('touchend', onProgressInteractEnd, true); + progressEl.addEventListener('touchcancel', onProgressInteractCancel, true); + + return () => { + progressDragging = false; + detachWindowDragListeners(); + progressEl.removeEventListener('touchstart', onProgressInteractStart, true); + progressEl.removeEventListener('mousedown', onProgressInteractStart, true); + progressEl.removeEventListener('mouseup', onProgressInteractEnd, true); + progressEl.removeEventListener('touchend', onProgressInteractEnd, true); + progressEl.removeEventListener('touchcancel', onProgressInteractCancel, true); + delete progressEl.dataset.trialGuardBound; + }; +} diff --git a/src/views/MainView.vue b/src/views/MainView.vue new file mode 100644 index 0000000..6b91b5e --- /dev/null +++ b/src/views/MainView.vue @@ -0,0 +1,67 @@ + + + + diff --git a/src/views/Splash.vue b/src/views/Splash.vue new file mode 100644 index 0000000..e1de00d --- /dev/null +++ b/src/views/Splash.vue @@ -0,0 +1,481 @@ + + + + diff --git a/src/views/acgModule/assets/style.scss b/src/views/acgModule/assets/style.scss new file mode 100644 index 0000000..85de9f6 --- /dev/null +++ b/src/views/acgModule/assets/style.scss @@ -0,0 +1,244 @@ +.wrap { + width: 100vw; + padding: 12px 16px; + // background: #262626; + // border-top: 1px solid rgba(0, 0, 0, 0.08); +} + +@mixin categoryWrap() { + // margin-top: 18px; + // padding-bottom: 18px; + + // border-bottom: $borderBottom; +} + +@mixin categoryList() { + display: flex; + flex-wrap: nowrap; + overflow-x: auto; + align-items: center; +} +@mixin categoryTitle() { + height: 32px; + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; + + color: #fff; + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: normal; + + .more { + color: rgba(255, 255, 255, 0.4); + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: 18px; /* 150% */ + } + .icon { + flex-shrink: 0; + width: 18px; + height: 18px; + // color: #fff; + margin-left: 6px; + } +} + +@mixin vanTab() { + --van-tabs-line-height: 24px; + --van-tabs-nav-background: transparent; + --van-tabs-bottom-bar-width: 16px; + --van-tabs-bottom-bar-height: 2px; + + --van-tab-font-size: 14px; + + --van-tab-text-color: rgba(255, 255, 255, 0.6); + --van-tab-active-text-color: #fff; + --van-tabs-bottom-bar-color: #6954e7; + + .tabs { + :deep(.van-tabs__wrap) { + padding: 10px 0; + box-sizing: content-box; + .van-tab__text--ellipsis { + white-space: nowrap; + } + .van-tabs__nav { + .van-tab { + width: auto; + padding: 0 16px; + margin: 0; + flex-grow: 0; + flex-shrink: 0; + flex-basis: 36px; + box-sizing: content-box; + } + .van-tabs__line { + bottom: 12px; + // width: 20px; + // height: 2px; + // @if $theme == 'red' { + // background: url('@/assets/images/png/tab-line-red.svg') no-repeat; + // } @else { + // background: url('@/assets/images/png/tab-line-black.svg') no-repeat; + // } + // background-size: contain; + } + } + } + .list { + margin: 0; + border-bottom: 0; + height: calc(100vh - 44px - 10px - 24px); + height: calc(100vh - 44px - 10px - 24px - constant(safe-area-inset-bottom)); + height: calc(100vh - 44px - 10px - 24px - env(safe-area-inset-bottom)); + overflow-y: auto; + } + :deep(.van-tabs__content) { + .van-tab__panel { + padding: 0 16px; + } + } + } +} + +@mixin vanTab-btn() { + --van-tab-text-color: #acbabf; + --van-tab-active-text-color: $fff; + --van-tabs-line-height: 24px; + --van-tabs-nav-background: transparent; + --van-tabs-bottom-bar-width: 14px; + --van-tabs-bottom-bar-height: 2px; + --van-tabs-bottom-bar-color: $themeBgLgColor; + + --van-tab-font-size: 14px; + + .tabs { + :deep(.van-tabs__wrap) { + padding: 16px 0 12px; + height: auto; + box-sizing: content-box; + display: flex; + justify-content: center; + .van-tabs__nav { + border-radius: 24px; + background: #20252f; + padding: 4px; + + .van-tab { + padding: 5px 32px; + margin: 0; + flex-shrink: 0; + box-sizing: content-box; + border-radius: 15px; + + &.van-tab--active { + background: $themeBgLgColor; + color: #fff; + } + } + .van-tabs__line { + display: none; + } + } + } + + // .list { + // margin: 0; + // border-bottom: 0; + // height: calc(100vh - 44px - 10px - 24px); + // height: calc(100vh - 44px - 10px - 24px - constant(safe-area-inset-bottom)); + // height: calc(100vh - 44px - 10px - 24px - env(safe-area-inset-bottom)); + // overflow-y: auto; + // } + :deep(.van-tabs__content) { + .van-tab__panel { + padding: 0 16px; + } + } + } +} + +@mixin vanTab-list() { + :deep(.van-tabs) { + --van-tabs-nav-background: transform; + --van-tab-active-text-color: #6954e7; + --van-tab-text-color: rgba(255, 255, 255, 0.6); + --van-tabs-bottom-bar-height: 0; + .van-tabs__nav--line { + padding: 0 16px; + } + .van-tab { + flex: 0; + flex-basis: 40px; + justify-content: flex-start; + margin-right: 12px; + } + .van-tabs__line { + display: none; + } + .van-tab__panel { + padding: 12px 16px; + } + } +} + +@mixin collected-btn() { + display: inline-flex; + padding: 4px 12px; + justify-content: center; + align-items: center; + border-radius: 90px; + background: $themeBgColor; + // box-shadow: 0px 2px 10px 0px rgba(255, 66, 68, 0.8); + color: #fff; + font-size: 12px; + font-style: normal; + font-weight: 400; + // line-height: 16px; /* 133.333% */ + + &.collected { + background: #222433; + // box-shadow: none; + color: rgba(255, 255, 255, 0.6); + } + svg { + // width: 14px; + // height: 14px; + font-size: 12px; + } +} + +@mixin tag() { + .permission { + position: absolute; + z-index: 2; + top: 0; + right: 0; + display: inline-flex; + padding: 2px 6px; + justify-content: flex-end; + align-items: center; + border-radius: 8px 0px 8px 8px; + + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: 22px; /* 150% */ + + &.permission1 { + background: linear-gradient(135deg, #b378ff 0%, #482cf5 100%); + } + &.permission2 { + color: #212121; + background: linear-gradient(135deg, #adfcac 0%, #5cef97 100%); + } + svg { + width: 14px; + height: 14px; + } + } +} diff --git a/src/views/acgModule/components/ImgObserver.vue b/src/views/acgModule/components/ImgObserver.vue new file mode 100644 index 0000000..c8306ef --- /dev/null +++ b/src/views/acgModule/components/ImgObserver.vue @@ -0,0 +1,176 @@ + + + + diff --git a/src/views/acgModule/components/categoryContent.vue b/src/views/acgModule/components/categoryContent.vue new file mode 100644 index 0000000..405a388 --- /dev/null +++ b/src/views/acgModule/components/categoryContent.vue @@ -0,0 +1,210 @@ + + + diff --git a/src/views/acgModule/components/categoryContentItem.vue b/src/views/acgModule/components/categoryContentItem.vue new file mode 100644 index 0000000..c03c804 --- /dev/null +++ b/src/views/acgModule/components/categoryContentItem.vue @@ -0,0 +1,146 @@ + + + diff --git a/src/views/acgModule/components/categoryTag.vue b/src/views/acgModule/components/categoryTag.vue new file mode 100644 index 0000000..aa5977c --- /dev/null +++ b/src/views/acgModule/components/categoryTag.vue @@ -0,0 +1,199 @@ + + + diff --git a/src/views/acgModule/components/discountContentItem.vue b/src/views/acgModule/components/discountContentItem.vue new file mode 100644 index 0000000..17bbb33 --- /dev/null +++ b/src/views/acgModule/components/discountContentItem.vue @@ -0,0 +1,124 @@ + + + diff --git a/src/views/acgModule/components/episode.vue b/src/views/acgModule/components/episode.vue new file mode 100644 index 0000000..7767b47 --- /dev/null +++ b/src/views/acgModule/components/episode.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/views/acgModule/components/episodeCover.vue b/src/views/acgModule/components/episodeCover.vue new file mode 100644 index 0000000..d1d14e1 --- /dev/null +++ b/src/views/acgModule/components/episodeCover.vue @@ -0,0 +1,139 @@ + + + diff --git a/src/views/acgModule/components/episodeNav.vue b/src/views/acgModule/components/episodeNav.vue new file mode 100644 index 0000000..b978563 --- /dev/null +++ b/src/views/acgModule/components/episodeNav.vue @@ -0,0 +1,159 @@ + + + diff --git a/src/views/acgModule/components/fiveContent.vue b/src/views/acgModule/components/fiveContent.vue new file mode 100644 index 0000000..10d34f8 --- /dev/null +++ b/src/views/acgModule/components/fiveContent.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/views/acgModule/components/icon-byte.vue b/src/views/acgModule/components/icon-byte.vue new file mode 100644 index 0000000..8863092 --- /dev/null +++ b/src/views/acgModule/components/icon-byte.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/views/acgModule/components/pay/GoldPopup.vue b/src/views/acgModule/components/pay/GoldPopup.vue new file mode 100644 index 0000000..49836a6 --- /dev/null +++ b/src/views/acgModule/components/pay/GoldPopup.vue @@ -0,0 +1,267 @@ + + + diff --git a/src/views/acgModule/components/pay/PayForWatch.vue b/src/views/acgModule/components/pay/PayForWatch.vue new file mode 100644 index 0000000..3666bad --- /dev/null +++ b/src/views/acgModule/components/pay/PayForWatch.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/views/acgModule/components/pay/VipPopup.vue b/src/views/acgModule/components/pay/VipPopup.vue new file mode 100644 index 0000000..bde1bf6 --- /dev/null +++ b/src/views/acgModule/components/pay/VipPopup.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/acgModule/components/permission-tag.vue b/src/views/acgModule/components/permission-tag.vue new file mode 100644 index 0000000..5c4fb4a --- /dev/null +++ b/src/views/acgModule/components/permission-tag.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/views/acgModule/components/popularity.vue b/src/views/acgModule/components/popularity.vue new file mode 100644 index 0000000..d8af830 --- /dev/null +++ b/src/views/acgModule/components/popularity.vue @@ -0,0 +1,166 @@ + + + diff --git a/src/views/acgModule/components/recommendList.vue b/src/views/acgModule/components/recommendList.vue new file mode 100644 index 0000000..e88a62a --- /dev/null +++ b/src/views/acgModule/components/recommendList.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/views/acgModule/components/search.vue b/src/views/acgModule/components/search.vue new file mode 100644 index 0000000..f46cf14 --- /dev/null +++ b/src/views/acgModule/components/search.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/views/acgModule/components/summary.vue b/src/views/acgModule/components/summary.vue new file mode 100644 index 0000000..f5e39c4 --- /dev/null +++ b/src/views/acgModule/components/summary.vue @@ -0,0 +1,67 @@ + + + diff --git a/src/views/acgModule/components/tabPage/adv.vue b/src/views/acgModule/components/tabPage/adv.vue new file mode 100644 index 0000000..4b3adca --- /dev/null +++ b/src/views/acgModule/components/tabPage/adv.vue @@ -0,0 +1,40 @@ + + + + diff --git a/src/views/acgModule/components/tabPage/fiveGridAdv.vue b/src/views/acgModule/components/tabPage/fiveGridAdv.vue new file mode 100644 index 0000000..b02ff95 --- /dev/null +++ b/src/views/acgModule/components/tabPage/fiveGridAdv.vue @@ -0,0 +1,44 @@ + + + diff --git a/src/views/acgModule/components/tabPage/navSection.vue b/src/views/acgModule/components/tabPage/navSection.vue new file mode 100644 index 0000000..fa959b3 --- /dev/null +++ b/src/views/acgModule/components/tabPage/navSection.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/views/acgModule/components/tabPage/rank.vue b/src/views/acgModule/components/tabPage/rank.vue new file mode 100644 index 0000000..1c6f1ea --- /dev/null +++ b/src/views/acgModule/components/tabPage/rank.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/views/acgModule/components/tabPage/rankList.vue b/src/views/acgModule/components/tabPage/rankList.vue new file mode 100644 index 0000000..c023a7d --- /dev/null +++ b/src/views/acgModule/components/tabPage/rankList.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/views/acgModule/components/tabPage/tabHome.vue b/src/views/acgModule/components/tabPage/tabHome.vue new file mode 100644 index 0000000..03d947a --- /dev/null +++ b/src/views/acgModule/components/tabPage/tabHome.vue @@ -0,0 +1,268 @@ + + + + diff --git a/src/views/acgModule/components/tabPage/tabItem.vue b/src/views/acgModule/components/tabPage/tabItem.vue new file mode 100644 index 0000000..53e4f62 --- /dev/null +++ b/src/views/acgModule/components/tabPage/tabItem.vue @@ -0,0 +1,249 @@ + + + diff --git a/src/views/acgModule/components/tabPage/tabItemSecond.vue b/src/views/acgModule/components/tabPage/tabItemSecond.vue new file mode 100644 index 0000000..f64f118 --- /dev/null +++ b/src/views/acgModule/components/tabPage/tabItemSecond.vue @@ -0,0 +1,123 @@ + + + diff --git a/src/views/acgModule/components/tabPage/task.vue b/src/views/acgModule/components/tabPage/task.vue new file mode 100644 index 0000000..1455d1b --- /dev/null +++ b/src/views/acgModule/components/tabPage/task.vue @@ -0,0 +1,180 @@ + + + + diff --git a/src/views/acgModule/components/topic.vue b/src/views/acgModule/components/topic.vue new file mode 100644 index 0000000..e404214 --- /dev/null +++ b/src/views/acgModule/components/topic.vue @@ -0,0 +1,216 @@ + + + diff --git a/src/views/acgModule/components/updateStatus.vue b/src/views/acgModule/components/updateStatus.vue new file mode 100644 index 0000000..a687532 --- /dev/null +++ b/src/views/acgModule/components/updateStatus.vue @@ -0,0 +1,30 @@ + + + + diff --git a/src/views/acgModule/detail-image/index.vue b/src/views/acgModule/detail-image/index.vue new file mode 100644 index 0000000..b9c35fb --- /dev/null +++ b/src/views/acgModule/detail-image/index.vue @@ -0,0 +1,773 @@ + + + + diff --git a/src/views/acgModule/detail-image/watch.vue b/src/views/acgModule/detail-image/watch.vue new file mode 100644 index 0000000..5cd2ba4 --- /dev/null +++ b/src/views/acgModule/detail-image/watch.vue @@ -0,0 +1,761 @@ + + + + diff --git a/src/views/acgModule/detail-text/index.vue b/src/views/acgModule/detail-text/index.vue new file mode 100644 index 0000000..39e380e --- /dev/null +++ b/src/views/acgModule/detail-text/index.vue @@ -0,0 +1,538 @@ + + + + diff --git a/src/views/acgModule/detail-text/watch0.vue b/src/views/acgModule/detail-text/watch0.vue new file mode 100644 index 0000000..9884214 --- /dev/null +++ b/src/views/acgModule/detail-text/watch0.vue @@ -0,0 +1,358 @@ + + + + diff --git a/src/views/acgModule/detail-text/watch1.vue b/src/views/acgModule/detail-text/watch1.vue new file mode 100644 index 0000000..71c3393 --- /dev/null +++ b/src/views/acgModule/detail-text/watch1.vue @@ -0,0 +1,626 @@ + + + + diff --git a/src/views/acgModule/detail-video/components/introduction.vue b/src/views/acgModule/detail-video/components/introduction.vue new file mode 100644 index 0000000..637321b --- /dev/null +++ b/src/views/acgModule/detail-video/components/introduction.vue @@ -0,0 +1,411 @@ + + + diff --git a/src/views/acgModule/detail-video/index.vue b/src/views/acgModule/detail-video/index.vue new file mode 100644 index 0000000..3a6abeb --- /dev/null +++ b/src/views/acgModule/detail-video/index.vue @@ -0,0 +1,468 @@ + + + + diff --git a/src/views/acgModule/topicList/components/list.vue b/src/views/acgModule/topicList/components/list.vue new file mode 100644 index 0000000..225490c --- /dev/null +++ b/src/views/acgModule/topicList/components/list.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/views/acgModule/topicList/index.vue b/src/views/acgModule/topicList/index.vue new file mode 100644 index 0000000..63632ba --- /dev/null +++ b/src/views/acgModule/topicList/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/acgModule/utils/collect.ts b/src/views/acgModule/utils/collect.ts new file mode 100644 index 0000000..8603065 --- /dev/null +++ b/src/views/acgModule/utils/collect.ts @@ -0,0 +1,59 @@ +import MediaApi from '@/service/media'; +import { showToast } from 'vant'; +import { onMounted, onUnmounted, Ref } from 'vue'; +import eventBus from '@/utils/eventBus'; +import { AcgEventBusKey } from '@/enums/app'; + +/** + * @Description 收藏acg + * @param {string} objID + * @param {string} mediaType + * @param {boolean} isCollect + * @return {*} + */ +const handleCollected = async (objID: string, isCollect: boolean) => { + try { + return (isCollect ? MediaApi.postBookshelfAdd : MediaApi.postBookshelfDel)({ + id: objID, + }).then(() => { + showToast(isCollect ? '成功收藏' : '成功取消'); + }); + } catch (e) { + console.log(e); + } +}; + +/** + * @Description eventBus监听 + * @param {string} id + * @param {Ref} hasCollected + * @return {*} + */ +const Collected_on = (id: string, hasCollected: Ref, callback?: any) => { + const update = (bool: any) => { + if (callback) { + callback(bool); + return; + } + hasCollected.value = bool; + }; + + onMounted(() => { + eventBus.on(AcgEventBusKey.Collected + id, update); + }); + onUnmounted(() => { + eventBus.off(AcgEventBusKey.Collected + id, update); + }); +}; + +/** + * @Description eventBus赋值 + * @param {string} id + * @param {boolean} bool + * @return {*} + */ +const Collected_emit = (id: string, bool: boolean) => { + eventBus.emit(AcgEventBusKey.Collected + id, bool); +}; + +export { handleCollected, Collected_on, Collected_emit }; diff --git a/src/views/acgModule/utils/common.ts b/src/views/acgModule/utils/common.ts new file mode 100644 index 0000000..17829b8 --- /dev/null +++ b/src/views/acgModule/utils/common.ts @@ -0,0 +1,129 @@ +import router from '@/router'; +const goTopicPage = (id: string, type: string | number, title: string, showType?: number) => { + if (typeof type === 'number') { + type = getMediaTypeKey(type); + } + router.push({ path: '/AcgTopicList', query: { id, type, title, showType } }); +}; + +const goAcgTagPage = (id: string, tagName: string, newsType?: string) => { + router.push({ path: '/tagVideoList', query: { id, tagName, newsType } }); +}; +// kind的id对应字符串 +enum MediaType { + video = 4, + image = 5, + text = 6, +} +type MediaTypeKey = keyof typeof MediaType; +type MediaTypeValue = { [key in MediaType]: number }; + +function getMediaTypeKey(value: number): string { + if (value === MediaType.video) { + return 'video'; + } else if (value === MediaType.image) { + return 'image'; + } else if (value === MediaType.text) { + return 'text'; + // } else if (value === MediaType.theatre) { + // return 'theatre'; + } else { + return ''; + } +} + +function getMediaTypeValue(value: string): MediaType | number { + const mediaTypeKeys = Object.keys(MediaType).filter((key) => isNaN(Number(key))); + const mediaTypeValues = mediaTypeKeys.map((key) => MediaType[key]); + const index = mediaTypeKeys.indexOf(value); + + if (index !== -1) { + return mediaTypeValues[index]; + } + + return 0; +} + +const goFilterPage = () => { + const route = router.currentRoute; + const { mediaType = 'video' } = route.value.query; + router.push({ path: '/AcgSearchFilter', query: { mediaType } }); +}; +//获取当前时间 +const getNewDate = () => { + return new Date(new Date().getTime() + (window._diffTime || 0)); +}; + +const rankTabList = [ + { title: '日榜', key: 1 }, + { title: '周榜', key: 2 }, + { title: '人气榜', key: 3 }, + { title: '热度榜', key: 4 }, + { title: '钻石榜', key: 5 }, + { title: '连载榜', key: 6 }, +]; + +function getElementDistance(element: HTMLElement, parent: HTMLElement) { + const elementRect = element.getBoundingClientRect(); + const parentRect = parent.getBoundingClientRect(); + + const distance = { + top: elementRect.top - parentRect.top, + right: parentRect.right - elementRect.right, + bottom: parentRect.bottom - elementRect.bottom, + left: elementRect.left - parentRect.left, + }; + + return distance; +} + +const goDetailPage = (mediaType: MediaTypeKey, id: string, mediaSubType?: number) => { + let name = 'AcgImageDetail'; + if (mediaType === 'text') { + name = 'AcgTextDetail'; + } else if (mediaType === 'video') { + name = 'AcgVideoDetail'; + } + + router.push({ + name, + query: { + id, + }, + }); +}; + +const freeSet = new Set(); + +const getUpdateStatusText = (updateStatus?: number) => { + if (updateStatus === 2) return '已完结'; + return '连载中'; +}; + +/** 按 id(无 id 则按 name)去重,保留首次出现顺序 */ +const dedupeTagDetails = (tags?: Types.Media.TagDetailsItem[] | null): Types.Media.TagDetailsItem[] => { + if (!tags?.length) return []; + const seen = new Set(); + return tags.filter((item) => { + const key = String(item.name || '').trim(); + if (!key || seen.has(key)) return false; + seen.add(key); + return true; + }); +}; + +export { + goTopicPage, + goFilterPage, + getMediaTypeKey, + getMediaTypeValue, + getNewDate, + rankTabList, + getElementDistance, + goDetailPage, + freeSet, + getUpdateStatusText, + goAcgTagPage, + dedupeTagDetails, +}; +export type { MediaTypeKey, MediaTypeValue }; diff --git a/src/views/acgModule/utils/indexDB.ts b/src/views/acgModule/utils/indexDB.ts new file mode 100644 index 0000000..ae0b76d --- /dev/null +++ b/src/views/acgModule/utils/indexDB.ts @@ -0,0 +1,66 @@ +import { ref, Ref } from 'vue'; +import { getVideoHistoryByKey, addVideoHistory } from '@/utils/index'; +import { HistoryVideoType } from '@/enums/app'; +import eventBus from '@/utils/eventBus'; + +const AcgHistoryData = {} as { + [key: string]: { + [key: string]: Types.Media.MediaInfo; + }; +}; + +const key = 'AcgHistoryData_'; + +const getData = async (id: string, dbType = HistoryVideoType.AcgImage, isParent: boolean) => { + if (!AcgHistoryData[dbType]) { + AcgHistoryData[dbType] = {}; + } + let item = AcgHistoryData[dbType][id]; + if (item && item.id) { + return item; + } + + if (!item) { + AcgHistoryData[dbType][id] = { id: '' } as any; + item = (await getVideoHistoryByKey(id, dbType)) as any; + } else { + item = (await new Promise((resolve) => { + eventBus.on(key + id, (obj: Types.Media.MediaInfo) => { + eventBus.off(key + id); + resolve(obj); + }); + })) as any; + } + + if (item && item.id) { + AcgHistoryData[dbType][id] = item; + eventBus.emit(key + id, item); + } + return item; +}; + +export default (dbType = HistoryVideoType.AcgImage, isParent: boolean) => { + const historyEpisodeNumber = ref(0); + const historyData = ref({}) as Ref; + + const getHistoryData = async (id: string) => { + const history = (await getData(id, dbType, isParent)) as any; + if (history) { + historyData.value = history; + if (history.historyEpisodeNumber) { + historyEpisodeNumber.value = history.historyEpisodeNumber; + } + } else { + historyEpisodeNumber.value = 0; + } + }; + + const setHistoryData = (data: any, dbType: HistoryVideoType) => { + const item = (AcgHistoryData[dbType] && AcgHistoryData[dbType][data.id]) || {}; + const newItem = Object.assign(item, data); + AcgHistoryData[dbType][data.id] = newItem; + eventBus.emit(key + data.id, newItem); + addVideoHistory(newItem, dbType, new Date().getTime()); + }; + return { historyData, historyEpisodeNumber, getHistoryData, setHistoryData }; +}; diff --git a/src/views/acgModule/utils/mediaContentInfo.ts b/src/views/acgModule/utils/mediaContentInfo.ts new file mode 100644 index 0000000..e9b9341 --- /dev/null +++ b/src/views/acgModule/utils/mediaContentInfo.ts @@ -0,0 +1,542 @@ +import { reactive, ref, ComputedRef, watchEffect, watch, nextTick, computed, onBeforeUnmount } from 'vue'; +import { useRoute, useRouter } from 'vue-router'; +import { HistoryVideoType } from '@/enums/app'; +import indexDB from './indexDB'; +import { showToast } from 'vant'; +import AcgApi from '@/service/acg'; +import useLoading from '@/hooks/loading'; +import { useUserStore } from '@/stores/user'; +import { freeSet } from './common'; +interface ReadData { + [key: string]: any; +} + +export default ({ + mediaId = '', + isScrollTop = true, + isGetInfo = true, + isUpdate = true, + isNeedHistory = true, + isGetHistoryInit = false, + pageSize = 30, + dbType = HistoryVideoType.AcgImage, +}) => { + const userStore = useUserStore(); + const { openLoading, closeLoading } = useLoading(); + const route = useRoute(); + const router = useRouter(); + const { id, episodeNumber, title } = route.query; + + const state = reactive({ + list: [] as Types.Acg.MediaContentListItem[], + info: {} as Types.Acg.MediaContentInfo, + validateItem: {} as Types.Acg.MediaContentListItem, + episodeNumber: Number(episodeNumber || '1'), + id: (mediaId || id) as string, + title, + gradingGroupIndex: 0, + }); + + const { historyData, historyEpisodeNumber, getHistoryData, setHistoryData } = indexDB(dbType, true); + const addHistory = (num: number) => { + if (num === -1) { + num = state.episodeNumber; + } + const data = { ...historyData.value, historyEpisodeNumber: num, historyReadData }; + setHistoryData(data, dbType); + }; + + const historyReadData = [] as Types.Acg.ReadData[]; + + const addHistoryReadData = (num: number, obj: ReadData, imgObj?: { url: string; width: number; height: number }) => { + const listItem = state.list.find((item) => item.episodeNumber === num); + if (!listItem) return; + + const index = (historyReadData || []).findIndex((item) => item.episodeNumber === num); + const isHas = index > -1; + + const imgs = isHas ? historyReadData[index].imgs || {} : {}; + if (imgObj?.url) { + imgs[imgObj?.url] = { + width: imgObj?.width, + height: imgObj?.height, + }; + } + let item = {}; + if (isHas) { + item = historyReadData.splice(index, 1)[0]; + } + + const newItem = Object.assign({}, { ...item }, { ...listItem, ...obj, imgs }); + historyReadData.push(newItem); + }; + + if (isUpdate) { + onBeforeUnmount(() => { + nextTick(() => { + addHistory(-1); + }); + }); + } + + const currentItem = computed(() => { + if (state.list.length === 0) return {}; + return state.list.find((item) => item.episodeNumber === state.episodeNumber) || {}; + }) as ComputedRef; + + let initScrollLeft = true; + watch(currentItem, () => { + if (initScrollLeft) { + goSectionScrollLeft(); + initScrollLeft = false; + } + if (['AcgTextDetail', 'AcgImageDetail'].includes((route.name as string) || '')) { + return; + } + validateHasBuy(currentItem.value); + }); + + watch( + () => state.episodeNumber, + () => { + addHistory(state.episodeNumber); + }, + ); + + const getPageNumber = () => { + return Math.ceil(state.episodeNumber / 30); + }; + const pageNumber = getPageNumber(); + + const params = { + prevPageNumber: pageNumber, + nextPageNumber: pageNumber, + pageSize, + }; + + const moreParams = reactive({ + loading: true, + refreshing: false, + finished: false, + isNoData: false, + error: false, + isHigehtMax: false, + }); + + const moreParams_finished = { + prev: false, + next: false, + }; + + const getList = async (type: 'prev' | 'next', pageNumber?: number) => { + try { + const tempParams = { + mediaId: state.id, + pageSize: params.pageSize, + pageNumber: pageNumber ? pageNumber : type === 'prev' ? params.prevPageNumber : params.nextPageNumber, + }; + let res: any = await AcgApi.getMediaContentList(tempParams); + if ((res.list || []).length === 0 && state.list.length === 0 && tempParams.pageNumber !== 1) { + params.prevPageNumber = 1; + params.nextPageNumber = 1; + tempParams.pageNumber = 1; + res = await AcgApi.getMediaContentList(tempParams); + } + + historyData.value.currentEpisode = res.total; + + moreParams.loading = false; + moreParams.refreshing = false; + + let list = res.list || []; + if (list.length > 0) { + const reList = (list || []).reduce( + (acc: Types.Acg.MediaContentListItem[], current: Types.Acg.MediaContentListItem) => { + const x = acc.find((item) => item.episodeNumber === current.episodeNumber); + if (!x) { + return acc.concat([current]); + } else { + return acc; + } + }, + [], + ); + if (isInitGetList && res.hasNext && list.length !== reList.length) { + list = reList; + onLoad(); + } + } + isInitGetList = false; + + if (state.list.length === 0) { + state.list = list; + } else { + state.list = state.list.concat(list); + } + if (tempParams.pageNumber == 1 && state.list.length == 0) { + moreParams.isNoData = true; + } + if (!res.hasNext) { + moreParams_finished[type] = true; + moreParams.finished = type === 'next' && sort.value; + } + return list; + } catch (e) { + moreParams.loading = false; + moreParams.error = true; + return []; + } + }; + + const onLoad = () => { + moreParams.loading = true; + if (sort.value) { + params.nextPageNumber += 1; + getList('next'); + } else { + if (params.prevPageNumber === 1) { + moreParams.loading = false; + return; + } + params.prevPageNumber -= 1; + getList('prev'); + } + }; + + const onRefresh = () => { + if (sort.value) { + if (params.prevPageNumber == 1) { + moreParams.refreshing = false; + return; + } + params.prevPageNumber -= 1; + moreParams.refreshing = true; + moreParams.finished = false; + getList('prev'); + } else { + if (moreParams_finished['next']) { + moreParams.refreshing = false; + return; + } + params.nextPageNumber += 1; + moreParams.refreshing = true; + getList('next'); + } + }; + let isInitGetList = true; + const init = () => { + getList('next'); + }; + + if (isNeedHistory) { + getHistoryData(state.id).then(() => { + historyReadData.push(...JSON.parse(JSON.stringify(historyData.value.historyReadData || '[]'))); + if (isGetHistoryInit) { + if (!episodeNumber) { + state.episodeNumber = historyData.value.historyEpisodeNumber || state.episodeNumber; + } + + const pageNumber = getPageNumber(); + + params.prevPageNumber = pageNumber; + params.nextPageNumber = pageNumber; + } + + init(); + }); + } else { + init(); + } + + const getContent = async () => { + if (state.info.id) { + openLoading(); + } + + await AcgApi.getMediaContentInfo({ id: currentItem.value.id }).then((res) => { + state.info = res; + }); + + closeLoading(); + }; + + if (isGetInfo) { + watch( + () => currentItem.value.id, + (newId, oldId) => { + if (!newId || newId === oldId) return; + getContent(); + }, + ); + } + + const statusText = computed(() => { + switch (historyData.value.updateStatus) { + case 1: + return '连载中'; + case 2: + return '已完结'; + default: + return '已完结'; + } + }); + + //目录 + const visibleCatalogue = ref(false); + const sort = ref(true); + const autoList = computed(() => { + return (state.list || []).sort( + sort.value ? (a, b) => a.episodeNumber - b.episodeNumber : (a, b) => b.episodeNumber - a.episodeNumber, + ); + }); + + const scrollToElement = (elementId: string) => { + const element = document.getElementById(elementId) as HTMLElement; + if (!element) return; + const parent = element.closest('.list') as HTMLElement; + + const parentRect = parent.getBoundingClientRect(); + const elementRect = element.getBoundingClientRect(); + + const offsetTop = elementRect.top - parentRect.top; + const offsetBottom = elementRect.bottom - parentRect.bottom; + + if (offsetTop < 0 || offsetBottom > 0) { + // parent.scrollTop = element.offsetTop - (parent.offsetHeight - element.offsetHeight) / 2; + parent.scrollTop = element.offsetTop - parent.offsetHeight / 2; + } + }; + const goSectionScrollTop = () => { + if (!isScrollTop) return; + nextTick(() => { + scrollToElement(`section_${state.episodeNumber}`); + }); + }; + + let isInit = false; + + watchEffect(() => { + if (!visibleCatalogue.value) return; + + if (isInit) { + return; + } + + isInit = true; + + goSectionScrollTop(); + }); + + watch( + () => sort.value, + () => { + moreParams.finished = moreParams_finished[sort.value ? 'next' : 'prev']; + goSectionScrollTop(); + }, + ); + + //支付 + const dvPayForWatch = ref(); + const visiblePayForWatch = ref(false); + + const validatePermission = () => { + // 购买优先 + if (historyData.value.id && historyData.value.mediaStatus && historyData.value.mediaStatus.hasPaid) return true; + // 会员 + if (historyData.value.permission === 0 && userStore.isVip) return true; + // 付费 + if (historyData.value.permission === 1) { + if (!historyData.value.price) { + return true; + } + if (userStore.userInfo.vipLevel >= 2) { + return true; + } + } + // 免费 || 前几集免费 + if (historyData.value.permission === 2 || historyData.value.freeEpisode >= state.validateItem.episodeNumber) + return true; + + return false; + }; + + const validateHasBuy = (item: Types.Acg.MediaContentListItem) => { + state.validateItem = item; + if (!validatePermission()) { + visiblePayForWatch.value = true; + // showToast('付费章节,购买后才能观看喔'); + return true; + } + visiblePayForWatch.value = false; + return false; + }; + + const buySuccess = (type = 'one') => { + state.info.hasBuy = true; + if (state.validateItem.id) { + state.validateItem.hasBuy = true; + state.episodeNumber = state.validateItem.episodeNumber; + } + visiblePayForWatch.value = false; + visibleCatalogue.value = false; + if (type === 'all') { + state.list.forEach((item) => { + item.hasBuy = true; + }); + } + }; + + // watch( + // dvPayForWatch, + // (el) => { + // debugger; + // if (!el) return; + // validateHasBuy(currentItem.value); + // }, + // // { + // // once: true, + // // }, + // ); + + const closePayForWatch = () => { + if (validatePermission()) { + visiblePayForWatch.value = false; + return; + } + router.back(); + }; + + const loadEpisodeList = async (num: number, type: 'prev' | 'next') => { + const item = state.list.find((item) => item.episodeNumber === num); + if (item) return item; + + openLoading(); + await getList(type); + closeLoading(); + + return state.list.find((item) => item.episodeNumber === num); + }; + + const replaceRouter = (num: number) => { + router.replace({ + path: route.path, + query: { + ...route.query, + episodeNumber: num, + }, + }); + }; + + const switchEpisodeNumber = async (num: number, isValidate = true) => { + + if (num === -1) { + if (state.episodeNumber !== 1) { + const prevNum = state.episodeNumber - 1; + const item = await loadEpisodeList(prevNum, 'prev'); + if (isValidate) { + if (validateHasBuy(item as Types.Acg.MediaContentListItem)) { + return false; + } + } + state.episodeNumber = prevNum; + if (dbType === HistoryVideoType.AcgText) { + addHistoryReadData(prevNum, { progress: 0, scrollTop: 0 }); + addHistory(prevNum); + } + replaceRouter(prevNum); + return true; + } else { + showToast('这是第一章了喔~'); + return false; + } + } else { + if (state.episodeNumber < historyData.value.currentEpisode) { + const nextNum = state.episodeNumber + 1; + const item = await loadEpisodeList(nextNum, 'next'); + if (isValidate) { + if (validateHasBuy(item as Types.Acg.MediaContentListItem)) { + return false; + } + } + state.episodeNumber = nextNum; + if (dbType === HistoryVideoType.AcgText) { + addHistoryReadData(nextNum, { progress: 0, scrollTop: 0 }); + addHistory(nextNum); + } + replaceRouter(nextNum); + return true; + } else { + showToast('已经到最后一章了喔~'); + return false; + } + } + }; + + const switchEpisodeNumberCatalogue = (item: Types.Acg.MediaContentListItem) => { + if (validateHasBuy(item)) return; + + visibleCatalogue.value = false; + if (dbType === HistoryVideoType.AcgText) { + addHistoryReadData(item.episodeNumber, { progress: 0, scrollTop: 0 }); + addHistory(item.episodeNumber); + } + state.episodeNumber = item.episodeNumber; + replaceRouter(item.episodeNumber); + }; + + const scrollToElement2 = (elementId: string) => { + const element = document.getElementById(elementId) as HTMLElement; + if (!element) return; + const parent = element.closest('.episode-box') as HTMLElement; + const parentRect = parent.getBoundingClientRect(); + const elementRect = element.getBoundingClientRect(); + + const offsetLeft = elementRect.left - parentRect.left; + const offsetRight = elementRect.right - parentRect.right; + + if (offsetLeft < 0 || offsetRight > 0) { + parent.scrollLeft = element.offsetLeft - parent.offsetWidth / 2; + } + }; + const goSectionScrollLeft = () => { + const item = state.list.find((item) => item.episodeNumber === state.episodeNumber); + if (!item) return; + nextTick(() => { + scrollToElement2(`episode-${item.id}`); + }); + }; + const handlePopupSwitchEpisode = (num: number) => { + state.episodeNumber = num; + visibleCatalogue.value = false; + + goSectionScrollLeft(); + }; + + return { + state, + currentItem, + statusText, + moreParams, + onLoad, + onRefresh, + getList, + visibleCatalogue, + handlePopupSwitchEpisode, + sort, + autoList, + dvPayForWatch, + visiblePayForWatch, + validateHasBuy, + buySuccess, + closePayForWatch, + switchEpisodeNumber, + historyData, + historyEpisodeNumber, + addHistory, + addHistoryReadData, + switchEpisodeNumberCatalogue, + validatePermission, + goSectionScrollTop, + replaceRouter, + }; +}; diff --git a/src/views/acgModule/utils/mediaInfo.ts b/src/views/acgModule/utils/mediaInfo.ts new file mode 100644 index 0000000..803b1b1 --- /dev/null +++ b/src/views/acgModule/utils/mediaInfo.ts @@ -0,0 +1,80 @@ +import { reactive, computed, onActivated, onUnmounted, provide } from 'vue'; +import { useRoute } from 'vue-router'; +import MediaApi from '@/service/media'; +import { HistoryVideoType } from '@/enums/app'; +import indexDB from './indexDB'; +import { dedupeTagDetails } from './common'; +// import { showToast } from 'vant'; + +export default ({ id = '', dbType = HistoryVideoType.AcgImage }) => { + const route = useRoute(); + const madieId = id || (route.query.id as string); + //内容 + const state = reactive({ + info: {} as Types.Media.MediaInfo, + episodeNumber: Number(route.query.episode) || 1, + advsList: [], + timer: 0, + isShowAdv: true, + countdowner: null, + }); + + const { historyData, historyEpisodeNumber, getHistoryData, setHistoryData } = indexDB(dbType, true); + provide('historyData', historyData); + const addHistory = (num = 0) => { + const historyReadData = historyData.value.historyReadData || []; + const obj = { ...historyData.value, ...state.info, historyReadData }; + if (num > 0) { + obj.historyEpisodeNumber = num; + } + setHistoryData(obj, dbType); + }; + + onActivated(() => { + if (!state.info.id) return; + setTimeout(() => { + getHistoryData(madieId); + }, 500); + }); + + onUnmounted(() => { + getHistoryData(madieId).then(() => { + addHistory(); + }); + }); + + const getData = async () => { + await getHistoryData(madieId); + const res = await MediaApi.getMediaInfo({ id: madieId }); + const info = res as Types.Media.MediaInfo; + if (info.tagDetails?.length) { + info.tagDetails = dedupeTagDetails(info.tagDetails); + } + state.info = info; + + addHistory(); + if (!historyData.value.id) { + historyData.value = state.info; + } + }; + getData(); + + const statusText = computed(() => { + switch (state.info.updateStatus) { + case 1: + return '连载中'; + case 2: + return '已完结'; + default: + return '已完结'; + } + }); + + return { + state, + historyData, + addHistory, + historyEpisodeNumber, + statusText, + }; +}; diff --git a/src/views/acgModule/utils/pay-mitt.ts b/src/views/acgModule/utils/pay-mitt.ts new file mode 100644 index 0000000..22363f0 --- /dev/null +++ b/src/views/acgModule/utils/pay-mitt.ts @@ -0,0 +1,63 @@ +import { onMounted, onUnmounted, Ref } from 'vue'; +import eventBus from '@/utils/eventBus'; +import { AcgEventBusKey } from '@/enums/app'; + +interface PayInfo { + type: 'one' | 'all'; + productID: string; + isFree: boolean; +} + +const Pay_parent_on = ({ + id, + state, + historyData, + addHistory, +}: { + id: string; + state: { + info: Types.Media.MediaInfo; + }; + historyData: Ref; + addHistory: any; +}) => { + const update = () => { + state.info.mediaStatus.hasPaid = true; + historyData.value.mediaStatus.hasPaid = true; + addHistory(); + }; + + onMounted(() => { + eventBus.on(AcgEventBusKey.HasPaid + id, update as any); + }); + onUnmounted(() => { + eventBus.off(AcgEventBusKey.HasPaid + id, update as any); + }); +}; + +const Pay_child_on = (parentId: string, state: any) => { + const update = (id: any) => { + const item = (state.list as Types.Acg.MediaContentListItem[]).find((item) => item.id === id); + if (item) { + item.hasBuy = true; + } + }; + + onMounted(() => { + eventBus.on(AcgEventBusKey.HasBuy + parentId, update); + }); + onUnmounted(() => { + eventBus.off(AcgEventBusKey.HasBuy + parentId, update); + }); +}; + +const Pay_emit = (id: string, obj: PayInfo) => { + if (obj.type === 'one') { + eventBus.emit(AcgEventBusKey.HasBuy + id, obj.productID); + } else { + eventBus.emit(AcgEventBusKey.HasPaid + id); + } +}; + +export { Pay_parent_on, Pay_child_on, Pay_emit }; +export type { PayInfo }; diff --git a/src/views/acgModule/utils/touch.ts b/src/views/acgModule/utils/touch.ts new file mode 100644 index 0000000..07392f2 --- /dev/null +++ b/src/views/acgModule/utils/touch.ts @@ -0,0 +1,242 @@ +interface Rules { + toBottom: number; + toTop: number; + toLeft: number; + toRight: number; + isClickCallback?: boolean; +} + +export interface Position { + x: number; + y: number; + time: number; +} +export interface Result { + toTop: boolean; + toBottom: boolean; + toLeft: boolean; + toRight: boolean; +} +class TouchSlide { + element; + startCallback: ((event: TouchEvent) => void) | undefined; + moveCallback: ((event: TouchEvent) => void) | undefined; + endCallback: ((event: TouchEvent) => void) | undefined; + isTouch; + isTouchMove; + + event: TouchEvent | undefined; + rules = { + toBottom: 0, + toTop: 0, + toLeft: 0, + toRight: 0, + isClickCallback: false, + } as Rules; + scrollDirection: number | undefined; + startPos = { + x: 0, + y: 0, + time: 0, + } as Position; + movePos = [] as Position[]; + endPos = { + x: 0, + y: 0, + time: 0, + } as Position; + isInit = false; + scrollDirectionSibling = 0; + result = { + toTop: false, + toBottom: false, + toLeft: false, + toRight: false, + }; + eventType = 'click'; + + constructor({ + element, + rules, + startCallback, + moveCallback, + endCallback, + }: { + element: HTMLElement; + rules?: Rules; + startCallback?: (event: TouchEvent) => void; + moveCallback?: (event: TouchEvent) => void; + endCallback?: (event: TouchEvent) => void; + startPos?: Position; + movePos?: Position[]; + endPos?: Position; + scrollDirection?: number; + scrollDirectionSibling?: number; + result?: Result; + eventType?: 'click' | 'slide'; + }) { + this.element = element; + this.startCallback = startCallback; + this.moveCallback = moveCallback; + this.endCallback = endCallback; + + this.isTouch = false; + this.isTouchMove = false; + this.initRules(rules || {}); + + const options = { + capture: false, + passive: false, + }; + + this.element.addEventListener('touchstart', this.eventStart.bind(this), options); + this.element.addEventListener('touchmove', this.eventMove.bind(this), options); + this.element.addEventListener('touchend', this.eventEnd.bind(this), options); + } + // 初始化规则,如果没有传参,则返默认.5 + initRules({ toBottom = 0, toTop = 0, toLeft = 0, toRight = 0 }) { + if (!toRight && !toLeft && !toTop && !toBottom) { + toRight = toLeft = toTop = toBottom = 0.3; + } + + this.rules = { + toBottom, + toTop, + toLeft, + toRight, + }; + } + isPassRules() { + if (this.scrollDirection && (this.rules.toBottom || this.rules.toTop)) { + return true; + } else if (!this.scrollDirection && (this.rules.toRight || this.rules.toLeft)) { + return true; + } else { + return false; + } + } + + getTargetTouche(event: TouchEvent) { + return event.targetTouches[0]; + } + + eventStart(event: TouchEvent) { + this.event = event; + const touch = this.getTargetTouche(event); + + this.startPos = { + x: touch.screenX, + y: touch.screenY, + time: +new Date(), + }; + + this.movePos = []; + this.endPos = { + x: 0, + y: 0, + time: 0, + }; + this.scrollDirection = 0; + this.isInit = false; + this.isTouch = true; + this.isTouchMove = false; + + if (this.startCallback) { + this.startCallback(event); + } + } + + eventMove(event: TouchEvent) { + this.event = event; + + this.isTouchMove = true; + + if (!this.isTouch) { + return; + } + if (event.targetTouches.length > 1 || (event.scale && event.scale !== 1)) { + return; + } + const touch = this.getTargetTouche(event); + + this.endPos = { + x: touch.screenX - this.startPos.x, + y: touch.screenY - this.startPos.y, + time: +new Date(), + }; + + this.movePos.push(JSON.parse(JSON.stringify(this.endPos))); + + if (!this.isInit) { + this.isInit = true; + this.scrollDirection = Math.abs(this.endPos.x) < Math.abs(this.endPos.y) ? 1 : 0; + } + + this.scrollDirectionSibling = this.scrollDirection ? (this.endPos.y < 0 ? 1 : -1) : this.endPos.x < 0 ? 1 : -1; + + if (this.moveCallback && this.isPassRules()) { + this.moveCallback(event); + } + } + eventEnd(event: TouchEvent) { + this.isTouch = false; + if (!this.isPassRules() || !this.isTouchMove) { + if (!this.isTouchMove) { + this.eventType = 'click'; + } else { + this.eventType = 'slide'; + } + + if (this.rules.isClickCallback && this.endCallback) { + this.endCallback(event); + } + + return; + } + + this.eventType = 'slide'; + + const movePos = this.movePos, + movePosLen = movePos.length, + endMovePos = movePos[movePosLen - 1], + end2Second = movePos[movePosLen - 2]; + + let [toTop, toBottom, toLeft, toRight] = [false, false, false, false]; + if (endMovePos) { + const rules = this.rules; + const speed = end2Second + ? Math.abs(this.scrollDirection ? endMovePos.y - end2Second.y : endMovePos.x - end2Second.x) / + (endMovePos.time - end2Second.time) + : 0, + slideSpeed = 2; + const { innerHeight, innerWidth } = window; + + if (this.scrollDirection) { + if (this.scrollDirectionSibling >= 0) { + toTop = speed > slideSpeed || rules['toTop'] * innerHeight <= Math.abs(endMovePos.y); + } else { + toBottom = speed > slideSpeed || rules['toBottom'] * innerHeight <= Math.abs(endMovePos.y); + } + } else { + if (this.scrollDirectionSibling <= 0) { + toRight = speed > slideSpeed || rules['toRight'] * innerWidth <= Math.abs(endMovePos.x); + } else { + toLeft = speed > slideSpeed || rules['toLeft'] * innerWidth <= Math.abs(endMovePos.x); + } + } + } + + this.result = { + toTop, + toBottom, + toLeft, + toRight, + }; + + if (this.endCallback) { + this.endCallback(event); + } + } +} + +export default TouchSlide; diff --git a/src/views/activityWeb/index.vue b/src/views/activityWeb/index.vue new file mode 100644 index 0000000..9ccff0a --- /dev/null +++ b/src/views/activityWeb/index.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/views/community/communityTagDeatil/components/itemBox.vue b/src/views/community/communityTagDeatil/components/itemBox.vue new file mode 100644 index 0000000..bfbbade --- /dev/null +++ b/src/views/community/communityTagDeatil/components/itemBox.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/views/community/communityTagDeatil/index.vue b/src/views/community/communityTagDeatil/index.vue new file mode 100644 index 0000000..8002ce7 --- /dev/null +++ b/src/views/community/communityTagDeatil/index.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/src/views/community/components/CommunityItem.vue b/src/views/community/components/CommunityItem.vue new file mode 100644 index 0000000..925dbcb --- /dev/null +++ b/src/views/community/components/CommunityItem.vue @@ -0,0 +1,291 @@ + + + diff --git a/src/views/community/components/GoldPopup.vue b/src/views/community/components/GoldPopup.vue new file mode 100644 index 0000000..ac2e7f0 --- /dev/null +++ b/src/views/community/components/GoldPopup.vue @@ -0,0 +1,262 @@ + + + diff --git a/src/views/community/components/coverSeekList.vue b/src/views/community/components/coverSeekList.vue new file mode 100644 index 0000000..8edb101 --- /dev/null +++ b/src/views/community/components/coverSeekList.vue @@ -0,0 +1,29 @@ + + + diff --git a/src/views/community/components/coverSeekType.vue b/src/views/community/components/coverSeekType.vue new file mode 100644 index 0000000..03a98f9 --- /dev/null +++ b/src/views/community/components/coverSeekType.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/src/views/community/components/gameItem.vue b/src/views/community/components/gameItem.vue new file mode 100644 index 0000000..ffda7dd --- /dev/null +++ b/src/views/community/components/gameItem.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/src/views/community/components/itemBox.vue b/src/views/community/components/itemBox.vue new file mode 100644 index 0000000..e6a6ecb --- /dev/null +++ b/src/views/community/components/itemBox.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/src/views/community/coverPage/components/action.vue b/src/views/community/coverPage/components/action.vue new file mode 100644 index 0000000..598103e --- /dev/null +++ b/src/views/community/coverPage/components/action.vue @@ -0,0 +1,166 @@ + + + + diff --git a/src/views/community/coverPage/components/coverItem.vue b/src/views/community/coverPage/components/coverItem.vue new file mode 100644 index 0000000..0baa0ba --- /dev/null +++ b/src/views/community/coverPage/components/coverItem.vue @@ -0,0 +1,204 @@ + + + diff --git a/src/views/community/coverPage/components/index-typeTab.vue b/src/views/community/coverPage/components/index-typeTab.vue new file mode 100644 index 0000000..ba91da0 --- /dev/null +++ b/src/views/community/coverPage/components/index-typeTab.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/community/coverPage/components/index-typeTabContent.vue b/src/views/community/coverPage/components/index-typeTabContent.vue new file mode 100644 index 0000000..0ee7baf --- /dev/null +++ b/src/views/community/coverPage/components/index-typeTabContent.vue @@ -0,0 +1,250 @@ + + + diff --git a/src/views/community/coverPage/components/lazt-image.vue b/src/views/community/coverPage/components/lazt-image.vue new file mode 100644 index 0000000..9c90969 --- /dev/null +++ b/src/views/community/coverPage/components/lazt-image.vue @@ -0,0 +1,190 @@ + + + diff --git a/src/views/community/coverPage/components/pay.vue b/src/views/community/coverPage/components/pay.vue new file mode 100644 index 0000000..32c3596 --- /dev/null +++ b/src/views/community/coverPage/components/pay.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/views/community/coverPage/components/videoItem.vue b/src/views/community/coverPage/components/videoItem.vue new file mode 100644 index 0000000..0d769f4 --- /dev/null +++ b/src/views/community/coverPage/components/videoItem.vue @@ -0,0 +1,168 @@ + + + diff --git a/src/views/community/coverPage/components/waterfall.vue b/src/views/community/coverPage/components/waterfall.vue new file mode 100644 index 0000000..0365e3b --- /dev/null +++ b/src/views/community/coverPage/components/waterfall.vue @@ -0,0 +1,26 @@ + + + diff --git a/src/views/community/coverPage/detail.vue b/src/views/community/coverPage/detail.vue new file mode 100644 index 0000000..3fc14b7 --- /dev/null +++ b/src/views/community/coverPage/detail.vue @@ -0,0 +1,272 @@ + + + + diff --git a/src/views/community/coverPage/index.vue b/src/views/community/coverPage/index.vue new file mode 100644 index 0000000..73ff1a6 --- /dev/null +++ b/src/views/community/coverPage/index.vue @@ -0,0 +1,99 @@ + + + + diff --git a/src/views/community/coverPage/preview.vue b/src/views/community/coverPage/preview.vue new file mode 100644 index 0000000..6d62dfa --- /dev/null +++ b/src/views/community/coverPage/preview.vue @@ -0,0 +1,325 @@ + + + + + diff --git a/src/views/community/coverPage/utils/getVideoInfo.ts b/src/views/community/coverPage/utils/getVideoInfo.ts new file mode 100644 index 0000000..0f16de9 --- /dev/null +++ b/src/views/community/coverPage/utils/getVideoInfo.ts @@ -0,0 +1,103 @@ +import { ref, onUnmounted, computed, nextTick } from 'vue'; +import { useRoute, RouteLocationNormalizedLoaded, useRouter } from 'vue-router'; +import VideoApi from '@/service/video'; +import { useUserStore } from '@/stores/user'; +import { addVideoHistory } from '@/utils/index'; +import { HistoryVideoType } from '@/enums/app'; + +export default () => { + const dataKey = 'coverDetail_'; + const info = ref({}); + const router = useRouter(); + let videoID = ''; + const getData = (_route?: RouteLocationNormalizedLoaded) => { + const route = _route || useRoute(); + videoID = (route.query.id || '') as string; + if (!videoID) return; + VideoApi.queryVideoInfo({ videoID }).then((res) => { + info.value = res as Types.Video.VInfosItem; + info.value.freeTime = info.value.freeTime === 0 ? 8 : info.value.freeTime; + // if (info.value.seriesCover.length && route.query.index) { + // info.value.seriesCover.unshift(info.value.seriesCover.splice(Number(route.query.index), 1)[0]); + // } + // 添加浏览记录 + addVideoHistory(info.value, HistoryVideoType.IMG, new Date().getTime()); + }); + }; + + const clearData = () => { + onUnmounted(() => { + sessionStorage.removeItem(dataKey + videoID); + }); + }; + + function setValue(obj: Types.Video.VInfosItem, key: string, value: any) { + const keys = key.split('.'); + + keys.reduce((acc, currentKey, index) => { + if (index === keys.length - 1) { + acc[currentKey] = value; + } else if (acc && typeof acc === 'object' && currentKey in acc) { + return acc[currentKey]; + } else { + acc[currentKey] = {}; + return acc[currentKey]; + } + }, obj); + } + const actionUpdate = (key: string, value: any) => { + setValue(info.value, key, value); + sessionStorage.setItem(dataKey + videoID, JSON.stringify(info.value)); + }; + + // 支付 + const userStore = useUserStore(); + const PayType = computed(() => { + const { freeArea, vidStatus, originCoins } = info.value; + let isType; + // 免费/购买 + if (freeArea || vidStatus?.hasPaid) { + isType = 'free'; + return isType; + } + if (info.value.seriesCover?.length <= 8) { + isType = 'free'; + return isType; + } + if (originCoins == 0 && !freeArea && userStore.userInfo.vipLevel) { + isType = 'free'; + return isType; + } + if (originCoins == 0 && !freeArea && !userStore.userInfo.vipLevel) { + isType = 'vip'; + return isType; + } + if (originCoins > 0 && !freeArea) { + if (userStore.userInfo.vipLevel <= 1) { + isType = 'gold'; + return isType; + } + if (userStore.userInfo.vipLevel >= 2) { + isType = 'free'; + return isType; + } + } + return isType; + }); + const surplus = computed(() => { + if (PayType.value === 'free') return 0; + else { + const total = (info.value.seriesCover || []).length; + // const count = total - 9; + const count = total; + return count < 0 ? 0 : count; + } + }); + const goldBuySuccess = () => { + info.value.vidStatus.hasPaid = true; + nextTick(() => { + router.replace({ path: '/coverPreview', query: { index: 1, id: info.value.id } }); + }); + }; + return { info, getData, clearData, actionUpdate, PayType, surplus, goldBuySuccess }; +}; diff --git a/src/views/community/gameDetails/index.vue b/src/views/community/gameDetails/index.vue new file mode 100644 index 0000000..fdcf15b --- /dev/null +++ b/src/views/community/gameDetails/index.vue @@ -0,0 +1,650 @@ + + + + + diff --git a/src/views/community/gameDetails/introduction.vue b/src/views/community/gameDetails/introduction.vue new file mode 100644 index 0000000..a6561b2 --- /dev/null +++ b/src/views/community/gameDetails/introduction.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/views/community/gameDetails/swiper_slide.vue b/src/views/community/gameDetails/swiper_slide.vue new file mode 100644 index 0000000..4f0951d --- /dev/null +++ b/src/views/community/gameDetails/swiper_slide.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/community/gameTagDetails/index.vue b/src/views/community/gameTagDetails/index.vue new file mode 100644 index 0000000..60dfe86 --- /dev/null +++ b/src/views/community/gameTagDetails/index.vue @@ -0,0 +1,113 @@ + + + + diff --git a/src/views/community/groupChat/index.vue b/src/views/community/groupChat/index.vue new file mode 100644 index 0000000..172b06e --- /dev/null +++ b/src/views/community/groupChat/index.vue @@ -0,0 +1,531 @@ + + + + + + diff --git a/src/views/community/index.vue b/src/views/community/index.vue new file mode 100644 index 0000000..0c87a30 --- /dev/null +++ b/src/views/community/index.vue @@ -0,0 +1,249 @@ + + + + diff --git a/src/views/community/picturePreview/index.vue b/src/views/community/picturePreview/index.vue new file mode 100644 index 0000000..b203b16 --- /dev/null +++ b/src/views/community/picturePreview/index.vue @@ -0,0 +1,94 @@ + + + + diff --git a/src/views/community/postDetail/comment.vue b/src/views/community/postDetail/comment.vue new file mode 100644 index 0000000..1297ed7 --- /dev/null +++ b/src/views/community/postDetail/comment.vue @@ -0,0 +1,504 @@ + + + diff --git a/src/views/community/postDetail/index.vue b/src/views/community/postDetail/index.vue new file mode 100644 index 0000000..eaac5a5 --- /dev/null +++ b/src/views/community/postDetail/index.vue @@ -0,0 +1,1145 @@ + + + + + + diff --git a/src/views/community/publish/components/rule_popup.vue b/src/views/community/publish/components/rule_popup.vue new file mode 100644 index 0000000..7d9bad9 --- /dev/null +++ b/src/views/community/publish/components/rule_popup.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/views/community/publish/components/select_ht.vue b/src/views/community/publish/components/select_ht.vue new file mode 100644 index 0000000..ebfbf3a --- /dev/null +++ b/src/views/community/publish/components/select_ht.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/src/views/community/publish/pubilshImg/index.vue b/src/views/community/publish/pubilshImg/index.vue new file mode 100644 index 0000000..aebbd96 --- /dev/null +++ b/src/views/community/publish/pubilshImg/index.vue @@ -0,0 +1,125 @@ + + + + + + diff --git a/src/views/community/publish/publishGraphics/index.vue b/src/views/community/publish/publishGraphics/index.vue new file mode 100644 index 0000000..3f733dd --- /dev/null +++ b/src/views/community/publish/publishGraphics/index.vue @@ -0,0 +1,165 @@ + + + + + + diff --git a/src/views/community/publish/publishRule/index.vue b/src/views/community/publish/publishRule/index.vue new file mode 100644 index 0000000..f6ea34e --- /dev/null +++ b/src/views/community/publish/publishRule/index.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/views/community/publish/publishVideo/index.vue b/src/views/community/publish/publishVideo/index.vue new file mode 100644 index 0000000..533eeca --- /dev/null +++ b/src/views/community/publish/publishVideo/index.vue @@ -0,0 +1,223 @@ + + + + + + diff --git a/src/views/community/publish/styles/publish.scss b/src/views/community/publish/styles/publish.scss new file mode 100644 index 0000000..bc70bf6 --- /dev/null +++ b/src/views/community/publish/styles/publish.scss @@ -0,0 +1,133 @@ +.publish_box { + width: 100%; + height: 100%; + overflow: hidden; + .content { + height: calc(100vh - 44px); + width: 100%; + padding: 18px 16px calc(140px + constant(safe-area-inset-bottom)) 16px; + padding: 18px 16px calc(140px + env(safe-area-inset-bottom)) 16px; + box-sizing: border-box; + + .changeboxs { + width: 100%; + height: 50px; + padding: 0 12px; + box-sizing: border-box; + background: rgba(255, 255, 255, 0.05); + display: flex; + align-items: center; + justify-content: space-between; + color: #989898; + font-size: 12px; + border-radius: 8px; + span { + margin-left: 4px; + } + svg { + width: 18px; + height: 18px; + } + .info { + flex: 1; + display: flex; + align-items: center; + .avatar { + width: 38px; + height: 38px; + border-radius: 5px; + overflow: hidden; + margin: 0 12px 0 0; + } + .mess { + font-weight: 550; + flex: 1; + height: 38px; + display: flex; + flex-direction: column; + justify-content: space-around; + font-size: 14px; + color: #fff; + } + } + } + + .titleText { + margin-top: 12px; + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + font-size: 12px; + :deep(.van-field__control) { + color: #fff; + overflow: hidden; + } + ::placeholder { + color: #525252; + } + } + :deep(.van-cell::after) { + border-bottom: solid 1px transparent !important; + } + .subTitle { + margin: 18px 0 14px 0; + display: flex; + align-items: flex-end; + font-weight: bold; + font-size: 18px; + span { + font-weight: normal; + padding-left: 10px; + box-sizing: border-box; + font-size: 12px; + color: #525252; + } + } + .video_wrap{ + display: flex; + :deep(.upload-img) { + margin-right: 12px; + } + } + .setPrice { + background: rgba(255, 255, 255, 0.05); + border-radius: 5px; + font-size: 12px; + width: 100%; + height: 50px; + margin-top: 16px; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 16px; + color: #989898; + .price_icon { + width: 24px; + height: 24px; + margin-right: 6px; + } + svg { + width: 16px; + height: 16px; + margin-left: 3px; + } + span { + color: #F68804; + } + } + .btnbox { + width: 100%; + height: 64px; + position: fixed; + bottom: constant(safe-area-inset-bottom); + bottom: env(safe-area-inset-bottom); + left: 0; + padding: 0 40px; + box-sizing: border-box; + .btn { + height: 44px; + border-radius: 3px; + background: #F68804; + } + } + } +} diff --git a/src/views/community/publish/topicMore/index.vue b/src/views/community/publish/topicMore/index.vue new file mode 100644 index 0000000..058748f --- /dev/null +++ b/src/views/community/publish/topicMore/index.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/src/views/community/rankingList/components/item.vue b/src/views/community/rankingList/components/item.vue new file mode 100644 index 0000000..509ecfe --- /dev/null +++ b/src/views/community/rankingList/components/item.vue @@ -0,0 +1,364 @@ + + + + + diff --git a/src/views/community/rankingList/components/list.vue b/src/views/community/rankingList/components/list.vue new file mode 100644 index 0000000..fa5296b --- /dev/null +++ b/src/views/community/rankingList/components/list.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/views/community/rankingList/index.vue b/src/views/community/rankingList/index.vue new file mode 100644 index 0000000..0f07caf --- /dev/null +++ b/src/views/community/rankingList/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/views/community/tabPage/tabItem-chat.vue b/src/views/community/tabPage/tabItem-chat.vue new file mode 100644 index 0000000..641417d --- /dev/null +++ b/src/views/community/tabPage/tabItem-chat.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/src/views/community/tabPage/tabItem-community.vue b/src/views/community/tabPage/tabItem-community.vue new file mode 100644 index 0000000..e456e7d --- /dev/null +++ b/src/views/community/tabPage/tabItem-community.vue @@ -0,0 +1,137 @@ + + + diff --git a/src/views/community/tabPage/tabItem-game.vue b/src/views/community/tabPage/tabItem-game.vue new file mode 100644 index 0000000..1b138e0 --- /dev/null +++ b/src/views/community/tabPage/tabItem-game.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/views/community/tabPage/tabItem-seek.vue b/src/views/community/tabPage/tabItem-seek.vue new file mode 100644 index 0000000..0927afe --- /dev/null +++ b/src/views/community/tabPage/tabItem-seek.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/community/userInfo/components/comment.vue b/src/views/community/userInfo/components/comment.vue new file mode 100644 index 0000000..14d1f1c --- /dev/null +++ b/src/views/community/userInfo/components/comment.vue @@ -0,0 +1,82 @@ + + + + diff --git a/src/views/community/userInfo/components/common.scss b/src/views/community/userInfo/components/common.scss new file mode 100644 index 0000000..9166988 --- /dev/null +++ b/src/views/community/userInfo/components/common.scss @@ -0,0 +1,22 @@ +.userInfo-tab-wrap { + height: 100%; +} +.type-box { + position: absolute; + top: 14px; + right: 10px; + z-index: 3; + color: #ccc; + font-size: 12px; + .active { + color: #3476ff; + font-weight: 500; + } + span:not(:last-child) { + &::after { + content: '/'; + color: #ccc; + margin: 0 8px; + } + } +} diff --git a/src/views/community/userInfo/components/like.vue b/src/views/community/userInfo/components/like.vue new file mode 100644 index 0000000..9f1235a --- /dev/null +++ b/src/views/community/userInfo/components/like.vue @@ -0,0 +1,157 @@ + + + + diff --git a/src/views/community/userInfo/components/post.vue b/src/views/community/userInfo/components/post.vue new file mode 100644 index 0000000..b152aeb --- /dev/null +++ b/src/views/community/userInfo/components/post.vue @@ -0,0 +1,127 @@ + + + + diff --git a/src/views/community/userInfo/index.vue b/src/views/community/userInfo/index.vue new file mode 100644 index 0000000..45953fd --- /dev/null +++ b/src/views/community/userInfo/index.vue @@ -0,0 +1,555 @@ + + + + diff --git a/src/views/community/userInfo/postItem.vue b/src/views/community/userInfo/postItem.vue new file mode 100644 index 0000000..fc08ea6 --- /dev/null +++ b/src/views/community/userInfo/postItem.vue @@ -0,0 +1,125 @@ + + + diff --git a/src/views/community/userInfo/video.vue b/src/views/community/userInfo/video.vue new file mode 100644 index 0000000..d25146c --- /dev/null +++ b/src/views/community/userInfo/video.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/views/community/videoInfo/index.vue b/src/views/community/videoInfo/index.vue new file mode 100644 index 0000000..163c3e4 --- /dev/null +++ b/src/views/community/videoInfo/index.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/src/views/darkNet/components/Item.vue b/src/views/darkNet/components/Item.vue new file mode 100644 index 0000000..ab47d92 --- /dev/null +++ b/src/views/darkNet/components/Item.vue @@ -0,0 +1,158 @@ + + + diff --git a/src/views/darkNet/components/darkNetItem.vue b/src/views/darkNet/components/darkNetItem.vue new file mode 100644 index 0000000..c5a90a5 --- /dev/null +++ b/src/views/darkNet/components/darkNetItem.vue @@ -0,0 +1,189 @@ + + + diff --git a/src/views/darkNet/index.vue b/src/views/darkNet/index.vue new file mode 100644 index 0000000..391b3c1 --- /dev/null +++ b/src/views/darkNet/index.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/src/views/entertainment/index.vue b/src/views/entertainment/index.vue new file mode 100644 index 0000000..ad1f167 --- /dev/null +++ b/src/views/entertainment/index.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/views/jointGamingActivitie/components/Gags.vue b/src/views/jointGamingActivitie/components/Gags.vue new file mode 100644 index 0000000..ea7b2d4 --- /dev/null +++ b/src/views/jointGamingActivitie/components/Gags.vue @@ -0,0 +1,71 @@ + + + + + \ No newline at end of file diff --git a/src/views/jointGamingActivitie/components/gameScreenshot.vue b/src/views/jointGamingActivitie/components/gameScreenshot.vue new file mode 100644 index 0000000..35fca5c --- /dev/null +++ b/src/views/jointGamingActivitie/components/gameScreenshot.vue @@ -0,0 +1,87 @@ + + + + + \ No newline at end of file diff --git a/src/views/jointGamingActivitie/components/groupBuy.vue b/src/views/jointGamingActivitie/components/groupBuy.vue new file mode 100644 index 0000000..135b197 --- /dev/null +++ b/src/views/jointGamingActivitie/components/groupBuy.vue @@ -0,0 +1,330 @@ + + + + + diff --git a/src/views/jointGamingActivitie/components/interval.vue b/src/views/jointGamingActivitie/components/interval.vue new file mode 100644 index 0000000..576262f --- /dev/null +++ b/src/views/jointGamingActivitie/components/interval.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/src/views/jointGamingActivitie/components/previewVideo.vue b/src/views/jointGamingActivitie/components/previewVideo.vue new file mode 100644 index 0000000..24ddf46 --- /dev/null +++ b/src/views/jointGamingActivitie/components/previewVideo.vue @@ -0,0 +1,60 @@ + + + + + \ No newline at end of file diff --git a/src/views/jointGamingActivitie/components/showBlindbox.vue b/src/views/jointGamingActivitie/components/showBlindbox.vue new file mode 100644 index 0000000..32c0c64 --- /dev/null +++ b/src/views/jointGamingActivitie/components/showBlindbox.vue @@ -0,0 +1,61 @@ + + + + + \ No newline at end of file diff --git a/src/views/jointGamingActivitie/index.vue b/src/views/jointGamingActivitie/index.vue new file mode 100644 index 0000000..4c1827e --- /dev/null +++ b/src/views/jointGamingActivitie/index.vue @@ -0,0 +1,224 @@ + + + + + + diff --git a/src/views/lldfreeBenefits/components/RedeemSuccessPopup.vue b/src/views/lldfreeBenefits/components/RedeemSuccessPopup.vue new file mode 100644 index 0000000..4f64493 --- /dev/null +++ b/src/views/lldfreeBenefits/components/RedeemSuccessPopup.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/src/views/lldfreeBenefits/components/SevenSignRewardPopup.vue b/src/views/lldfreeBenefits/components/SevenSignRewardPopup.vue new file mode 100644 index 0000000..bf341a7 --- /dev/null +++ b/src/views/lldfreeBenefits/components/SevenSignRewardPopup.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/views/lldfreeBenefits/components/WorkSignPopup.vue b/src/views/lldfreeBenefits/components/WorkSignPopup.vue new file mode 100644 index 0000000..563dedb --- /dev/null +++ b/src/views/lldfreeBenefits/components/WorkSignPopup.vue @@ -0,0 +1,337 @@ + + + + + + \ No newline at end of file diff --git a/src/views/lldfreeBenefits/components/agent.vue b/src/views/lldfreeBenefits/components/agent.vue new file mode 100644 index 0000000..5761e98 --- /dev/null +++ b/src/views/lldfreeBenefits/components/agent.vue @@ -0,0 +1,347 @@ + + + diff --git a/src/views/lldfreeBenefits/components/app.vue b/src/views/lldfreeBenefits/components/app.vue new file mode 100644 index 0000000..6c58e39 --- /dev/null +++ b/src/views/lldfreeBenefits/components/app.vue @@ -0,0 +1,201 @@ + + + + diff --git a/src/views/lldfreeBenefits/components/application.vue b/src/views/lldfreeBenefits/components/application.vue new file mode 100644 index 0000000..c9b5f77 --- /dev/null +++ b/src/views/lldfreeBenefits/components/application.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/views/lldfreeBenefits/components/game.vue b/src/views/lldfreeBenefits/components/game.vue new file mode 100644 index 0000000..6bd4169 --- /dev/null +++ b/src/views/lldfreeBenefits/components/game.vue @@ -0,0 +1,125 @@ + + + + diff --git a/src/views/lldfreeBenefits/components/task.vue b/src/views/lldfreeBenefits/components/task.vue new file mode 100644 index 0000000..3c5c96c --- /dev/null +++ b/src/views/lldfreeBenefits/components/task.vue @@ -0,0 +1,2029 @@ + + + diff --git a/src/views/lldfreeBenefits/index.vue b/src/views/lldfreeBenefits/index.vue new file mode 100644 index 0000000..1b2f43c --- /dev/null +++ b/src/views/lldfreeBenefits/index.vue @@ -0,0 +1,101 @@ + + + + diff --git a/src/views/lldfreeBenefits/promotionData/index.vue b/src/views/lldfreeBenefits/promotionData/index.vue new file mode 100644 index 0000000..7953a97 --- /dev/null +++ b/src/views/lldfreeBenefits/promotionData/index.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/views/lldfreeBenefits/promotionDetails/index.vue b/src/views/lldfreeBenefits/promotionDetails/index.vue new file mode 100644 index 0000000..fdad236 --- /dev/null +++ b/src/views/lldfreeBenefits/promotionDetails/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/src/views/lldfreeBenefits/record.vue b/src/views/lldfreeBenefits/record.vue new file mode 100644 index 0000000..22fb537 --- /dev/null +++ b/src/views/lldfreeBenefits/record.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/views/lldfreeBenefits/task_sign_day.vue b/src/views/lldfreeBenefits/task_sign_day.vue new file mode 100644 index 0000000..fe239f6 --- /dev/null +++ b/src/views/lldfreeBenefits/task_sign_day.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/src/views/lldfreeBenefits/vidDiscount/components/list.vue b/src/views/lldfreeBenefits/vidDiscount/components/list.vue new file mode 100644 index 0000000..5dcfa45 --- /dev/null +++ b/src/views/lldfreeBenefits/vidDiscount/components/list.vue @@ -0,0 +1,123 @@ + + + + diff --git a/src/views/lldfreeBenefits/vidDiscount/index.vue b/src/views/lldfreeBenefits/vidDiscount/index.vue new file mode 100644 index 0000000..b90d505 --- /dev/null +++ b/src/views/lldfreeBenefits/vidDiscount/index.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/views/lldhome/components/HomeItem.vue b/src/views/lldhome/components/HomeItem.vue new file mode 100644 index 0000000..8914707 --- /dev/null +++ b/src/views/lldhome/components/HomeItem.vue @@ -0,0 +1,471 @@ + + + diff --git a/src/views/lldhome/components/Item.vue b/src/views/lldhome/components/Item.vue new file mode 100644 index 0000000..9cc8f6f --- /dev/null +++ b/src/views/lldhome/components/Item.vue @@ -0,0 +1,285 @@ + + + diff --git a/src/views/lldhome/components/Newest.vue b/src/views/lldhome/components/Newest.vue new file mode 100644 index 0000000..fe4b7aa --- /dev/null +++ b/src/views/lldhome/components/Newest.vue @@ -0,0 +1,201 @@ + + + diff --git a/src/views/lldhome/index.vue b/src/views/lldhome/index.vue new file mode 100644 index 0000000..fea74a6 --- /dev/null +++ b/src/views/lldhome/index.vue @@ -0,0 +1,354 @@ + + + + diff --git a/src/views/lldhome/lotteryPage/index.vue b/src/views/lldhome/lotteryPage/index.vue new file mode 100644 index 0000000..0985a91 --- /dev/null +++ b/src/views/lldhome/lotteryPage/index.vue @@ -0,0 +1,49 @@ + + + diff --git a/src/views/lldhome/moreActress/index.vue b/src/views/lldhome/moreActress/index.vue new file mode 100644 index 0000000..8a21dc7 --- /dev/null +++ b/src/views/lldhome/moreActress/index.vue @@ -0,0 +1,133 @@ + + + + diff --git a/src/views/lldhome/moreCate/index.vue b/src/views/lldhome/moreCate/index.vue new file mode 100644 index 0000000..961b91f --- /dev/null +++ b/src/views/lldhome/moreCate/index.vue @@ -0,0 +1,398 @@ + + + + + diff --git a/src/views/lldhome/movie/details.vue b/src/views/lldhome/movie/details.vue new file mode 100644 index 0000000..e7c5050 --- /dev/null +++ b/src/views/lldhome/movie/details.vue @@ -0,0 +1,1283 @@ + + + + diff --git a/src/views/lldhome/movie/introduction.vue b/src/views/lldhome/movie/introduction.vue new file mode 100644 index 0000000..4de5c17 --- /dev/null +++ b/src/views/lldhome/movie/introduction.vue @@ -0,0 +1,333 @@ + + + diff --git a/src/views/lldhome/searchPage/index.vue b/src/views/lldhome/searchPage/index.vue new file mode 100644 index 0000000..a82bd55 --- /dev/null +++ b/src/views/lldhome/searchPage/index.vue @@ -0,0 +1,402 @@ + + + + diff --git a/src/views/lldhome/searchPage/rank.vue b/src/views/lldhome/searchPage/rank.vue new file mode 100644 index 0000000..9e4c410 --- /dev/null +++ b/src/views/lldhome/searchPage/rank.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/views/lldhome/searchPage/video.vue b/src/views/lldhome/searchPage/video.vue new file mode 100644 index 0000000..ae9703c --- /dev/null +++ b/src/views/lldhome/searchPage/video.vue @@ -0,0 +1,130 @@ + + + diff --git a/src/views/lldhome/searchResults/components/movieItem.vue b/src/views/lldhome/searchResults/components/movieItem.vue new file mode 100644 index 0000000..7e1d500 --- /dev/null +++ b/src/views/lldhome/searchResults/components/movieItem.vue @@ -0,0 +1,132 @@ + + + diff --git a/src/views/lldhome/searchResults/components/otherItem.vue b/src/views/lldhome/searchResults/components/otherItem.vue new file mode 100644 index 0000000..31b0b59 --- /dev/null +++ b/src/views/lldhome/searchResults/components/otherItem.vue @@ -0,0 +1,180 @@ + + + diff --git a/src/views/lldhome/searchResults/index.vue b/src/views/lldhome/searchResults/index.vue new file mode 100644 index 0000000..1557a47 --- /dev/null +++ b/src/views/lldhome/searchResults/index.vue @@ -0,0 +1,287 @@ + + + + diff --git a/src/views/lldhome/searchResults/media.vue b/src/views/lldhome/searchResults/media.vue new file mode 100644 index 0000000..8d96a0b --- /dev/null +++ b/src/views/lldhome/searchResults/media.vue @@ -0,0 +1,141 @@ + + + diff --git a/src/views/lldhome/searchResults/movie.vue b/src/views/lldhome/searchResults/movie.vue new file mode 100644 index 0000000..1855291 --- /dev/null +++ b/src/views/lldhome/searchResults/movie.vue @@ -0,0 +1,195 @@ + + + diff --git a/src/views/lldhome/searchResults/postList.vue b/src/views/lldhome/searchResults/postList.vue new file mode 100644 index 0000000..d1e5b88 --- /dev/null +++ b/src/views/lldhome/searchResults/postList.vue @@ -0,0 +1,116 @@ + + + diff --git a/src/views/lldhome/searchResults/shortVideo.vue b/src/views/lldhome/searchResults/shortVideo.vue new file mode 100644 index 0000000..86dec06 --- /dev/null +++ b/src/views/lldhome/searchResults/shortVideo.vue @@ -0,0 +1,197 @@ + + + diff --git a/src/views/lldhome/shortVideoDetails/index.vue b/src/views/lldhome/shortVideoDetails/index.vue new file mode 100644 index 0000000..f270ab9 --- /dev/null +++ b/src/views/lldhome/shortVideoDetails/index.vue @@ -0,0 +1,330 @@ + + + + diff --git a/src/views/lldhome/tagShortVideo/index.vue b/src/views/lldhome/tagShortVideo/index.vue new file mode 100644 index 0000000..97fc8c9 --- /dev/null +++ b/src/views/lldhome/tagShortVideo/index.vue @@ -0,0 +1,154 @@ + + + + diff --git a/src/views/lldhome/tagShortVideo/videoItem.vue b/src/views/lldhome/tagShortVideo/videoItem.vue new file mode 100644 index 0000000..d587aed --- /dev/null +++ b/src/views/lldhome/tagShortVideo/videoItem.vue @@ -0,0 +1,140 @@ + + + diff --git a/src/views/lldhome/tagVideoList/acgItem.vue b/src/views/lldhome/tagVideoList/acgItem.vue new file mode 100644 index 0000000..be4c053 --- /dev/null +++ b/src/views/lldhome/tagVideoList/acgItem.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/views/lldhome/tagVideoList/index.vue b/src/views/lldhome/tagVideoList/index.vue new file mode 100644 index 0000000..e3ee711 --- /dev/null +++ b/src/views/lldhome/tagVideoList/index.vue @@ -0,0 +1,113 @@ + + + + diff --git a/src/views/lldhome/tagVideoList/shortItem.vue b/src/views/lldhome/tagVideoList/shortItem.vue new file mode 100644 index 0000000..ed6240e --- /dev/null +++ b/src/views/lldhome/tagVideoList/shortItem.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/views/lldhome/tagVideoList/videoItem.vue b/src/views/lldhome/tagVideoList/videoItem.vue new file mode 100644 index 0000000..47ad48c --- /dev/null +++ b/src/views/lldhome/tagVideoList/videoItem.vue @@ -0,0 +1,138 @@ + + + diff --git a/src/views/lldlive/assets/style.scss b/src/views/lldlive/assets/style.scss new file mode 100644 index 0000000..3057345 --- /dev/null +++ b/src/views/lldlive/assets/style.scss @@ -0,0 +1,10 @@ +.item, +.cover-item { + > .cover { + width: 100%; + height: 100%; + :deep(img) { + object-fit: cover; + } + } +} diff --git a/src/views/lldlive/components/recom-list.vue b/src/views/lldlive/components/recom-list.vue new file mode 100644 index 0000000..674b399 --- /dev/null +++ b/src/views/lldlive/components/recom-list.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/lldlive/components/status.vue b/src/views/lldlive/components/status.vue new file mode 100644 index 0000000..eb7ce23 --- /dev/null +++ b/src/views/lldlive/components/status.vue @@ -0,0 +1,35 @@ + + + diff --git a/src/views/lldlive/components/tabPage/live-item-0.vue b/src/views/lldlive/components/tabPage/live-item-0.vue new file mode 100644 index 0000000..3b17bc2 --- /dev/null +++ b/src/views/lldlive/components/tabPage/live-item-0.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/views/lldlive/components/tabPage/live-item-1.vue b/src/views/lldlive/components/tabPage/live-item-1.vue new file mode 100644 index 0000000..47fbae0 --- /dev/null +++ b/src/views/lldlive/components/tabPage/live-item-1.vue @@ -0,0 +1,107 @@ + + + diff --git a/src/views/lldlive/components/tabPage/liveType/four_grid.vue b/src/views/lldlive/components/tabPage/liveType/four_grid.vue new file mode 100644 index 0000000..a43833b --- /dev/null +++ b/src/views/lldlive/components/tabPage/liveType/four_grid.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/views/lldlive/components/tabPage/liveType/horizontal_slide.vue b/src/views/lldlive/components/tabPage/liveType/horizontal_slide.vue new file mode 100644 index 0000000..3a2bf46 --- /dev/null +++ b/src/views/lldlive/components/tabPage/liveType/horizontal_slide.vue @@ -0,0 +1,132 @@ + + + diff --git a/src/views/lldlive/components/tabPage/liveType/icon-byte.vue b/src/views/lldlive/components/tabPage/liveType/icon-byte.vue new file mode 100644 index 0000000..59f3d38 --- /dev/null +++ b/src/views/lldlive/components/tabPage/liveType/icon-byte.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/views/lldlive/components/tabPage/liveType/list.vue b/src/views/lldlive/components/tabPage/liveType/list.vue new file mode 100644 index 0000000..aa194c0 --- /dev/null +++ b/src/views/lldlive/components/tabPage/liveType/list.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/lldlive/components/tabPage/liveType/nine_grid.vue b/src/views/lldlive/components/tabPage/liveType/nine_grid.vue new file mode 100644 index 0000000..e6ad8fa --- /dev/null +++ b/src/views/lldlive/components/tabPage/liveType/nine_grid.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/views/lldlive/components/tabPage/liveType/six_grid.vue b/src/views/lldlive/components/tabPage/liveType/six_grid.vue new file mode 100644 index 0000000..841acff --- /dev/null +++ b/src/views/lldlive/components/tabPage/liveType/six_grid.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/views/lldlive/components/tabPage/liveType/six_round.vue b/src/views/lldlive/components/tabPage/liveType/six_round.vue new file mode 100644 index 0000000..014a763 --- /dev/null +++ b/src/views/lldlive/components/tabPage/liveType/six_round.vue @@ -0,0 +1,129 @@ + + + diff --git a/src/views/lldlive/components/tabPage/tabItem-live.vue b/src/views/lldlive/components/tabPage/tabItem-live.vue new file mode 100644 index 0000000..94c4862 --- /dev/null +++ b/src/views/lldlive/components/tabPage/tabItem-live.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/views/lldlive/components/video.vue b/src/views/lldlive/components/video.vue new file mode 100644 index 0000000..ead6a4c --- /dev/null +++ b/src/views/lldlive/components/video.vue @@ -0,0 +1,157 @@ + + + diff --git a/src/views/lldlive/index.vue b/src/views/lldlive/index.vue new file mode 100644 index 0000000..7fdc5bb --- /dev/null +++ b/src/views/lldlive/index.vue @@ -0,0 +1,305 @@ + + + + diff --git a/src/views/lldlive/tabPage.vue b/src/views/lldlive/tabPage.vue new file mode 100644 index 0000000..d58a28f --- /dev/null +++ b/src/views/lldlive/tabPage.vue @@ -0,0 +1,63 @@ + + + + diff --git a/src/views/lldlive/utils/comment.ts b/src/views/lldlive/utils/comment.ts new file mode 100644 index 0000000..504e975 --- /dev/null +++ b/src/views/lldlive/utils/comment.ts @@ -0,0 +1,6 @@ +import router from '@/router'; +const goLiveRoom = (id: string, name: string) => { + router[router.currentRoute.value.name === 'liveRoom' ? 'replace' : 'push']({ path: 'liveRoom', query: { id, name } }); +}; + +export { goLiveRoom }; diff --git a/src/views/lldmine/accountCertificate/index.vue b/src/views/lldmine/accountCertificate/index.vue new file mode 100644 index 0000000..fbf12aa --- /dev/null +++ b/src/views/lldmine/accountCertificate/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/views/lldmine/aiGirlFriend/index.vue b/src/views/lldmine/aiGirlFriend/index.vue new file mode 100644 index 0000000..a8d0fa0 --- /dev/null +++ b/src/views/lldmine/aiGirlFriend/index.vue @@ -0,0 +1,382 @@ + + + diff --git a/src/views/lldmine/aiGirlFriend/web.vue b/src/views/lldmine/aiGirlFriend/web.vue new file mode 100644 index 0000000..8f36125 --- /dev/null +++ b/src/views/lldmine/aiGirlFriend/web.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/src/views/lldmine/aiRecord/aiChangeImgFaceList.vue b/src/views/lldmine/aiRecord/aiChangeImgFaceList.vue new file mode 100644 index 0000000..f578d98 --- /dev/null +++ b/src/views/lldmine/aiRecord/aiChangeImgFaceList.vue @@ -0,0 +1,305 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiChangeImgFaceTab.vue b/src/views/lldmine/aiRecord/aiChangeImgFaceTab.vue new file mode 100644 index 0000000..225080a --- /dev/null +++ b/src/views/lldmine/aiRecord/aiChangeImgFaceTab.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiChangeVideoFaceList.vue b/src/views/lldmine/aiRecord/aiChangeVideoFaceList.vue new file mode 100644 index 0000000..f4d3400 --- /dev/null +++ b/src/views/lldmine/aiRecord/aiChangeVideoFaceList.vue @@ -0,0 +1,308 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiChangeVideoFaceTab.vue b/src/views/lldmine/aiRecord/aiChangeVideoFaceTab.vue new file mode 100644 index 0000000..a1d6e8a --- /dev/null +++ b/src/views/lldmine/aiRecord/aiChangeVideoFaceTab.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiImgToVidList.vue b/src/views/lldmine/aiRecord/aiImgToVidList.vue new file mode 100644 index 0000000..7cf7278 --- /dev/null +++ b/src/views/lldmine/aiRecord/aiImgToVidList.vue @@ -0,0 +1,277 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiImgToVidListTab.vue b/src/views/lldmine/aiRecord/aiImgToVidListTab.vue new file mode 100644 index 0000000..90fa088 --- /dev/null +++ b/src/views/lldmine/aiRecord/aiImgToVidListTab.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiNovelList.vue b/src/views/lldmine/aiRecord/aiNovelList.vue new file mode 100644 index 0000000..4646e01 --- /dev/null +++ b/src/views/lldmine/aiRecord/aiNovelList.vue @@ -0,0 +1,246 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiNovelTab.vue b/src/views/lldmine/aiRecord/aiNovelTab.vue new file mode 100644 index 0000000..a0464c5 --- /dev/null +++ b/src/views/lldmine/aiRecord/aiNovelTab.vue @@ -0,0 +1,92 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiTextCoverList.vue b/src/views/lldmine/aiRecord/aiTextCoverList.vue new file mode 100644 index 0000000..8e3b308 --- /dev/null +++ b/src/views/lldmine/aiRecord/aiTextCoverList.vue @@ -0,0 +1,255 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiTextCoverTab.vue b/src/views/lldmine/aiRecord/aiTextCoverTab.vue new file mode 100644 index 0000000..b3b914e --- /dev/null +++ b/src/views/lldmine/aiRecord/aiTextCoverTab.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiUndressList.vue b/src/views/lldmine/aiRecord/aiUndressList.vue new file mode 100644 index 0000000..4f9721d --- /dev/null +++ b/src/views/lldmine/aiRecord/aiUndressList.vue @@ -0,0 +1,299 @@ + + + diff --git a/src/views/lldmine/aiRecord/aiUndressTab.vue b/src/views/lldmine/aiRecord/aiUndressTab.vue new file mode 100644 index 0000000..2d12fad --- /dev/null +++ b/src/views/lldmine/aiRecord/aiUndressTab.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/views/lldmine/aiRecord/index.vue b/src/views/lldmine/aiRecord/index.vue new file mode 100644 index 0000000..9b9add6 --- /dev/null +++ b/src/views/lldmine/aiRecord/index.vue @@ -0,0 +1,407 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/aiPiazza.vue b/src/views/lldmine/aiUndress/aiPiazza.vue new file mode 100644 index 0000000..d2a0e60 --- /dev/null +++ b/src/views/lldmine/aiUndress/aiPiazza.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/aiText/detail.vue b/src/views/lldmine/aiUndress/aiText/detail.vue new file mode 100644 index 0000000..66fea05 --- /dev/null +++ b/src/views/lldmine/aiUndress/aiText/detail.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/aiText/index.vue b/src/views/lldmine/aiUndress/aiText/index.vue new file mode 100644 index 0000000..f605411 --- /dev/null +++ b/src/views/lldmine/aiUndress/aiText/index.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/changeDetail.vue b/src/views/lldmine/aiUndress/changeDetail.vue new file mode 100644 index 0000000..0d8b60b --- /dev/null +++ b/src/views/lldmine/aiUndress/changeDetail.vue @@ -0,0 +1,628 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/changeFaceImage.vue b/src/views/lldmine/aiUndress/changeFaceImage.vue new file mode 100644 index 0000000..d1e470c --- /dev/null +++ b/src/views/lldmine/aiUndress/changeFaceImage.vue @@ -0,0 +1,327 @@ + + + diff --git a/src/views/lldmine/aiUndress/changeFaceVideo.vue b/src/views/lldmine/aiUndress/changeFaceVideo.vue new file mode 100644 index 0000000..2880297 --- /dev/null +++ b/src/views/lldmine/aiUndress/changeFaceVideo.vue @@ -0,0 +1,359 @@ + + + diff --git a/src/views/lldmine/aiUndress/components/AiMediaBoxItem.vue b/src/views/lldmine/aiUndress/components/AiMediaBoxItem.vue new file mode 100644 index 0000000..76d1983 --- /dev/null +++ b/src/views/lldmine/aiUndress/components/AiMediaBoxItem.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/components/aiCard.vue b/src/views/lldmine/aiUndress/components/aiCard.vue new file mode 100644 index 0000000..50a5bd7 --- /dev/null +++ b/src/views/lldmine/aiUndress/components/aiCard.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/components/error_pop.vue b/src/views/lldmine/aiUndress/components/error_pop.vue new file mode 100644 index 0000000..ddc9d64 --- /dev/null +++ b/src/views/lldmine/aiUndress/components/error_pop.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/components/share_box.vue b/src/views/lldmine/aiUndress/components/share_box.vue new file mode 100644 index 0000000..8ba3fa6 --- /dev/null +++ b/src/views/lldmine/aiUndress/components/share_box.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/compress.ts b/src/views/lldmine/aiUndress/compress.ts new file mode 100644 index 0000000..9451f93 --- /dev/null +++ b/src/views/lldmine/aiUndress/compress.ts @@ -0,0 +1,64 @@ +//将base64转换为文件对象 +const convertBase64ToBlob = (base64: any) => { + const base64Arr = base64.split(','); + let imgtype = ''; + let base64String = ''; + if (base64Arr.length > 1) { + //如果是图片base64,去掉头信息 + base64String = base64Arr[1]; + imgtype = base64Arr[0].substring(base64Arr[0].indexOf(':') + 1, base64Arr[0].indexOf(';')); + } + // 将base64解码 + const bytes = atob(base64String); + //var bytes = base64; + const bytesCode = new ArrayBuffer(bytes.length); + // 转换为类型化数组 + const byteArray = new Uint8Array(bytesCode); + + // 将base64转换为ascii码 + for (let i = 0; i < bytes.length; i++) { + byteArray[i] = bytes.charCodeAt(i); + } + // 生成Blob对象(文件对象) + return new Blob([bytesCode], { type: imgtype }); +}; +// 压缩图片 +const compress = (file: any) => { + if (!file || !window.FileReader) return; + if (/^image/.test(file.type)) { + const reader = new FileReader(); + reader.readAsDataURL(file); + return new Promise((resolve) => { + reader.onloadend = function () { + const result: any = reader.result; + const img: any = new Image(); + img.src = result; + if (result.length <= 200 * 1024) { + const blob = convertBase64ToBlob(result); + const files = new File([blob], file.name, { type: blob.type }); + resolve(files); + return; + } + img.onload = function () { + const canvas = document.createElement('canvas'); + const ctx: any = canvas.getContext('2d'); + const width = img.width; + const height = img.height; + canvas.width = width; + canvas.height = height; + // 铺底色 + ctx.fillStyle = '#fff'; + ctx.fillRect(0, 0, canvas.width, canvas.height); + ctx.drawImage(img, 0, 0, width, height); + //进行最小压缩 + const ndata = canvas.toDataURL('image/jpeg', 0.3); + const blob = convertBase64ToBlob(ndata); + const files = new File([blob], file.name, { type: blob.type }); + resolve(files); + }; + }; + }); + } +}; + +export default compress; diff --git a/src/views/lldmine/aiUndress/graffiti2/index.ts b/src/views/lldmine/aiUndress/graffiti2/index.ts new file mode 100644 index 0000000..264f201 --- /dev/null +++ b/src/views/lldmine/aiUndress/graffiti2/index.ts @@ -0,0 +1,29 @@ +let graffiti = { + name: '', + path: '', + maskPic: [], + maskPicBase64: '', +} as { + name: string; + path: string; + maskPic: any[]; + maskPicBase64: string; + [key: string]: any; +}; + +const setGraffiti = (obj: any) => { + for (const [key, value] of Object.entries(obj)) { + graffiti[key] = value; + } +}; + +const resetGraffiti = () => { + graffiti = { + name: '', + path: '', + maskPic: [], + maskPicBase64: '', + }; +}; + +export { graffiti, setGraffiti, resetGraffiti }; diff --git a/src/views/lldmine/aiUndress/graffiti2/index.vue b/src/views/lldmine/aiUndress/graffiti2/index.vue new file mode 100644 index 0000000..e7beeac --- /dev/null +++ b/src/views/lldmine/aiUndress/graffiti2/index.vue @@ -0,0 +1,388 @@ + + + + + + diff --git a/src/views/lldmine/aiUndress/index.vue b/src/views/lldmine/aiUndress/index.vue new file mode 100644 index 0000000..f119083 --- /dev/null +++ b/src/views/lldmine/aiUndress/index.vue @@ -0,0 +1,223 @@ + + + + diff --git a/src/views/lldmine/aiUndress/index2.vue b/src/views/lldmine/aiUndress/index2.vue new file mode 100644 index 0000000..85a32bf --- /dev/null +++ b/src/views/lldmine/aiUndress/index2.vue @@ -0,0 +1,221 @@ + + + + + + diff --git a/src/views/lldmine/aiUndress/index2Draw.vue b/src/views/lldmine/aiUndress/index2Draw.vue new file mode 100644 index 0000000..b56d94c --- /dev/null +++ b/src/views/lldmine/aiUndress/index2Draw.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/picture2Video.vue b/src/views/lldmine/aiUndress/picture2Video.vue new file mode 100644 index 0000000..8b5e59a --- /dev/null +++ b/src/views/lldmine/aiUndress/picture2Video.vue @@ -0,0 +1,374 @@ + + + diff --git a/src/views/lldmine/aiUndress/pictureVideoList.vue b/src/views/lldmine/aiUndress/pictureVideoList.vue new file mode 100644 index 0000000..cdc020b --- /dev/null +++ b/src/views/lldmine/aiUndress/pictureVideoList.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/lldmine/aiUndress/textCover.vue b/src/views/lldmine/aiUndress/textCover.vue new file mode 100644 index 0000000..e96015f --- /dev/null +++ b/src/views/lldmine/aiUndress/textCover.vue @@ -0,0 +1,348 @@ + + + + + diff --git a/src/views/lldmine/aiUndress/undress.vue b/src/views/lldmine/aiUndress/undress.vue new file mode 100644 index 0000000..8140741 --- /dev/null +++ b/src/views/lldmine/aiUndress/undress.vue @@ -0,0 +1,485 @@ + + + diff --git a/src/views/lldmine/bindingCode/index.vue b/src/views/lldmine/bindingCode/index.vue new file mode 100644 index 0000000..8560587 --- /dev/null +++ b/src/views/lldmine/bindingCode/index.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/src/views/lldmine/bindingPhone/index.vue b/src/views/lldmine/bindingPhone/index.vue new file mode 100644 index 0000000..d7ae82c --- /dev/null +++ b/src/views/lldmine/bindingPhone/index.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/views/lldmine/business/index.vue b/src/views/lldmine/business/index.vue new file mode 100644 index 0000000..532b42d --- /dev/null +++ b/src/views/lldmine/business/index.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/views/lldmine/changeAvatar/index.vue b/src/views/lldmine/changeAvatar/index.vue new file mode 100644 index 0000000..50c8385 --- /dev/null +++ b/src/views/lldmine/changeAvatar/index.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/src/views/lldmine/collectVideo/components/GameList.vue b/src/views/lldmine/collectVideo/components/GameList.vue new file mode 100644 index 0000000..d8b5c7a --- /dev/null +++ b/src/views/lldmine/collectVideo/components/GameList.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/src/views/lldmine/collectVideo/components/MangaList.vue b/src/views/lldmine/collectVideo/components/MangaList.vue new file mode 100644 index 0000000..8a5b4d9 --- /dev/null +++ b/src/views/lldmine/collectVideo/components/MangaList.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/views/lldmine/collectVideo/components/MovieList.vue b/src/views/lldmine/collectVideo/components/MovieList.vue new file mode 100644 index 0000000..3ba2271 --- /dev/null +++ b/src/views/lldmine/collectVideo/components/MovieList.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/views/lldmine/collectVideo/components/PostList.vue b/src/views/lldmine/collectVideo/components/PostList.vue new file mode 100644 index 0000000..22796f6 --- /dev/null +++ b/src/views/lldmine/collectVideo/components/PostList.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/views/lldmine/collectVideo/components/ShortnessVideoList.vue b/src/views/lldmine/collectVideo/components/ShortnessVideoList.vue new file mode 100644 index 0000000..bff7c44 --- /dev/null +++ b/src/views/lldmine/collectVideo/components/ShortnessVideoList.vue @@ -0,0 +1,191 @@ + + + + + diff --git a/src/views/lldmine/collectVideo/components/TheatresList.vue b/src/views/lldmine/collectVideo/components/TheatresList.vue new file mode 100644 index 0000000..0854490 --- /dev/null +++ b/src/views/lldmine/collectVideo/components/TheatresList.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/src/views/lldmine/collectVideo/index.vue b/src/views/lldmine/collectVideo/index.vue new file mode 100644 index 0000000..d159303 --- /dev/null +++ b/src/views/lldmine/collectVideo/index.vue @@ -0,0 +1,434 @@ + + + + + diff --git a/src/views/lldmine/components/MineDramaList.vue b/src/views/lldmine/components/MineDramaList.vue new file mode 100644 index 0000000..6e282a8 --- /dev/null +++ b/src/views/lldmine/components/MineDramaList.vue @@ -0,0 +1,187 @@ + + + + + + + diff --git a/src/views/lldmine/customerService/index.vue b/src/views/lldmine/customerService/index.vue new file mode 100644 index 0000000..0041b05 --- /dev/null +++ b/src/views/lldmine/customerService/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/views/lldmine/editNick/index.vue b/src/views/lldmine/editNick/index.vue new file mode 100644 index 0000000..2fd5b36 --- /dev/null +++ b/src/views/lldmine/editNick/index.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/views/lldmine/editNick/index1.vue b/src/views/lldmine/editNick/index1.vue new file mode 100644 index 0000000..04fe20e --- /dev/null +++ b/src/views/lldmine/editNick/index1.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/src/views/lldmine/editSign/index.vue b/src/views/lldmine/editSign/index.vue new file mode 100644 index 0000000..d5c52f2 --- /dev/null +++ b/src/views/lldmine/editSign/index.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/views/lldmine/exchange/index copy.vue b/src/views/lldmine/exchange/index copy.vue new file mode 100644 index 0000000..4265095 --- /dev/null +++ b/src/views/lldmine/exchange/index copy.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/src/views/lldmine/exchange/index.vue b/src/views/lldmine/exchange/index.vue new file mode 100644 index 0000000..fbc339e --- /dev/null +++ b/src/views/lldmine/exchange/index.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/src/views/lldmine/feedback/index.vue b/src/views/lldmine/feedback/index.vue new file mode 100644 index 0000000..46c31e4 --- /dev/null +++ b/src/views/lldmine/feedback/index.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/lldmine/follow/components/postBox.vue b/src/views/lldmine/follow/components/postBox.vue new file mode 100644 index 0000000..d468b7f --- /dev/null +++ b/src/views/lldmine/follow/components/postBox.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/views/lldmine/follow/components/userBox-copy.vue b/src/views/lldmine/follow/components/userBox-copy.vue new file mode 100644 index 0000000..d02aa84 --- /dev/null +++ b/src/views/lldmine/follow/components/userBox-copy.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/src/views/lldmine/follow/components/userBox.vue b/src/views/lldmine/follow/components/userBox.vue new file mode 100644 index 0000000..29cfacc --- /dev/null +++ b/src/views/lldmine/follow/components/userBox.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/lldmine/follow/index.vue b/src/views/lldmine/follow/index.vue new file mode 100644 index 0000000..8d6e0be --- /dev/null +++ b/src/views/lldmine/follow/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/src/views/lldmine/historyRecord/components/GameList.vue b/src/views/lldmine/historyRecord/components/GameList.vue new file mode 100644 index 0000000..f9a035d --- /dev/null +++ b/src/views/lldmine/historyRecord/components/GameList.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/src/views/lldmine/historyRecord/components/MangaList.vue b/src/views/lldmine/historyRecord/components/MangaList.vue new file mode 100644 index 0000000..611efd6 --- /dev/null +++ b/src/views/lldmine/historyRecord/components/MangaList.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/views/lldmine/historyRecord/components/MovieList.vue b/src/views/lldmine/historyRecord/components/MovieList.vue new file mode 100644 index 0000000..51e830d --- /dev/null +++ b/src/views/lldmine/historyRecord/components/MovieList.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/views/lldmine/historyRecord/components/PostList.vue b/src/views/lldmine/historyRecord/components/PostList.vue new file mode 100644 index 0000000..98aab62 --- /dev/null +++ b/src/views/lldmine/historyRecord/components/PostList.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/views/lldmine/historyRecord/components/ShortnessVideoList.vue b/src/views/lldmine/historyRecord/components/ShortnessVideoList.vue new file mode 100644 index 0000000..462ec4d --- /dev/null +++ b/src/views/lldmine/historyRecord/components/ShortnessVideoList.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/views/lldmine/historyRecord/components/TheatresList.vue b/src/views/lldmine/historyRecord/components/TheatresList.vue new file mode 100644 index 0000000..b75beb6 --- /dev/null +++ b/src/views/lldmine/historyRecord/components/TheatresList.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/views/lldmine/historyRecord/index.vue b/src/views/lldmine/historyRecord/index.vue new file mode 100644 index 0000000..e12ce90 --- /dev/null +++ b/src/views/lldmine/historyRecord/index.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/src/views/lldmine/index.vue b/src/views/lldmine/index.vue new file mode 100644 index 0000000..60d193c --- /dev/null +++ b/src/views/lldmine/index.vue @@ -0,0 +1,727 @@ + + + + + diff --git a/src/views/lldmine/login/index.vue b/src/views/lldmine/login/index.vue new file mode 100644 index 0000000..279db19 --- /dev/null +++ b/src/views/lldmine/login/index.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/views/lldmine/member/components/MemberLegacyPanel.vue b/src/views/lldmine/member/components/MemberLegacyPanel.vue new file mode 100644 index 0000000..69eb8ee --- /dev/null +++ b/src/views/lldmine/member/components/MemberLegacyPanel.vue @@ -0,0 +1,1448 @@ + + + + diff --git a/src/views/lldmine/member/components/MemberNewPanel.vue b/src/views/lldmine/member/components/MemberNewPanel.vue new file mode 100644 index 0000000..d003e86 --- /dev/null +++ b/src/views/lldmine/member/components/MemberNewPanel.vue @@ -0,0 +1,1737 @@ + + + + diff --git a/src/views/lldmine/member/index.vue b/src/views/lldmine/member/index.vue new file mode 100644 index 0000000..89d1b56 --- /dev/null +++ b/src/views/lldmine/member/index.vue @@ -0,0 +1,95 @@ + + + + diff --git a/src/views/lldmine/memberExchange/index.vue b/src/views/lldmine/memberExchange/index.vue new file mode 100644 index 0000000..03cd901 --- /dev/null +++ b/src/views/lldmine/memberExchange/index.vue @@ -0,0 +1,494 @@ + + + diff --git a/src/views/lldmine/messageCenter/announDetails.vue b/src/views/lldmine/messageCenter/announDetails.vue new file mode 100644 index 0000000..83c2789 --- /dev/null +++ b/src/views/lldmine/messageCenter/announDetails.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/views/lldmine/messageCenter/components/comment.vue b/src/views/lldmine/messageCenter/components/comment.vue new file mode 100644 index 0000000..2704a3d --- /dev/null +++ b/src/views/lldmine/messageCenter/components/comment.vue @@ -0,0 +1,85 @@ + + + + diff --git a/src/views/lldmine/messageCenter/components/like.vue b/src/views/lldmine/messageCenter/components/like.vue new file mode 100644 index 0000000..2e4ca0d --- /dev/null +++ b/src/views/lldmine/messageCenter/components/like.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/views/lldmine/messageCenter/components/noticeTab.vue b/src/views/lldmine/messageCenter/components/noticeTab.vue new file mode 100644 index 0000000..39eb65f --- /dev/null +++ b/src/views/lldmine/messageCenter/components/noticeTab.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/src/views/lldmine/messageCenter/components/service.vue b/src/views/lldmine/messageCenter/components/service.vue new file mode 100644 index 0000000..56a6b17 --- /dev/null +++ b/src/views/lldmine/messageCenter/components/service.vue @@ -0,0 +1,46 @@ + + + + diff --git a/src/views/lldmine/messageCenter/index.vue b/src/views/lldmine/messageCenter/index.vue new file mode 100644 index 0000000..4b82ed9 --- /dev/null +++ b/src/views/lldmine/messageCenter/index.vue @@ -0,0 +1,125 @@ + + + + diff --git a/src/views/lldmine/mineCell.ts b/src/views/lldmine/mineCell.ts new file mode 100644 index 0000000..5f5d971 --- /dev/null +++ b/src/views/lldmine/mineCell.ts @@ -0,0 +1,44 @@ +import { ref } from 'vue'; +export default function mineCell() { + const cellList1 = ref([ + { + title: '意见反馈', + image: new URL('@/assets/images/png/mine/my_cell2.png', import.meta.url).href, + path: '/problemFeedback', + }, + { + title: '我的购买', + image: new URL('@/assets/images/png/mine/my_cell3.png', import.meta.url).href, + path: '/purchasedVideo', + }, + { + title: '我的喜欢', + image: new URL('@/assets/images/png/mine/my_cell4.png', import.meta.url).href, + path: '/myLike', + }, + { + title: '分享邀请', + image: new URL('@/assets/images/png/mine/my_cell5.png', import.meta.url).href, + path: '/share', + }, + { + title: '应用推荐', + image: new URL('@/assets/images/png/mine/my_cell8.png', import.meta.url).href, + path: '/freeBenefits?tabActive=1', + }, + { + title: '账号凭证', + image: new URL('@/assets/images/png/mine/my_cell9.png', import.meta.url).href, + path: '/accountCertificate', + }, + { + title: '我的消息', + image: new URL('@/assets/images/png/mine/my_cell10.png', import.meta.url).href, + path: '/messageCenter', + }, + ]); + + return { + cellList1, + }; +} diff --git a/src/views/lldmine/minepostpage/index.vue b/src/views/lldmine/minepostpage/index.vue new file mode 100644 index 0000000..2dd5e4f --- /dev/null +++ b/src/views/lldmine/minepostpage/index.vue @@ -0,0 +1,572 @@ + + + + + + + diff --git a/src/views/lldmine/myAccount/findPhone.vue b/src/views/lldmine/myAccount/findPhone.vue new file mode 100644 index 0000000..e9b0a2d --- /dev/null +++ b/src/views/lldmine/myAccount/findPhone.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/src/views/lldmine/myAccount/index.vue b/src/views/lldmine/myAccount/index.vue new file mode 100644 index 0000000..55b1ee3 --- /dev/null +++ b/src/views/lldmine/myAccount/index.vue @@ -0,0 +1,409 @@ + + + + diff --git a/src/views/lldmine/myLike/components/GameList.vue b/src/views/lldmine/myLike/components/GameList.vue new file mode 100644 index 0000000..b77b955 --- /dev/null +++ b/src/views/lldmine/myLike/components/GameList.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/src/views/lldmine/myLike/components/MangaList.vue b/src/views/lldmine/myLike/components/MangaList.vue new file mode 100644 index 0000000..66bdd63 --- /dev/null +++ b/src/views/lldmine/myLike/components/MangaList.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/views/lldmine/myLike/components/MovieList.vue b/src/views/lldmine/myLike/components/MovieList.vue new file mode 100644 index 0000000..27fc667 --- /dev/null +++ b/src/views/lldmine/myLike/components/MovieList.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/views/lldmine/myLike/components/PostList.vue b/src/views/lldmine/myLike/components/PostList.vue new file mode 100644 index 0000000..fffb761 --- /dev/null +++ b/src/views/lldmine/myLike/components/PostList.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/lldmine/myLike/components/ShortnessVideoList.vue b/src/views/lldmine/myLike/components/ShortnessVideoList.vue new file mode 100644 index 0000000..7873939 --- /dev/null +++ b/src/views/lldmine/myLike/components/ShortnessVideoList.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/src/views/lldmine/myLike/components/TheatresList.vue b/src/views/lldmine/myLike/components/TheatresList.vue new file mode 100644 index 0000000..7405c89 --- /dev/null +++ b/src/views/lldmine/myLike/components/TheatresList.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/views/lldmine/myLike/index.vue b/src/views/lldmine/myLike/index.vue new file mode 100644 index 0000000..7714097 --- /dev/null +++ b/src/views/lldmine/myLike/index.vue @@ -0,0 +1,425 @@ + + + + + diff --git a/src/views/lldmine/officialCommunity/index.vue b/src/views/lldmine/officialCommunity/index.vue new file mode 100644 index 0000000..9523e7a --- /dev/null +++ b/src/views/lldmine/officialCommunity/index.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/src/views/lldmine/originalenter/index.vue b/src/views/lldmine/originalenter/index.vue new file mode 100644 index 0000000..cc23f1f --- /dev/null +++ b/src/views/lldmine/originalenter/index.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/views/lldmine/originalenter/index2.vue b/src/views/lldmine/originalenter/index2.vue new file mode 100644 index 0000000..23458b2 --- /dev/null +++ b/src/views/lldmine/originalenter/index2.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/lldmine/problemFeedback/index.vue b/src/views/lldmine/problemFeedback/index.vue new file mode 100644 index 0000000..61f9536 --- /dev/null +++ b/src/views/lldmine/problemFeedback/index.vue @@ -0,0 +1,434 @@ + + + + + diff --git a/src/views/lldmine/purchasedVideo/components/GameList.vue b/src/views/lldmine/purchasedVideo/components/GameList.vue new file mode 100644 index 0000000..391b6f5 --- /dev/null +++ b/src/views/lldmine/purchasedVideo/components/GameList.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/src/views/lldmine/purchasedVideo/components/MangaList.vue b/src/views/lldmine/purchasedVideo/components/MangaList.vue new file mode 100644 index 0000000..0454bb0 --- /dev/null +++ b/src/views/lldmine/purchasedVideo/components/MangaList.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/src/views/lldmine/purchasedVideo/components/MovieList.vue b/src/views/lldmine/purchasedVideo/components/MovieList.vue new file mode 100644 index 0000000..ecd54f4 --- /dev/null +++ b/src/views/lldmine/purchasedVideo/components/MovieList.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/views/lldmine/purchasedVideo/components/PostList.vue b/src/views/lldmine/purchasedVideo/components/PostList.vue new file mode 100644 index 0000000..912f84a --- /dev/null +++ b/src/views/lldmine/purchasedVideo/components/PostList.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/views/lldmine/purchasedVideo/components/ShortnessVideoList.vue b/src/views/lldmine/purchasedVideo/components/ShortnessVideoList.vue new file mode 100644 index 0000000..bc7bc4a --- /dev/null +++ b/src/views/lldmine/purchasedVideo/components/ShortnessVideoList.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/views/lldmine/purchasedVideo/components/TheatresList.vue b/src/views/lldmine/purchasedVideo/components/TheatresList.vue new file mode 100644 index 0000000..f9cadfa --- /dev/null +++ b/src/views/lldmine/purchasedVideo/components/TheatresList.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/views/lldmine/purchasedVideo/index.vue b/src/views/lldmine/purchasedVideo/index.vue new file mode 100644 index 0000000..3a53e4c --- /dev/null +++ b/src/views/lldmine/purchasedVideo/index.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/views/lldmine/qualityApplication/index.vue b/src/views/lldmine/qualityApplication/index.vue new file mode 100644 index 0000000..4978ee1 --- /dev/null +++ b/src/views/lldmine/qualityApplication/index.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/views/lldmine/questionsAnswers/index.vue b/src/views/lldmine/questionsAnswers/index.vue new file mode 100644 index 0000000..f95e90d --- /dev/null +++ b/src/views/lldmine/questionsAnswers/index.vue @@ -0,0 +1,180 @@ + + + + diff --git a/src/views/lldmine/rechargeRecord/index.vue b/src/views/lldmine/rechargeRecord/index.vue new file mode 100644 index 0000000..437a597 --- /dev/null +++ b/src/views/lldmine/rechargeRecord/index.vue @@ -0,0 +1,285 @@ + + + diff --git a/src/views/lldmine/revenueDetails/index.vue b/src/views/lldmine/revenueDetails/index.vue new file mode 100644 index 0000000..24bb36a --- /dev/null +++ b/src/views/lldmine/revenueDetails/index.vue @@ -0,0 +1,235 @@ + + + + diff --git a/src/views/lldmine/setting/index.vue b/src/views/lldmine/setting/index.vue new file mode 100644 index 0000000..b4adb5d --- /dev/null +++ b/src/views/lldmine/setting/index.vue @@ -0,0 +1,408 @@ + + + + + diff --git a/src/views/lldmine/setting/index1.vue b/src/views/lldmine/setting/index1.vue new file mode 100644 index 0000000..e49ba75 --- /dev/null +++ b/src/views/lldmine/setting/index1.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/src/views/lldmine/share/index.vue b/src/views/lldmine/share/index.vue new file mode 100644 index 0000000..2b43b11 --- /dev/null +++ b/src/views/lldmine/share/index.vue @@ -0,0 +1,194 @@ + + + + + diff --git a/src/views/lldmine/share/myShare.vue b/src/views/lldmine/share/myShare.vue new file mode 100644 index 0000000..6e73687 --- /dev/null +++ b/src/views/lldmine/share/myShare.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/src/views/lldmine/share/myShare1.vue b/src/views/lldmine/share/myShare1.vue new file mode 100644 index 0000000..1ffb658 --- /dev/null +++ b/src/views/lldmine/share/myShare1.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/src/views/lldmine/signIn/index.vue b/src/views/lldmine/signIn/index.vue new file mode 100644 index 0000000..f1014d0 --- /dev/null +++ b/src/views/lldmine/signIn/index.vue @@ -0,0 +1,541 @@ + + + + + diff --git a/src/views/lldmine/transactionRecord/index.vue b/src/views/lldmine/transactionRecord/index.vue new file mode 100644 index 0000000..e8e5c4b --- /dev/null +++ b/src/views/lldmine/transactionRecord/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/src/views/lldmine/wallet/index.vue b/src/views/lldmine/wallet/index.vue new file mode 100644 index 0000000..52e2bb4 --- /dev/null +++ b/src/views/lldmine/wallet/index.vue @@ -0,0 +1,336 @@ + + + + diff --git a/src/views/lldmine/withdraw/bindBankCard/index.vue b/src/views/lldmine/withdraw/bindBankCard/index.vue new file mode 100644 index 0000000..8097e1f --- /dev/null +++ b/src/views/lldmine/withdraw/bindBankCard/index.vue @@ -0,0 +1,525 @@ + + + diff --git a/src/views/lldmine/withdraw/index.vue b/src/views/lldmine/withdraw/index.vue new file mode 100644 index 0000000..5fe1a68 --- /dev/null +++ b/src/views/lldmine/withdraw/index.vue @@ -0,0 +1,409 @@ + + + diff --git a/src/views/lldmine/withdrawRecord/index copy.vue b/src/views/lldmine/withdrawRecord/index copy.vue new file mode 100644 index 0000000..b5e6cdc --- /dev/null +++ b/src/views/lldmine/withdrawRecord/index copy.vue @@ -0,0 +1,173 @@ + + + diff --git a/src/views/lldmine/withdrawRecord/index.vue b/src/views/lldmine/withdrawRecord/index.vue new file mode 100644 index 0000000..d8ec0b8 --- /dev/null +++ b/src/views/lldmine/withdrawRecord/index.vue @@ -0,0 +1,299 @@ + + + diff --git a/src/views/lldpresale/index.vue b/src/views/lldpresale/index.vue new file mode 100644 index 0000000..1a568f6 --- /dev/null +++ b/src/views/lldpresale/index.vue @@ -0,0 +1,474 @@ + + + + + diff --git a/src/views/login/bindAccount.vue b/src/views/login/bindAccount.vue new file mode 100644 index 0000000..6358b02 --- /dev/null +++ b/src/views/login/bindAccount.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/views/shortVideo/ListItem.vue b/src/views/shortVideo/ListItem.vue new file mode 100644 index 0000000..9366484 --- /dev/null +++ b/src/views/shortVideo/ListItem.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/views/shortVideo/findItem.vue b/src/views/shortVideo/findItem.vue new file mode 100644 index 0000000..e7e2245 --- /dev/null +++ b/src/views/shortVideo/findItem.vue @@ -0,0 +1,318 @@ + + + diff --git a/src/views/shortVideo/followItem.vue b/src/views/shortVideo/followItem.vue new file mode 100644 index 0000000..9c0ddd4 --- /dev/null +++ b/src/views/shortVideo/followItem.vue @@ -0,0 +1,87 @@ + + + diff --git a/src/views/shortVideo/index.vue b/src/views/shortVideo/index.vue new file mode 100644 index 0000000..026f109 --- /dev/null +++ b/src/views/shortVideo/index.vue @@ -0,0 +1,180 @@ + + + + diff --git a/src/views/shortVideo/recommendItem.vue b/src/views/shortVideo/recommendItem.vue new file mode 100644 index 0000000..be887f2 --- /dev/null +++ b/src/views/shortVideo/recommendItem.vue @@ -0,0 +1,308 @@ + + + diff --git a/src/views/shortVideo/short-drama/AiDramaFeed.vue b/src/views/shortVideo/short-drama/AiDramaFeed.vue new file mode 100644 index 0000000..7862b11 --- /dev/null +++ b/src/views/shortVideo/short-drama/AiDramaFeed.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/DramaPlayPage.vue b/src/views/shortVideo/short-drama/DramaPlayPage.vue new file mode 100644 index 0000000..1b9bdfa --- /dev/null +++ b/src/views/shortVideo/short-drama/DramaPlayPage.vue @@ -0,0 +1,716 @@ + + + + + + + diff --git a/src/views/shortVideo/short-drama/DramaTagPage.vue b/src/views/shortVideo/short-drama/DramaTagPage.vue new file mode 100644 index 0000000..5c443d5 --- /dev/null +++ b/src/views/shortVideo/short-drama/DramaTagPage.vue @@ -0,0 +1,150 @@ + + + + + + + diff --git a/src/views/shortVideo/short-drama/HotDramaList.vue b/src/views/shortVideo/short-drama/HotDramaList.vue new file mode 100644 index 0000000..2853667 --- /dev/null +++ b/src/views/shortVideo/short-drama/HotDramaList.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaBottomInfo.vue b/src/views/shortVideo/short-drama/components/DramaBottomInfo.vue new file mode 100644 index 0000000..7e8e095 --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaBottomInfo.vue @@ -0,0 +1,341 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaCoverCard.vue b/src/views/shortVideo/short-drama/components/DramaCoverCard.vue new file mode 100644 index 0000000..4a8d7d2 --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaCoverCard.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaDoubleTapLayer.vue b/src/views/shortVideo/short-drama/components/DramaDoubleTapLayer.vue new file mode 100644 index 0000000..ed83f78 --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaDoubleTapLayer.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaEpisodeSheet.vue b/src/views/shortVideo/short-drama/components/DramaEpisodeSheet.vue new file mode 100644 index 0000000..dd13e9c --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaEpisodeSheet.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaFullscreenBtn.vue b/src/views/shortVideo/short-drama/components/DramaFullscreenBtn.vue new file mode 100644 index 0000000..445bc8c --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaFullscreenBtn.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaPlayBottomBar.vue b/src/views/shortVideo/short-drama/components/DramaPlayBottomBar.vue new file mode 100644 index 0000000..741cf1d --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaPlayBottomBar.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaPlaySlide.vue b/src/views/shortVideo/short-drama/components/DramaPlaySlide.vue new file mode 100644 index 0000000..a4c5111 --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaPlaySlide.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaPlayerCard.vue b/src/views/shortVideo/short-drama/components/DramaPlayerCard.vue new file mode 100644 index 0000000..c2f345d --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaPlayerCard.vue @@ -0,0 +1,390 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaSideActions.vue b/src/views/shortVideo/short-drama/components/DramaSideActions.vue new file mode 100644 index 0000000..42e55d8 --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaSideActions.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaSpeedPopup.vue b/src/views/shortVideo/short-drama/components/DramaSpeedPopup.vue new file mode 100644 index 0000000..dccadb4 --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaSpeedPopup.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/components/DramaUnlockMask.vue b/src/views/shortVideo/short-drama/components/DramaUnlockMask.vue new file mode 100644 index 0000000..049fa1d --- /dev/null +++ b/src/views/shortVideo/short-drama/components/DramaUnlockMask.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/views/shortVideo/short-drama/hooks/useAiDramaFeed.ts b/src/views/shortVideo/short-drama/hooks/useAiDramaFeed.ts new file mode 100644 index 0000000..2a2b764 --- /dev/null +++ b/src/views/shortVideo/short-drama/hooks/useAiDramaFeed.ts @@ -0,0 +1,274 @@ +import { reactive, ref, watch } from 'vue'; +import ShortDramaApi from '@/service/short-drama'; +import { + applyLocalProgressToEpisode, + getDramaLastWatch, + saveDramaProgress, +} from '../utils/dramaLocalWatch'; +import { takeDramaFeedResumeSeed } from '../utils/dramaPlaySeed'; + +async function withLocalProgress(item: Types.ShortDrama.AiDramaFeedItem): Promise { + // TODO(下次上线): 刷剧恢复本地观看进度 + // return { + // ...item, + // episode: await applyLocalProgressToEpisode(item.episode, item.series.id), + // }; + // 本次:上下滑不记进度,一律从 0 起播 + return { + ...item, + episode: { ...item.episode, currentTimeSec: 0 }, + }; +} + +/** 片尾进度回到 Feed 时从头播,避免立刻再触发「播完进连播」 */ +function clampResumeProgress(episode: Types.ShortDrama.DramaEpisode): Types.ShortDrama.DramaEpisode { + const dur = Number(episode.durationSec) || 0; + const sec = Number(episode.currentTimeSec) || 0; + if (dur > 0 && sec >= dur - 1) { + return { ...episode, currentTimeSec: 0 }; + } + return episode; +} + +export function useAiDramaFeed() { + const list = ref([]); + const currentIndex = ref(0); + const isLoading = ref(true); + const hasError = ref(false); + const pageState = reactive({ + pageSize: 20, + hasNext: true, + isLoadingMore: false, + }); + + /** 作废过期的片尾 prepare / 与返回同步互斥 */ + let feedEpisodeSyncToken = 0; + /** 刷剧写入历史列表(置顶);进度固定 0,上下滑仍从片头起播,不恢复进度 */ + const touchHistory = async (item?: Types.ShortDrama.AiDramaFeedItem) => { + if (!item?.series?.id || !item.episode?.id) return; + await saveDramaProgress({ + mediaId: item.series.id, + subId: item.episode.id, + episodeNumber: item.episode.episodeNumber, + progressSec: 0, + title: item.series.title, + coverUrl: item.episode.coverUrl || item.series.coverUrl, + totalEpisodes: item.series.totalEpisodes, + heatCount: item.series.heatCount, + commentCount: item.series.commentCount, + tagName: item.series.tags?.[0]?.name, + }); + }; + + const setSeriesEpisode = ( + seriesId: string, + episode: Types.ShortDrama.DramaEpisode, + seriesPatch?: Partial, + ) => { + const idx = list.value.findIndex((it) => it.series.id === seriesId); + if (idx < 0) return; + const cur = list.value[idx]; + list.value[idx] = { + series: seriesPatch ? { ...cur.series, ...seriesPatch } : cur.series, + episode, + }; + }; + + /** + * 片尾进连播前:把 Feed 卡片换成下一集,返回刷剧时继续播该集。 + * @param syncToken 与 feedEpisodeSyncToken 不一致时丢弃(防止覆盖用户在连播页选集) + */ + const prepareNextEpisodeOnFeed = async ( + item: Types.ShortDrama.AiDramaFeedItem, + nextEpisodeNumber: number, + syncToken: number, + ) => { + try { + const boot = await ShortDramaApi.getDramaDetailBootstrap(item.series.id, { + targetEpisodeNumber: nextEpisodeNumber, + }); + if (syncToken !== feedEpisodeSyncToken) return; + const next = + boot.episodes.find((ep) => ep.episodeNumber === nextEpisodeNumber) || null; + if (!next) return; + + const last = await getDramaLastWatch(item.series.id); + if (syncToken !== feedEpisodeSyncToken) return; + // 连播页已切到其他集(含选更早/更晚集),以历史为准,勿强行写成「下一集」 + if (last && (Number(last.episodeNumber) || 0) !== nextEpisodeNumber) { + const lastNum = Number(last.episodeNumber) || 0; + // 仅当历史仍是「刚播完的上一集」时才推进到 next;历史已是别的集则跟历史 + const endedNum = nextEpisodeNumber - 1; + if (lastNum !== endedNum) { + const ep = + boot.episodes.find((e) => e.id === last.subId) || + boot.episodes.find((e) => e.episodeNumber === last.episodeNumber); + if (!ep) return; + const withProgress = clampResumeProgress( + await applyLocalProgressToEpisode(ep, item.series.id), + ); + if (syncToken !== feedEpisodeSyncToken) return; + setSeriesEpisode(item.series.id, withProgress); + return; + } + } + + const episode = { ...next, currentTimeSec: 0 }; + setSeriesEpisode(item.series.id, episode); + // TODO(下次上线): 刷剧切集时同步本地进度 + // await saveDramaProgress({ + // mediaId: item.series.id, + // subId: episode.id, + // episodeNumber: episode.episodeNumber, + // progressSec: 0, + // title: item.series.title, + // coverUrl: episode.coverUrl || item.series.coverUrl, + // totalEpisodes: item.series.totalEpisodes, + // heatCount: item.series.heatCount, + // commentCount: item.series.commentCount, + // tagName: item.series.tags?.[0]?.name, + // }); + } catch (e) { + console.log(e); + } + }; + + /** + * 从连播页 resume seed 本地秒切集(含 videoUrl),不请求网络。 + * @returns 是否应用了 seed + */ + const applyFeedResumeSeed = (): boolean => { + feedEpisodeSyncToken += 1; + const item = list.value[currentIndex.value]; + if (!item?.series?.id) return false; + const seed = takeDramaFeedResumeSeed(item.series.id); + if (!seed?.episode?.id) return false; + const episode = clampResumeProgress({ ...seed.episode }); + setSeriesEpisode(item.series.id, episode); + return true; + }; + + /** + * 仅本地 IDB 修正当前集进度(不换集、不请求网络)。 + * seed 未命中时的轻量兜底。 + */ + const syncProgressFromLocalOnly = async () => { + const item = list.value[currentIndex.value]; + if (!item?.series?.id || !item.episode?.id) return; + const last = await getDramaLastWatch(item.series.id); + if (!last?.subId) return; + if (last.subId !== item.episode.id) return; + const nextSec = Math.max(0, Math.floor(last.progressSec || 0)); + const patched = clampResumeProgress({ + ...item.episode, + currentTimeSec: nextSec, + }); + if (patched.currentTimeSec === item.episode.currentTimeSec) return; + item.episode.currentTimeSec = patched.currentTimeSec; + }; + + /** + * @deprecated 返回路径改用 applyFeedResumeSeed;保留给需要网络补齐的场景 + */ + const syncCurrentFromLastWatch = async () => { + feedEpisodeSyncToken += 1; + const item = list.value[currentIndex.value]; + if (!item?.series?.id) return; + const last = await getDramaLastWatch(item.series.id); + if (!last?.subId) return; + + if (last.subId === item.episode.id) { + const nextSec = Math.max(0, Math.floor(last.progressSec || 0)); + const patched = clampResumeProgress({ + ...item.episode, + currentTimeSec: nextSec, + }); + if (patched.currentTimeSec !== item.episode.currentTimeSec) { + setSeriesEpisode(item.series.id, patched); + } else { + item.episode.currentTimeSec = patched.currentTimeSec; + } + return; + } + + try { + const boot = await ShortDramaApi.getDramaDetailBootstrap(item.series.id, { + targetEpisodeNumber: last.episodeNumber, + targetEpisodeId: last.subId, + }); + const ep = + boot.episodes.find((e) => e.id === last.subId) || + boot.episodes.find((e) => e.episodeNumber === last.episodeNumber); + if (!ep) return; + const withProgress = clampResumeProgress( + await applyLocalProgressToEpisode(ep, item.series.id), + ); + setSeriesEpisode(item.series.id, withProgress); + } catch (e) { + console.log(e); + } + }; + + /** 发起片尾切集准备,返回本次 token */ + const beginFeedEpisodeSync = () => { + feedEpisodeSyncToken += 1; + return feedEpisodeSyncToken; + }; + + const fetchFeed = async (mode: 'init' | 'more' = 'init') => { + if (mode === 'more') { + if (!pageState.hasNext || pageState.isLoadingMore) return; + pageState.isLoadingMore = true; + } else { + isLoading.value = true; + hasError.value = false; + pageState.hasNext = true; + } + + try { + // 后端按已看队列续推,加载更多仍用相同 pageSize,不传 pageNumber + const res = await ShortDramaApi.getAiDramaFeed(pageState.pageSize); + const nextList = await Promise.all((res.list || []).map(withLocalProgress)); + if (mode === 'more') { + list.value = list.value.concat(nextList); + } else { + list.value = nextList; + currentIndex.value = 0; + await touchHistory(nextList[0]); + } + pageState.hasNext = Boolean(res.hasNext); + } catch { + hasError.value = true; + if (mode === 'init') { + list.value = []; + } + } finally { + isLoading.value = false; + pageState.isLoadingMore = false; + } + }; + + const setCurrentIndex = (index: number) => { + currentIndex.value = index; + }; + + // 上下滑切换时更新历史置顶(进度仍为 0,不改变起播行为) + watch(currentIndex, (index) => { + void touchHistory(list.value[index]); + }); + + return { + list, + currentIndex, + isLoading, + hasError, + pageState, + fetchFeed, + setCurrentIndex, + prepareNextEpisodeOnFeed, + applyFeedResumeSeed, + syncProgressFromLocalOnly, + syncCurrentFromLastWatch, + beginFeedEpisodeSync, + }; +} diff --git a/src/views/shortVideo/short-drama/hooks/useDramaPlayDetail.ts b/src/views/shortVideo/short-drama/hooks/useDramaPlayDetail.ts new file mode 100644 index 0000000..024af30 --- /dev/null +++ b/src/views/shortVideo/short-drama/hooks/useDramaPlayDetail.ts @@ -0,0 +1,847 @@ +import { computed, onBeforeUnmount, reactive, ref } from 'vue'; +import { storeToRefs } from 'pinia'; +import ShortDramaApi from '@/service/short-drama'; +import { useAppStore } from '@/stores/app'; +import { + applyLocalProgressToEpisode, + getDramaLastWatch, + saveDramaProgress, +} from '../utils/dramaLocalWatch'; +import { takeDramaPlaySeed } from '../utils/dramaPlaySeed'; + +export function useDramaPlayDetail( + seriesId: string, + initialEpisode = 1, + options?: { fromQueryEpisode?: boolean }, +) { + const appStore = useAppStore(); + const { shortDramaPureMode: isPureMode } = storeToRefs(appStore); + const isLoading = ref(true); + const hasError = ref(false); + const series = ref(null); + const episodes = ref([]); + const currentEpisodeNumber = ref(initialEpisode); + const isEpisodeSheetOpen = ref(false); + const showUnlockMask = ref(false); + const autoNextSec = ref(0); + const paywall = ref(null); + const state = reactive({ + countdownTimer: null as ReturnType | null, + }); + /** 切集请求序号:丢弃过期的 info 回写,避免快速上滑被旧请求拉回上一集 */ + let episodeRequestId = 0; + /** 丢弃过期的分集列表合并(快速进出页) */ + let detailHydrateId = 0; + /** + * 单集 info 请求代数:进页 hydrate 与解锁后的 refresh 并发时, + * 丢弃过期响应,避免「解锁成功」后又被旧的 locked 回写盖回蒙层 + */ + let episodeInfoSeq = 0; + /** + * 本页已开通短剧卡:在途列表/info 若仍返回 locked,一律不得盖回本地解锁。 + * 进页重新 hydrate 时清零。 + */ + let cardRightsActive = false; + + const currentEpisode = computed(() => { + return ( + episodes.value.find((ep) => ep.episodeNumber === currentEpisodeNumber.value) || episodes.value[0] || null + ); + }); + + const isLocked = computed(() => currentEpisode.value?.lockStatus === 'locked' || currentEpisode.value?.canPlay === false); + + const isLocallyUnlocked = (episode: Types.ShortDrama.DramaEpisode | null | undefined) => + Boolean(episode && episode.canPlay !== false && episode.lockStatus !== 'locked'); + + /** 本地已解锁时,拒绝被滞后的 locked 响应盖回去(短剧卡/已购竞态) */ + const shouldPreserveLocalUnlock = ( + local: Types.ShortDrama.DramaEpisode | null | undefined, + incomingLocked: boolean, + ) => { + if (!incomingLocked || !isLocallyUnlocked(local)) return false; + if (cardRightsActive) return true; + return local!.accessType === 'card' || local!.accessType === 'bought'; + }; + + const withPreservedUnlock = ( + local: Types.ShortDrama.DramaEpisode, + incoming: Types.ShortDrama.DramaEpisode, + ): Types.ShortDrama.DramaEpisode => ({ + ...incoming, + lockStatus: local.lockStatus, + canPlay: local.canPlay, + accessType: local.accessType || incoming.accessType, + currentTimeSec: local.currentTimeSec, + videoUrl: local.videoUrl || incoming.videoUrl, + h265Url: local.h265Url || incoming.h265Url, + playUrl: local.playUrl || incoming.playUrl, + durationSec: local.durationSec || incoming.durationSec, + }); + + const persistCurrentProgress = async (progressSec?: number) => { + const ep = currentEpisode.value; + const mediaId = ep?.mediaId || seriesId; + if (!ep?.id || !mediaId || isLocked.value) return; + await saveDramaProgress({ + mediaId: ep?.mediaId || seriesId, + subId: ep.id, + episodeNumber: ep.episodeNumber, + progressSec: typeof progressSec === 'number' ? progressSec : ep.currentTimeSec || 0, + title: series.value?.title, + coverUrl: ep.coverUrl || series.value?.coverUrl, + totalEpisodes: series.value?.totalEpisodes, + heatCount: series.value?.heatCount, + commentCount: series.value?.commentCount, + tagName: series.value?.tags?.[0]?.name, + }); + }; + + const AUTO_NEXT_WINDOW_SEC = 5; + /** 防止 timeupdate remain<=0 与 ended 同时触发重复切集 */ + let autoNextSwitching = false; + /** 片尾卡在最后 1 秒(HLS 不推 ended / timeupdate)时强制切集 */ + let endStallTimer: ReturnType | null = null; + + const getNextEpisode = () => { + const cur = currentEpisodeNumber.value; + const byNumber = episodes.value.find((ep) => ep.episodeNumber === cur + 1); + if (byNumber) return byNumber; + const idx = episodes.value.findIndex((ep) => ep.episodeNumber === cur); + if (idx >= 0 && idx + 1 < episodes.value.length) return episodes.value[idx + 1]; + return null; + }; + + const clearEndStallTimer = () => { + if (!endStallTimer) return; + clearTimeout(endStallTimer); + endStallTimer = null; + }; + + const clearAutoNext = () => { + clearEndStallTimer(); + if (state.countdownTimer) { + clearInterval(state.countdownTimer); + } + state.countdownTimer = null; + autoNextSec.value = 0; + }; + + const startAutoNext = (seconds = 5) => { + clearAutoNext(); + if (!currentEpisode.value || isLocked.value) return; + const next = getNextEpisode(); + if (!next) return; + autoNextSec.value = seconds; + state.countdownTimer = setInterval(() => { + if (autoNextSec.value <= 1) { + goAutoNextEpisode(next); + return; + } + autoNextSec.value -= 1; + }, 1000); + }; + + const armEndStallAutoNext = (next: Types.ShortDrama.DramaEpisode) => { + if (endStallTimer || autoNextSwitching) return; + endStallTimer = setTimeout(() => { + endStallTimer = null; + if (autoNextSwitching) return; + goAutoNextEpisode(next); + }, 1200); + }; + + /** + * 播放进度驱动:进入片尾最后 5 秒显示倒计时;到 0 自动进下一集。 + * durationSec 缺失时不处理,留给 ended 兜底。 + */ + const syncAutoNextByProgress = (currentSec: number) => { + if (!currentEpisode.value || isLocked.value) { + if (autoNextSec.value > 0) clearAutoNext(); + return; + } + const next = getNextEpisode(); + if (!next) { + if (autoNextSec.value > 0) clearAutoNext(); + return; + } + const duration = Number(currentEpisode.value.durationSec) || 0; + if (duration <= 0) return; + + const remain = Math.ceil(duration - Math.max(0, currentSec)); + if (remain > AUTO_NEXT_WINDOW_SEC) { + if (autoNextSec.value > 0) clearAutoNext(); + return; + } + // 已进入窗口:用播放器进度同步展示,停掉独立 interval,避免与视频不同步 + if (state.countdownTimer) { + clearInterval(state.countdownTimer); + state.countdownTimer = null; + } + if (remain <= 0) { + clearEndStallTimer(); + goAutoNextEpisode(next); + return; + } + autoNextSec.value = remain; + // 卡在最后 1 秒:HLS 常停更且不触发 ended,超时兜底切集 + if (remain <= 1) { + armEndStallAutoNext(next); + } else { + clearEndStallTimer(); + } + }; + + const replaceEpisode = (nextEpisode: Types.ShortDrama.DramaEpisode) => { + episodes.value = episodes.value.map((item) => (item.id === nextEpisode.id ? nextEpisode : item)); + }; + + const syncUnlockMask = (episode: Types.ShortDrama.DramaEpisode | null) => { + const locked = episode?.lockStatus === 'locked' || episode?.canPlay === false; + showUnlockMask.value = Boolean(locked); + if (!locked) paywall.value = null; + }; + + const isEpisodeLocked = (episode: Types.ShortDrama.DramaEpisode | null | undefined) => + Boolean(episode && (episode.lockStatus === 'locked' || episode.canPlay === false)); + + const hasEpisodePlayUrl = (episode: Types.ShortDrama.DramaEpisode | null | undefined) => + Boolean(episode && (episode.videoUrl || episode.h265Url || episode.playUrl)); + + const waitMs = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + + /** 购买成功后本地解锁;无播放地址时不提前清蒙层,否则会出现「解锁成功但不播」 */ + const applyBoughtUnlock = (episodeId: string, mapped?: Types.ShortDrama.DramaEpisode | null) => { + const listed = episodes.value.find((item) => item.id === episodeId); + if (listed) { + listed.canPlay = true; + if (listed.lockStatus === 'locked') { + listed.lockStatus = 'unlocked'; + } + if (!listed.accessType) { + listed.accessType = 'bought'; + } + if (mapped) { + if (mapped.videoUrl) listed.videoUrl = mapped.videoUrl; + if (mapped.h265Url) listed.h265Url = mapped.h265Url; + if (mapped.playUrl) listed.playUrl = mapped.playUrl; + if (mapped.durationSec) listed.durationSec = mapped.durationSec; + } + } + if (currentEpisode.value?.id === episodeId) { + paywall.value = null; + syncUnlockMask(currentEpisode.value); + } + }; + + /** 后台补齐分集时保留当前正在播的字段(进度 / 已刷新的播放地址) */ + const mergeEpisodeLists = ( + incoming: Types.ShortDrama.DramaEpisode[], + preferCurrent = true, + ): Types.ShortDrama.DramaEpisode[] => { + const cur = preferCurrent ? currentEpisode.value : null; + const localById = new Map(episodes.value.map((item) => [item.id, item])); + return incoming.map((ep) => { + const local = localById.get(ep.id); + const incomingLocked = ep.lockStatus === 'locked' || ep.canPlay === false; + if (local && shouldPreserveLocalUnlock(local, incomingLocked)) { + const preserved = withPreservedUnlock(local, ep); + if (cur?.id === ep.id) { + return { + ...preserved, + videoUrl: cur.videoUrl || preserved.videoUrl, + h265Url: cur.h265Url || preserved.h265Url, + playUrl: cur.playUrl || preserved.playUrl, + currentTimeSec: cur.currentTimeSec, + }; + } + return preserved; + } + if (cur?.id && ep.id === cur.id) { + return { + ...ep, + ...cur, + videoUrl: cur.videoUrl || ep.videoUrl, + h265Url: cur.h265Url || ep.h265Url, + playUrl: cur.playUrl || ep.playUrl, + currentTimeSec: cur.currentTimeSec, + lockStatus: cur.lockStatus ?? ep.lockStatus, + canPlay: cur.canPlay ?? ep.canPlay, + }; + } + return ep; + }); + }; + + const appendRemainingEpisodes = async ( + hydrateId: number, + nextPage: number, + hasMore: boolean, + ) => { + if (!hasMore || !series.value) return; + try { + const rest = await ShortDramaApi.getDramaEpisodesFromPage(seriesId, series.value, nextPage); + if (hydrateId !== detailHydrateId) return; + if (!rest.length) return; + const byId = new Map(); + const putEpisode = (ep: Types.ShortDrama.DramaEpisode) => { + const prev = byId.get(ep.id); + if (!prev) { + byId.set(ep.id, ep); + return; + } + const nextLocked = ep.lockStatus === 'locked' || ep.canPlay === false; + if (shouldPreserveLocalUnlock(prev, nextLocked)) { + byId.set(ep.id, withPreservedUnlock(prev, ep)); + return; + } + byId.set(ep.id, { + ...prev, + ...ep, + currentTimeSec: prev.currentTimeSec, + videoUrl: prev.videoUrl || ep.videoUrl, + h265Url: prev.h265Url || ep.h265Url, + playUrl: prev.playUrl || ep.playUrl, + durationSec: prev.durationSec || ep.durationSec, + }); + }; + episodes.value.forEach(putEpisode); + rest.forEach(putEpisode); + const merged = Array.from(byId.values()).sort((a, b) => a.episodeNumber - b.episodeNumber); + episodes.value = mergeEpisodeLists(merged); + } catch { + /* 补齐失败不影响当前播放 */ + } + }; + + const refreshEpisodeInfo = async ( + contentId: string, + opts?: { + skipLocalProgress?: boolean; + preserveProgress?: boolean; + requestId?: number; + /** 购买后刷新:接口若仍返回 locked,保留可播态并清空付费墙 */ + preferUnlocked?: boolean; + }, + ) => { + const seq = ++episodeInfoSeq; + const info = await ShortDramaApi.getEpisodeInfo(contentId); + let mapped = ShortDramaApi.applyEpisodeInfo(info, series.value || undefined); + const listedBefore = episodes.value.find((item) => item.id === mapped.id); + // 总时长以接口 playTime 为准;仅接口缺失时保留当前展示值 + const apiDur = Number(mapped.durationSec) || 0; + const localDur = Number(listedBefore?.durationSec) || 0; + if (apiDur <= 0 && localDur > 0) { + mapped.durationSec = localDur; + } + if (opts?.preserveProgress && listedBefore) { + // Feed 进连播续播:保留种子进度,勿被本地旧进度/接口默认值覆盖 + mapped.currentTimeSec = Math.max(0, Number(listedBefore.currentTimeSec) || 0); + } else if (opts?.skipLocalProgress) { + mapped.currentTimeSec = 0; + } else { + mapped = await applyLocalProgressToEpisode(mapped, seriesId); + } + // 进度可本地叠,总时长仍以本次接口 playTime(mapped.durationSec)为准 + if (apiDur > 0) { + mapped.durationSec = apiDur; + } else if (localDur > 0) { + mapped.durationSec = localDur; + } + + // 购买后 / 短剧卡权益下:滞后 locked info 不得盖回本地解锁 + if (isEpisodeLocked(mapped)) { + const videoUrl = mapped.videoUrl || listedBefore?.videoUrl; + const h265Url = mapped.h265Url || listedBefore?.h265Url; + const playUrl = mapped.playUrl || listedBefore?.playUrl; + const preserve = shouldPreserveLocalUnlock(listedBefore, true); + // 金币购买 preferUnlocked:有地址或本地已解锁时强制可播 + const forcePrefer = + Boolean(opts?.preferUnlocked) && + Boolean(videoUrl || h265Url || playUrl || isLocallyUnlocked(listedBefore)); + if (preserve || forcePrefer) { + mapped = { + ...mapped, + canPlay: true, + lockStatus: mapped.lockStatus === 'free' ? 'free' : 'unlocked', + accessType: mapped.accessType || listedBefore?.accessType || 'bought', + videoUrl, + h265Url, + playUrl, + }; + } + } + + // 过期 info(进页 hydrate / 旧解锁刷新):不可回写当前集付费墙与锁态 + if (seq !== episodeInfoSeq) { + const listed = episodes.value.find((item) => item.id === mapped.id); + if (listed && listed.id !== currentEpisode.value?.id) { + if (shouldPreserveLocalUnlock(listed, isEpisodeLocked(mapped))) { + Object.assign(listed, withPreservedUnlock(listed, mapped)); + } else { + Object.assign(listed, { + ...mapped, + currentTimeSec: listed.currentTimeSec, + durationSec: listed.durationSec || mapped.durationSec, + }); + } + } + return mapped; + } + + // 过期切集请求:仍可更新该集缓存,但绝不能改当前集/付费墙(否则会触发 slideTo 回跳) + if (opts?.requestId != null && opts.requestId !== episodeRequestId) { + const listed = episodes.value.find((item) => item.id === mapped.id); + if (listed) { + if (shouldPreserveLocalUnlock(listed, isEpisodeLocked(mapped))) { + Object.assign(listed, withPreservedUnlock(listed, mapped)); + } else { + Object.assign(listed, { + ...mapped, + currentTimeSec: listed.currentTimeSec, + durationSec: listed.durationSec || mapped.durationSec, + }); + } + } + return mapped; + } + replaceEpisode(mapped); + currentEpisodeNumber.value = mapped.episodeNumber; + // 已解锁则清付费墙;仍锁定才写入接口 paywall + if (!isEpisodeLocked(mapped)) { + paywall.value = null; + } else if (!opts?.preferUnlocked) { + paywall.value = info.paywall || null; + } + syncUnlockMask(mapped); + return mapped; + }; + + const resolveStartEpisode = async (list: Types.ShortDrama.DramaEpisode[]) => { + if (options?.fromQueryEpisode) { + const byQuery = list.find((ep) => ep.episodeNumber === initialEpisode); + if (byQuery) return byQuery; + } + + const localLast = await getDramaLastWatch(seriesId); + if (localLast) { + const byLocal = + list.find((ep) => ep.id === localLast.subId) || list.find((ep) => ep.episodeNumber === localLast.episodeNumber); + if (byLocal) return byLocal; + } + + return list.find((ep) => ep.episodeNumber === initialEpisode) || list[0]; + }; + + /** 开播后后台:刷单集 info(付费墙/地址)+ 补全分集列表 */ + const hydrateAfterFirstPaint = async ( + hydrateId: number, + contentId: string, + nextPage: number, + hasMore: boolean, + ) => { + await Promise.all([ + refreshEpisodeInfo(contentId).catch(() => { + syncUnlockMask(currentEpisode.value); + }), + appendRemainingEpisodes(hydrateId, nextPage, hasMore), + ]); + if (hydrateId !== detailHydrateId) return; + await persistCurrentProgress(); + }; + + const fetchDetail = async () => { + if (!seriesId) { + hasError.value = true; + isLoading.value = false; + return; + } + const hydrateId = ++detailHydrateId; + cardRightsActive = false; + isLoading.value = true; + hasError.value = false; + + // Feed 带入的种子:立刻起播,详情后台补 + const seed = takeDramaPlaySeed(seriesId); + if (seed?.episode) { + try { + series.value = seed.series; + // shortVideo → 连播:以 Feed 当前进度为准续播,勿被本地旧进度覆盖 + // (刷剧上下滑暂不写本地进度,但仍需支持点进连播续播) + const feedProgressSec = Math.max(0, Math.floor(Number(seed.episode.currentTimeSec) || 0)); + // TODO(下次上线): 若需叠加本地进度可恢复 applyLocalProgressToEpisode,但仍应优先 feedProgressSec + // const seeded = await applyLocalProgressToEpisode({ ...seed.episode }, seriesId); + const seeded = { ...seed.episode, currentTimeSec: feedProgressSec }; + if (hydrateId !== detailHydrateId) return; + episodes.value = [seeded]; + currentEpisodeNumber.value = seeded.episodeNumber; + syncUnlockMask(seeded); + isLoading.value = false; + + // 单集 info 与分集列表并行,互不阻塞首帧 + void (async () => { + const infoTask = refreshEpisodeInfo(seeded.id, { preserveProgress: true }).catch(() => { + syncUnlockMask(currentEpisode.value); + }); + try { + const boot = await ShortDramaApi.getDramaDetailBootstrap(seriesId, { + targetEpisodeId: seeded.id, + targetEpisodeNumber: seeded.episodeNumber, + }); + if (hydrateId !== detailHydrateId) return; + series.value = boot.series; + const merged = mergeEpisodeLists(boot.episodes); + if (!merged.some((ep) => ep.id === seeded.id)) { + merged.push(currentEpisode.value || seeded); + merged.sort((a, b) => a.episodeNumber - b.episodeNumber); + } + episodes.value = mergeEpisodeLists(merged); + currentEpisodeNumber.value = + currentEpisode.value?.episodeNumber || seeded.episodeNumber; + await Promise.all([ + infoTask, + appendRemainingEpisodes(hydrateId, boot.nextPage, boot.hasMore), + ]); + } catch { + await infoTask; + } + if (hydrateId !== detailHydrateId) return; + await persistCurrentProgress(); + })(); + return; + } catch { + if (hydrateId !== detailHydrateId) return; + } + } + + try { + // 冷启动:先读本地续播目标,再并行拉 info + 分集(只拉到目标集) + let targetEpisodeId: string | undefined; + let targetEpisodeNumber = initialEpisode; + if (!options?.fromQueryEpisode) { + const localLast = await getDramaLastWatch(seriesId); + if (localLast) { + targetEpisodeId = localLast.subId; + targetEpisodeNumber = localLast.episodeNumber || initialEpisode; + } + } + + const boot = await ShortDramaApi.getDramaDetailBootstrap(seriesId, { + targetEpisodeId, + targetEpisodeNumber, + }); + if (hydrateId !== detailHydrateId) return; + + series.value = boot.series; + episodes.value = boot.episodes; + const target = await resolveStartEpisode(episodes.value); + if (hydrateId !== detailHydrateId) return; + + if (target) { + const progressed = await applyLocalProgressToEpisode(target, seriesId); + if (hydrateId !== detailHydrateId) return; + replaceEpisode(progressed); + currentEpisodeNumber.value = progressed.episodeNumber; + syncUnlockMask(progressed); + } else { + currentEpisodeNumber.value = 1; + syncUnlockMask(null); + } + + // 列表已有播放地址即可先出画面;locked 也先出遮罩,info 后台补 paywall + isLoading.value = false; + + const contentId = currentEpisode.value?.id; + if (contentId) { + void hydrateAfterFirstPaint(hydrateId, contentId, boot.nextPage, boot.hasMore); + } else if (boot.hasMore) { + void appendRemainingEpisodes(hydrateId, boot.nextPage, boot.hasMore); + } + } catch { + if (hydrateId !== detailHydrateId) return; + hasError.value = true; + series.value = null; + episodes.value = []; + isLoading.value = false; + } + }; + + /** + * 页内切集(上下滑 / 倒计时 / 选集)默认从 0 起播,不叠本地进度。 + * 冷启动续播走 fetchDetail;一级带入续播走 seed + preserveProgress。 + * startFromZero:false 仅用于同集刷新(如权益过期 8005)保留当前进度。 + */ + const selectEpisode = async ( + episode: Types.ShortDrama.DramaEpisode, + opts?: { startFromZero?: boolean }, + ) => { + const startFromZero = opts?.startFromZero !== false; + const requestId = ++episodeRequestId; + await persistCurrentProgress(); + // 等待落进度期间用户又滑走了 + if (requestId !== episodeRequestId) return; + clearAutoNext(); + if (startFromZero) { + episode.currentTimeSec = 0; + const listed = episodes.value.find((item) => item.id === episode.id); + if (listed) listed.currentTimeSec = 0; + } + currentEpisodeNumber.value = episode.episodeNumber; + isEpisodeSheetOpen.value = false; + try { + let mapped = await refreshEpisodeInfo(episode.id, { + skipLocalProgress: startFromZero, + preserveProgress: !startFromZero, + requestId, + }); + if (requestId !== episodeRequestId) return; + // 短剧卡刚开通:切到其它集时地址可能尚未下发,短重试避免只见封面不能播 + const needPlayUrlRetry = + (cardRightsActive || mapped.accessType === 'card' || episode.accessType === 'card') && + isLocallyUnlocked(mapped) && + !hasEpisodePlayUrl(mapped); + if (needPlayUrlRetry) { + for (let i = 0; i < 3 && !hasEpisodePlayUrl(mapped); i += 1) { + if (requestId !== episodeRequestId) return; + await waitMs(250 * (i + 1)); + mapped = await refreshEpisodeInfo(episode.id, { + skipLocalProgress: startFromZero, + preserveProgress: !startFromZero, + requestId, + preferUnlocked: true, + }); + } + } + } catch { + if (requestId !== episodeRequestId) return; + syncUnlockMask(episode); + } + }; + + const goAutoNextEpisode = (next: Types.ShortDrama.DramaEpisode) => { + if (autoNextSwitching) return; + autoNextSwitching = true; + clearAutoNext(); + // 倒计时进下一集:从头自动播,避免本地进度把 seek 拉到片尾导致“切了但不播” + void selectEpisode(next).finally(() => { + autoNextSwitching = false; + }); + }; + + const unlockCurrentEpisode = async () => { + const ep = currentEpisode.value; + const mediaId = ep?.mediaId || seriesId; + const checkoutContextId = paywall.value?.checkoutContextId || ''; + if (!ep?.id || !mediaId || !checkoutContextId) { + throw new Error('4001'); + } + await ShortDramaApi.buyEpisode({ + mediaId, + contentId: ep.id, + checkoutContextId, + }); + // 作废进页 hydrate 等进行中的 info,防止旧 locked 响应盖回蒙层 + episodeInfoSeq += 1; + + // 购买后 info 可能短暂无播放地址:短重试,避免「解锁成功但不播」 + let mapped = await refreshEpisodeInfo(ep.id, { preferUnlocked: true }); + for (let i = 0; i < 4 && !hasEpisodePlayUrl(mapped); i += 1) { + await waitMs(250 * (i + 1)); + mapped = await refreshEpisodeInfo(ep.id, { preferUnlocked: true }); + } + + applyBoughtUnlock(ep.id, mapped); + if (!hasEpisodePlayUrl(currentEpisode.value)) { + // 已扣费但地址仍未下发:保留解锁态,交由页面提示重进 + throw new Error('PLAY_URL_PENDING'); + } + }; + + /** 短剧卡购买成功后重拉当前集,刷新 canPlay / 付费墙 */ + const refreshCurrentEpisode = async () => { + const ep = currentEpisode.value; + if (!ep?.id) return; + // 作废进页 hydrate,避免权益已开却被旧 locked info 盖回 + episodeInfoSeq += 1; + await refreshEpisodeInfo(ep.id, { preferUnlocked: true }); + }; + + /** + * 用最新分集列表回写锁态(canPlay / lockStatus / accessType)。 + * 保留本地进度与当前集已拿到的播放地址。 + */ + const mergeEpisodeListLockStatus = (fresh: Types.ShortDrama.DramaEpisode[]) => { + if (!fresh.length) return; + const curId = currentEpisode.value?.id; + const localById = new Map(episodes.value.map((item) => [item.id, item])); + episodes.value = fresh.map((ep) => { + const local = localById.get(ep.id); + if (!local) return ep; + const freshLocked = ep.lockStatus === 'locked' || ep.canPlay === false; + if (shouldPreserveLocalUnlock(local, freshLocked)) { + return withPreservedUnlock(local, ep); + } + const keepPlayUrl = local.id === curId; + return { + ...ep, + currentTimeSec: local.currentTimeSec, + durationSec: local.durationSec || ep.durationSec, + videoUrl: (keepPlayUrl && local.videoUrl) || ep.videoUrl || local.videoUrl, + h265Url: (keepPlayUrl && local.h265Url) || ep.h265Url || local.h265Url, + playUrl: (keepPlayUrl && local.playUrl) || ep.playUrl || local.playUrl, + lockStatus: ep.lockStatus, + canPlay: ep.canPlay, + accessType: ep.accessType, + unlockCoins: ep.unlockCoins, + }; + }); + if (currentEpisode.value) { + syncUnlockMask(currentEpisode.value); + } + }; + + /** 接口已确认短剧卡可播:本地解开其余金币集角标 */ + const applyCardUnlockLocally = () => { + cardRightsActive = true; + episodes.value.forEach((item) => { + if (item.lockStatus !== 'locked' && item.canPlay !== false) return; + item.canPlay = true; + if (item.lockStatus === 'locked') { + item.lockStatus = 'unlocked'; + } + if (!item.accessType || item.accessType === 'coin') { + item.accessType = 'card'; + } + }); + paywall.value = null; + if (currentEpisode.value) { + syncUnlockMask(currentEpisode.value); + } + }; + + /** 短剧卡购买后:重拉分集列表锁态 */ + const reloadEpisodeListLockStatus = async () => { + if (!seriesId || !series.value) return; + const target = currentEpisode.value; + const boot = await ShortDramaApi.getDramaDetailBootstrap(seriesId, { + targetEpisodeId: target?.id, + targetEpisodeNumber: target?.episodeNumber || currentEpisodeNumber.value, + }); + series.value = { + ...series.value, + ...boot.series, + hasLiked: series.value.hasLiked ?? boot.series.hasLiked, + hasCollected: series.value.hasCollected ?? boot.series.hasCollected, + likeCount: series.value.likeCount || boot.series.likeCount, + collectCount: series.value.collectCount || boot.series.collectCount, + commentCount: series.value.commentCount || boot.series.commentCount, + }; + let fresh = boot.episodes; + if (boot.hasMore) { + const rest = await ShortDramaApi.getDramaEpisodesFromPage(seriesId, boot.series, boot.nextPage); + if (rest.length) { + const byId = new Map(); + [...fresh, ...rest].forEach((item) => byId.set(item.id, item)); + fresh = Array.from(byId.values()).sort((a, b) => a.episodeNumber - b.episodeNumber); + } + } + mergeEpisodeListLockStatus(fresh); + }; + + /** + * 会员卡购买成功后刷新短剧锁态。 + * 必须以接口可播为准:用户可能买的不是短剧权益卡,不能乐观整表解锁,更不能提示「权益已开通」。 + * @returns unlocked 已可播 | play_url_pending 已解锁但地址未下发 | no_rights 当前卡不含本集短剧权益 + */ + const refreshAfterCardPurchase = async (): Promise<'unlocked' | 'play_url_pending' | 'no_rights'> => { + const ep = currentEpisode.value; + if (!ep?.id) return 'no_rights'; + detailHydrateId += 1; + episodeInfoSeq += 1; + + // 先拉接口真态,不做乐观解锁 + try { + await reloadEpisodeListLockStatus(); + } catch { + /* 列表失败仍继续查当前集 */ + } + + let mapped = await refreshEpisodeInfo(ep.id); + // 权益刚开通偶发滞后:短重试,仍 locked 则判定无短剧权益 + for (let i = 0; i < 3 && isEpisodeLocked(mapped); i += 1) { + await waitMs(300 * (i + 1)); + mapped = await refreshEpisodeInfo(ep.id); + } + + if (isEpisodeLocked(currentEpisode.value) || isEpisodeLocked(mapped)) { + return 'no_rights'; + } + + // 接口已确认可播:再解开其它集角标,并尽量拿到播放地址 + applyCardUnlockLocally(); + try { + await reloadEpisodeListLockStatus(); + } catch { + /* ignore */ + } + + if (!hasEpisodePlayUrl(currentEpisode.value)) { + for (let i = 0; i < 4 && !hasEpisodePlayUrl(currentEpisode.value); i += 1) { + await waitMs(250 * (i + 1)); + await refreshEpisodeInfo(ep.id, { preferUnlocked: true }); + } + } + + if (!hasEpisodePlayUrl(currentEpisode.value)) { + return 'play_url_pending'; + } + return 'unlocked'; + }; + + const togglePureMode = () => { + appStore.toggleShortDramaPureMode(); + }; + + /** 播放器回调:更新内存进度并落本地 */ + const updatePlayProgress = (progressSec: number) => { + const ep = currentEpisode.value; + if (!ep) return; + ep.currentTimeSec = Math.max(0, Math.floor(progressSec || 0)); + void persistCurrentProgress(ep.currentTimeSec); + }; + + onBeforeUnmount(() => { + detailHydrateId += 1; + cardRightsActive = false; + void persistCurrentProgress(); + clearAutoNext(); + }); + + return { + isLoading, + hasError, + series, + episodes, + currentEpisode, + currentEpisodeNumber, + isPureMode, + isEpisodeSheetOpen, + showUnlockMask, + isLocked, + autoNextSec, + paywall, + fetchDetail, + selectEpisode, + unlockCurrentEpisode, + refreshCurrentEpisode, + refreshAfterCardPurchase, + togglePureMode, + startAutoNext, + clearAutoNext, + syncAutoNextByProgress, + getNextEpisode, + goAutoNextEpisode, + updatePlayProgress, + persistCurrentProgress, + }; +} diff --git a/src/views/shortVideo/short-drama/hooks/useDramaTagList.ts b/src/views/shortVideo/short-drama/hooks/useDramaTagList.ts new file mode 100644 index 0000000..add605f --- /dev/null +++ b/src/views/shortVideo/short-drama/hooks/useDramaTagList.ts @@ -0,0 +1,99 @@ +import { reactive, ref } from 'vue'; +import ShortDramaApi from '@/service/short-drama'; + +const SORT_OPTIONS: Array<{ label: string; value: Types.ShortDrama.HotDramaSort }> = [ + { label: '热门推荐', value: 'hot' }, + { label: '最新上架', value: 'latest' }, + { label: '最多收藏', value: 'collect' }, +]; + +export function useDramaTagList(tagID: string) { + const list = ref([]); + const activeSort = ref('hot'); + const isLoading = ref(true); + const hasError = ref(false); + const moreParams = reactive({ + loading: false, + refreshing: false, + finished: false, + isNoData: false, + error: false, + isHigehtMax: false, + disabled: false, + }); + const pageState = reactive({ + pageNumber: 1, + pageSize: 20, + }); + + const fetchList = async (mode: 'init' | 'refresh' | 'more' = 'init') => { + if (!tagID) { + list.value = []; + isLoading.value = false; + moreParams.isNoData = true; + moreParams.finished = true; + return; + } + + if (mode === 'more') { + if (moreParams.finished || moreParams.loading) return; + moreParams.loading = true; + } else if (mode === 'refresh') { + moreParams.refreshing = true; + moreParams.finished = false; + moreParams.error = false; + pageState.pageNumber = 1; + } else { + isLoading.value = true; + hasError.value = false; + moreParams.finished = false; + moreParams.error = false; + pageState.pageNumber = 1; + } + + try { + const pageNumber = mode === 'more' ? pageState.pageNumber + 1 : 1; + const res = await ShortDramaApi.getDramaTagList(tagID, activeSort.value, pageNumber, pageState.pageSize); + const nextList = res.list || []; + if (mode === 'more') { + list.value = list.value.concat(nextList); + pageState.pageNumber = pageNumber; + } else { + list.value = nextList; + pageState.pageNumber = 1; + } + moreParams.isNoData = pageNumber === 1 && nextList.length === 0; + moreParams.finished = !res.hasNext; + moreParams.error = false; + hasError.value = false; + } catch { + moreParams.error = true; + hasError.value = true; + if (mode !== 'more') { + list.value = []; + moreParams.isNoData = true; + } + } finally { + isLoading.value = false; + moreParams.loading = false; + moreParams.refreshing = false; + } + }; + + const changeSort = async (sort: Types.ShortDrama.HotDramaSort) => { + if (activeSort.value === sort) return; + activeSort.value = sort; + await fetchList('init'); + }; + + return { + list, + activeSort, + sortOptions: SORT_OPTIONS, + isLoading, + hasError, + moreParams, + fetchList, + changeSort, + }; +} diff --git a/src/views/shortVideo/short-drama/hooks/useHotDramaList.ts b/src/views/shortVideo/short-drama/hooks/useHotDramaList.ts new file mode 100644 index 0000000..5e8e0a8 --- /dev/null +++ b/src/views/shortVideo/short-drama/hooks/useHotDramaList.ts @@ -0,0 +1,91 @@ +import { reactive, ref } from 'vue'; +import ShortDramaApi from '@/service/short-drama'; + +const SORT_OPTIONS: Array<{ label: string; value: Types.ShortDrama.HotDramaSort }> = [ + { label: '热门推荐', value: 'hot' }, + { label: '最新上架', value: 'latest' }, + { label: '最多收藏', value: 'collect' }, +]; + +export function useHotDramaList() { + const list = ref([]); + const activeSort = ref('hot'); + const isLoading = ref(true); + const hasError = ref(false); + const moreParams = reactive({ + loading: false, + refreshing: false, + finished: false, + isNoData: false, + error: false, + isHigehtMax: false, + disabled: false, + }); + const pageState = reactive({ + pageNumber: 1, + pageSize: 20, + }); + + const fetchList = async (mode: 'init' | 'refresh' | 'more' = 'init') => { + if (mode === 'more') { + if (moreParams.finished || moreParams.loading) return; + moreParams.loading = true; + } else if (mode === 'refresh') { + moreParams.refreshing = true; + moreParams.finished = false; + moreParams.error = false; + pageState.pageNumber = 1; + } else { + isLoading.value = true; + hasError.value = false; + moreParams.finished = false; + moreParams.error = false; + pageState.pageNumber = 1; + } + + try { + const pageNumber = mode === 'more' ? pageState.pageNumber + 1 : 1; + const res = await ShortDramaApi.getHotDramaList(activeSort.value, pageNumber, pageState.pageSize); + const nextList = res.list || []; + if (mode === 'more') { + list.value = list.value.concat(nextList); + pageState.pageNumber = pageNumber; + } else { + list.value = nextList; + pageState.pageNumber = 1; + } + moreParams.isNoData = pageNumber === 1 && nextList.length === 0; + moreParams.finished = !res.hasNext; + moreParams.error = false; + hasError.value = false; + } catch { + moreParams.error = true; + hasError.value = true; + if (mode !== 'more') { + list.value = []; + moreParams.isNoData = true; + } + } finally { + isLoading.value = false; + moreParams.loading = false; + moreParams.refreshing = false; + } + }; + + const changeSort = async (sort: Types.ShortDrama.HotDramaSort) => { + if (activeSort.value === sort) return; + activeSort.value = sort; + await fetchList('init'); + }; + + return { + list, + activeSort, + sortOptions: SORT_OPTIONS, + isLoading, + hasError, + moreParams, + fetchList, + changeSort, + }; +} diff --git a/src/views/shortVideo/short-drama/utils/dramaDuration.ts b/src/views/shortVideo/short-drama/utils/dramaDuration.ts new file mode 100644 index 0000000..b43dbbe --- /dev/null +++ b/src/views/shortVideo/short-drama/utils/dramaDuration.ts @@ -0,0 +1,25 @@ +/** + * 进度条右侧总时长以接口 playTime(映射为 durationSec)为准。 + * 仅当接口未返回时长时,才用播放器 duration 兜底;有接口值则绝不覆盖,避免加载/拖动时右侧时间跳动。 + */ +export function syncEpisodeDurationFromPlayer( + episode: Types.ShortDrama.DramaEpisode, + playerDuration?: number, +): void { + const fromApi = Number(episode.durationSec) || 0; + if (fromApi > 0) return; + + const playerDur = Number(playerDuration) || 0; + if (!(playerDur > 0.5) || !Number.isFinite(playerDur)) return; + episode.durationSec = Math.round(playerDur); +} + +/** @deprecated 总时长改走接口 playTime,锁定逻辑已废弃,保留空实现避免引用报错 */ +export function clearEpisodeDurationLock(_episodeId?: string): void { + /* no-op */ +} + +/** @deprecated */ +export function getLockedEpisodeDuration(_episodeId?: string): number | undefined { + return undefined; +} diff --git a/src/views/shortVideo/short-drama/utils/dramaFullscreen.ts b/src/views/shortVideo/short-drama/utils/dramaFullscreen.ts new file mode 100644 index 0000000..3400fbc --- /dev/null +++ b/src/views/shortVideo/short-drama/utils/dramaFullscreen.ts @@ -0,0 +1,27 @@ +/** 宽高比 > 1 视为横屏;接口 ratio 为 width/height */ +export function isLandscapeRatio(ratio?: number | null): boolean { + return Number(ratio) > 1; +} + +/** + * object-fit: contain 下,横屏画面底边相对容器顶部的偏移(px)。 + * 全屏按钮放在该底边再下 gapPx。 + */ +export function calcContainVideoBottom( + containerWidth: number, + containerHeight: number, + ratio: number, +): number { + const w = Number(containerWidth) || 0; + const h = Number(containerHeight) || 0; + const r = Number(ratio) || 0; + if (w <= 0 || h <= 0 || r <= 0) return h / 2; + + let displayH: number; + if (w / h > r) { + displayH = h; + } else { + displayH = w / r; + } + return (h - displayH) / 2 + displayH; +} diff --git a/src/views/shortVideo/short-drama/utils/dramaLocalWatch.ts b/src/views/shortVideo/short-drama/utils/dramaLocalWatch.ts new file mode 100644 index 0000000..0f349b2 --- /dev/null +++ b/src/views/shortVideo/short-drama/utils/dramaLocalWatch.ts @@ -0,0 +1,267 @@ +import { useUserStore } from '@/stores/user'; + +const DB_NAME = '91porn_drama_db'; +const DB_VERSION = 1; +const STORE_PROGRESS = 'progress'; // key: uid_mediaId_subId +const STORE_HISTORY = 'history'; // key: uid_mediaId(每剧一条,用于历史列表/续播) +/** 历史剧最多保留部数 */ +const HISTORY_MAX = 50; +/** 每部剧最多保留单集进度条数(按 updatedAt 留最近的) */ +const PROGRESS_PER_MEDIA_MAX = 30; + +export interface DramaLocalProgress { + id: string; + uid: string; + mediaId: string; + subId: string; + episodeNumber: number; + progressSec: number; + updatedAt: number; + title?: string; + coverUrl?: string; + totalEpisodes?: number; + heatCount?: number; + commentCount?: number; + tagName?: string; +} + +function getUid(): string { + const uid = useUserStore().userInfo?.uid; + return uid != null && String(uid) !== '' ? String(uid) : '0'; +} + +function progressId(uid: string, mediaId: string, subId: string) { + return `${uid}_${mediaId}_${subId}`; +} + +function historyId(uid: string, mediaId: string) { + return `${uid}_${mediaId}`; +} + +function openDramaDB(): Promise { + return new Promise((resolve, reject) => { + const req = indexedDB.open(DB_NAME, DB_VERSION); + req.onerror = () => reject(req.error); + req.onsuccess = () => resolve(req.result); + req.onupgradeneeded = () => { + const db = req.result; + if (!db.objectStoreNames.contains(STORE_PROGRESS)) { + db.createObjectStore(STORE_PROGRESS, { keyPath: 'id' }); + } + if (!db.objectStoreNames.contains(STORE_HISTORY)) { + const store = db.createObjectStore(STORE_HISTORY, { keyPath: 'id' }); + store.createIndex('updatedAt', 'updatedAt', { unique: false }); + } + }; + }); +} + +function idbGet(storeName: string, id: string): Promise { + return openDramaDB().then( + (db) => + new Promise((resolve, reject) => { + const tx = db.transaction(storeName, 'readonly'); + const req = tx.objectStore(storeName).get(id); + req.onsuccess = () => resolve((req.result as T) || null); + req.onerror = () => reject(req.error); + tx.oncomplete = () => db.close(); + }), + ); +} + +function idbPut(storeName: string, value: DramaLocalProgress): Promise { + return openDramaDB().then( + (db) => + new Promise((resolve, reject) => { + const tx = db.transaction(storeName, 'readwrite'); + tx.objectStore(storeName).put(value); + tx.oncomplete = () => { + db.close(); + resolve(); + }; + tx.onerror = () => reject(tx.error); + }), + ); +} + +function idbGetAll(storeName: string): Promise { + return openDramaDB().then( + (db) => + new Promise((resolve, reject) => { + const tx = db.transaction(storeName, 'readonly'); + const req = tx.objectStore(storeName).getAll(); + req.onsuccess = () => resolve((req.result as T[]) || []); + req.onerror = () => reject(req.error); + tx.oncomplete = () => db.close(); + }), + ); +} + +function idbDelete(storeName: string, id: string): Promise { + return openDramaDB().then( + (db) => + new Promise((resolve, reject) => { + const tx = db.transaction(storeName, 'readwrite'); + tx.objectStore(storeName).delete(id); + tx.oncomplete = () => { + db.close(); + resolve(); + }; + tx.onerror = () => reject(tx.error); + }), + ); +} + +/** 读单集进度 */ +export async function getDramaProgress(mediaId: string, subId: string): Promise { + if (!mediaId || !subId) return null; + const uid = getUid(); + try { + return await idbGet(STORE_PROGRESS, progressId(uid, mediaId, subId)); + } catch (e) { + console.log(e); + return null; + } +} + +/** 读该剧最近一次观看(用于续播哪一集) */ +export async function getDramaLastWatch(mediaId: string): Promise { + if (!mediaId) return null; + const uid = getUid(); + try { + return await idbGet(STORE_HISTORY, historyId(uid, mediaId)); + } catch (e) { + console.log(e); + return null; + } +} + +/** 写进度 + 更新该剧历史(每剧一条) */ +export async function saveDramaProgress(payload: { + mediaId: string; + subId: string; + episodeNumber: number; + progressSec: number; + title?: string; + coverUrl?: string; + totalEpisodes?: number; + heatCount?: number; + commentCount?: number; + tagName?: string; +}) { + const { mediaId, subId } = payload; + if (!mediaId || !subId) return; + + const uid = getUid(); + const record: DramaLocalProgress = { + id: progressId(uid, mediaId, subId), + uid, + mediaId, + subId, + episodeNumber: Number(payload.episodeNumber) || 1, + progressSec: Math.max(0, Math.floor(payload.progressSec || 0)), + updatedAt: Date.now(), + title: payload.title, + coverUrl: payload.coverUrl, + totalEpisodes: payload.totalEpisodes, + heatCount: payload.heatCount, + commentCount: payload.commentCount, + tagName: payload.tagName, + }; + + try { + await idbPut(STORE_PROGRESS, record); + await idbPut(STORE_HISTORY, { ...record, id: historyId(uid, mediaId) }); + await trimProgressForMedia(uid, mediaId); + await trimHistory(uid); + } catch (e) { + console.log(e); + } +} + +/** 同一剧只保留最近 N 条单集进度 */ +async function trimProgressForMedia(uid: string, mediaId: string) { + const list = await idbGetAll(STORE_PROGRESS); + const mine = list + .filter((item) => item.uid === uid && item.mediaId === mediaId) + .sort((a, b) => b.updatedAt - a.updatedAt); + if (mine.length <= PROGRESS_PER_MEDIA_MAX) return; + const overflow = mine.slice(PROGRESS_PER_MEDIA_MAX); + await Promise.all(overflow.map((item) => idbDelete(STORE_PROGRESS, item.id))); +} + +async function trimHistory(uid: string) { + const list = await idbGetAll(STORE_HISTORY); + const mine = list.filter((item) => item.uid === uid).sort((a, b) => b.updatedAt - a.updatedAt); + if (mine.length <= HISTORY_MAX) return; + const overflow = mine.slice(HISTORY_MAX); + const dropMediaIds = new Set(overflow.map((item) => item.mediaId)); + await Promise.all(overflow.map((item) => idbDelete(STORE_HISTORY, item.id))); + + // 历史被裁掉的剧,同步清掉其全部单集进度,避免 progress 无限堆积 + const progresses = await idbGetAll(STORE_PROGRESS); + await Promise.all( + progresses + .filter((p) => p.uid === uid && dropMediaIds.has(p.mediaId)) + .map((p) => idbDelete(STORE_PROGRESS, p.id)), + ); +} + +/** 我的历史:按最近观看倒序 */ +export async function getDramaHistoryList(): Promise { + const uid = getUid(); + try { + const list = await idbGetAll(STORE_HISTORY); + return list.filter((item) => item.uid === uid).sort((a, b) => b.updatedAt - a.updatedAt); + } catch (e) { + console.log(e); + return []; + } +} + +/** 删除某剧历史(含该剧全部单集进度) */ +export async function removeDramaHistory(mediaId: string) { + if (!mediaId) return; + const uid = getUid(); + try { + await idbDelete(STORE_HISTORY, historyId(uid, mediaId)); + const progresses = await idbGetAll(STORE_PROGRESS); + await Promise.all( + progresses + .filter((item) => item.uid === uid && item.mediaId === mediaId) + .map((item) => idbDelete(STORE_PROGRESS, item.id)), + ); + } catch (e) { + console.log(e); + } +} + +/** 本地历史转列表卡片模型(无详情时用缓存封面标题) */ +export function historyToSeries(item: DramaLocalProgress): Types.ShortDrama.DramaSeries { + return { + id: item.mediaId, + title: item.title || '', + coverUrl: item.coverUrl || '', + totalEpisodes: Number(item.totalEpisodes || 0), + heatCount: Number(item.heatCount || 0), + commentCount: Number(item.commentCount || 0), + likeCount: 0, + collectCount: 0, + tags: item.tagName ? [{ id: 'local-tag', name: item.tagName }] : [], + }; +} + +/** 给 episode 叠本地进度(有则覆盖) */ +export async function applyLocalProgressToEpisode( + episode: Types.ShortDrama.DramaEpisode, + mediaId?: string, +): Promise { + const mid = mediaId || episode.mediaId || ''; + if (!mid || !episode.id) return episode; + const local = await getDramaProgress(mid, episode.id); + if (!local) return episode; + return { + ...episode, + currentTimeSec: local.progressSec, + }; +} diff --git a/src/views/shortVideo/short-drama/utils/dramaPlaySeed.ts b/src/views/shortVideo/short-drama/utils/dramaPlaySeed.ts new file mode 100644 index 0000000..4808a27 --- /dev/null +++ b/src/views/shortVideo/short-drama/utils/dramaPlaySeed.ts @@ -0,0 +1,88 @@ +/** 进 shortDramaPlay 前写入,播放页 take 后立即起播,避免干等详情接口 */ + +export type DramaPlaySeed = { + series: Types.ShortDrama.DramaSeries; + episode: Types.ShortDrama.DramaEpisode; +}; + +const SEED_KEY = 'short_drama_play_seed'; +/** 离开连播页时写入,Feed 返回后本地秒切集起播(对齐红果:不堵网络) */ +const FEED_RESUME_KEY = 'short_drama_feed_resume'; + +export function setDramaPlaySeed(seed: DramaPlaySeed): void { + try { + sessionStorage.setItem(SEED_KEY, JSON.stringify(seed)); + } catch { + /* ignore quota / private mode */ + } +} + +/** 读取并清除;seriesId 不匹配则丢弃 */ +export function takeDramaPlaySeed(seriesId: string): DramaPlaySeed | null { + if (!seriesId) return null; + try { + const raw = sessionStorage.getItem(SEED_KEY); + if (!raw) return null; + sessionStorage.removeItem(SEED_KEY); + const parsed = JSON.parse(raw) as DramaPlaySeed; + if (!parsed?.series?.id || parsed.series.id !== seriesId || !parsed?.episode?.id) { + return null; + } + return parsed; + } catch { + try { + sessionStorage.removeItem(SEED_KEY); + } catch { + /* ignore */ + } + return null; + } +} + +export function clearDramaPlaySeed(): void { + try { + sessionStorage.removeItem(SEED_KEY); + } catch { + /* ignore */ + } +} + +/** 连播页返回 Feed:带齐播放地址,本地即可换集续播 */ +export function setDramaFeedResumeSeed(seed: DramaPlaySeed): void { + try { + sessionStorage.setItem(FEED_RESUME_KEY, JSON.stringify(seed)); + } catch { + /* ignore */ + } +} + +export function clearDramaFeedResumeSeed(): void { + try { + sessionStorage.removeItem(FEED_RESUME_KEY); + } catch { + /* ignore */ + } +} + +/** 读取并清除;可选校验 seriesId(不匹配则保留,留给对应剧) */ +export function takeDramaFeedResumeSeed(seriesId?: string): DramaPlaySeed | null { + try { + const raw = sessionStorage.getItem(FEED_RESUME_KEY); + if (!raw) return null; + const parsed = JSON.parse(raw) as DramaPlaySeed; + if (!parsed?.series?.id || !parsed?.episode?.id) { + sessionStorage.removeItem(FEED_RESUME_KEY); + return null; + } + if (seriesId && parsed.series.id !== seriesId) return null; + sessionStorage.removeItem(FEED_RESUME_KEY); + return parsed; + } catch { + try { + sessionStorage.removeItem(FEED_RESUME_KEY); + } catch { + /* ignore */ + } + return null; + } +} diff --git a/src/views/shortVideo/short-drama/utils/dramaPlaybackRate.ts b/src/views/shortVideo/short-drama/utils/dramaPlaybackRate.ts new file mode 100644 index 0000000..e2a4464 --- /dev/null +++ b/src/views/shortVideo/short-drama/utils/dramaPlaybackRate.ts @@ -0,0 +1,24 @@ +/** 短剧倍速选项;最高 2.0x(>2 在部分机型上会跳帧/无声) */ +export const DRAMA_PLAYBACK_RATES = [2, 1.5, 1.25, 1, 0.75] as const; + +export type DramaPlaybackRate = (typeof DRAMA_PLAYBACK_RATES)[number]; + +export const DEFAULT_DRAMA_PLAYBACK_RATE: DramaPlaybackRate = 1; + +const RATE_LABEL_MAP: Record = { + 2: '2.0x', + 1.5: '1.5x', + 1.25: '1.25x', + 1: '1.0x', + 0.75: '0.75x', +}; + +/** 展示文案:导航栏用短文案;弹窗选中默认项可带 (默认) */ +export function dramaPlaybackRateLabel(rate: number, withDefault = false): string { + const key = rate as DramaPlaybackRate; + const base = RATE_LABEL_MAP[key] || `${rate}x`; + if (withDefault && rate === DEFAULT_DRAMA_PLAYBACK_RATE) { + return `${base}(默认)`; + } + return base; +} diff --git a/src/views/shortVideo/short-drama/utils/dramaVideoInfo.ts b/src/views/shortVideo/short-drama/utils/dramaVideoInfo.ts new file mode 100644 index 0000000..13b44f5 --- /dev/null +++ b/src/views/shortVideo/short-drama/utils/dramaVideoInfo.ts @@ -0,0 +1,38 @@ +/** 将短剧单集映射为 VerticalVideo 所需的 videoInfo */ +export function dramaEpisodeToVideoInfo( + episode: Types.ShortDrama.DramaEpisode, + series?: Types.ShortDrama.DramaSeries | null, +): Types.Video.VInfosItem { + const sourceURL = episode.videoUrl || episode.playUrl || ''; + const h265Url = episode.h265Url || ''; + return { + id: episode.id, + newsType: 'SHORT', + title: series?.title || episode.title || '', + sourceURL, + h265Url, + cover: episode.coverUrl || series?.coverUrl || '', + coverThumb: episode.coverUrl || series?.coverUrl || '', + playTime: episode.durationSec || 0, + likeCount: episode.likeCount || 0, + commentCount: episode.commentCount || 0, + collectCount: episode.collectCount || 0, + coins: episode.unlockCoins || 0, + originCoins: episode.unlockCoins || 0, + freeTime: 0, + freeArea: true, + tags: (episode.tags || series?.tags || []) as any, + vidStatus: { + hasLiked: Boolean(episode.hasLiked), + hasCollected: Boolean(episode.hasCollected), + hasPaid: true, + hasFollowed: false, + }, + } as Types.Video.VInfosItem; +} + +export function canPlayDramaEpisode(episode?: Types.ShortDrama.DramaEpisode | null): boolean { + if (!episode) return false; + if (episode.lockStatus === 'locked' || episode.canPlay === false) return false; + return Boolean(episode.videoUrl || episode.h265Url || episode.playUrl); +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..ce8d1eb --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,17 @@ +/// + +interface ImportMetaEnv { + readonly VITE_APP_API_BASE_URL: string; + readonly VITE_BUILD_SOURCEMAP: string; + readonly VITE_BUILD_DROP_CONSOLE: string; + readonly VITE_BASE_URL: string; + readonly VITE_PARAMETER_ENCRYPTION: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +interface Window { + webkit: any; +} diff --git a/test_build.sh b/test_build.sh new file mode 100755 index 0000000..30e139f --- /dev/null +++ b/test_build.sh @@ -0,0 +1,7 @@ +#### 91porn测试h5 +npm run build:test +zip -q -r dist.zip dist +scp dist.zip server@116.212.120.2:/home/server/91porn/h5/test +ssh server@116.212.120.2 "/home/server/91porn/h5/test/dist.sh" +rm dist.zip +# 域名: https://91pornh5.ruishengces.com \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b51e59b --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,52 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "noImplicitAny": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "composite": true, + "suppressImplicitAnyIndexErrors": true, + "lib": [ + "ESNext", + "DOM" + ], + "skipLibCheck": true, + "noEmit": true, + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ], + "src": [ + "./src/" + ] + }, + "typeRoots": [ + "node_modules/@types", + "src/**/*.vue", + "typings" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue", + "typings/*.ts", + "typings/**/*.ts", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ], + "files": [ + "components.d.ts" + ] +} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..43539b4 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": [ + "vite.config.ts", + "src/vite-env.d.ts" + ] +} \ No newline at end of file diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo new file mode 100644 index 0000000..56e0964 --- /dev/null +++ b/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"version":"4.9.5"} \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..4e0f88a --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,148 @@ +import { defineConfig, loadEnv } from 'vite'; +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; +import vue from '@vitejs/plugin-vue'; +import Components from 'unplugin-vue-components/vite'; +import { VantResolver } from 'unplugin-vue-components/resolvers'; +import { viteVConsole } from 'vite-plugin-vconsole'; +import path from 'path'; +import viteCompression from 'vite-plugin-compression'; + +const resolve = (dir) => path.resolve(__dirname, dir); +const timeStamp = new Date().getTime(); +export default ({ command, mode }) => { + // 获取环境变量 + const env: Partial = loadEnv(mode, process.cwd()); + // https://vitejs.dev/config/ + return defineConfig({ + publicDir: resolve('public'), //静态资源服务的文件夹 + define: { + 'process.env': env, + // 配置 Vue 的水合不匹配详情特性标志 + // 在开发环境下启用以便于调试 + // 在生产环境下禁用以优化包体积 + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: mode === 'development' ? 'true' : 'false', + }, + plugins: [ + vue(), + Components({ + resolvers: [VantResolver()], + }), + // gzip压缩 生产环境生成 .gz 文件 + viteCompression({ + verbose: true, + disable: false, + threshold: 10240, + algorithm: 'gzip', + ext: '.gz', + }), + createSvgIconsPlugin({ + // 指定需要缓存的图标文件夹 + iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')], + // 指定symbolId格式 + symbolId: 'icon-[dir]-[name]', + + /** + * 自定义插入位置 + * @default: body-last + */ + // inject?: 'body-last' | 'body-first' + + /** + * custom dom id + * @default: __svg__icons__dom__ + */ + // customDomId: '__svg__icons__dom__', + }), + viteVConsole({ + entry: resolve('src/main.ts'), + localEnabled: env.VITE_BUILD_VCONSOLE === 'true', + enabled: env.VITE_BUILD_VCONSOLE === 'true', + config: { + maxLogNumber: 1000, + theme: 'light', + }, + }), + ], // 配置别名 + resolve: { + alias: { + '@': resolve('src'), + web3: 'web3/dist/web3.min.js', + }, // 导入时想要省略的扩展名列表 + extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'], + }, + optimizeDeps: { + exclude: ['@vite/client', '@vite/env'], + }, + css: { + // css预处理器 + preprocessorOptions: { + scss: { + additionalData: '@import "@/assets/styles/main.scss";', + }, + }, + }, //启动服务配置 + server: { + host: '0.0.0.0', + port: 8000, + open: true, // 自动在浏览器打开 + proxy: { + '/dcserv': { + target: 'https://api.shuifeng.cc', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/dcserv/, ''), + }, + }, + hmr: { + overlay: false, + }, + }, // 打包配置 + build: { + //浏览器兼容性 "esnext"|"modules" + target: 'modules', //指定输出路径 + outDir: 'dist', //生成静态资源的存放路径 + assetsDir: 'assets', //启用/禁用 CSS 代码拆分 + cssCodeSplit: true, + sourcemap: env.VITE_BUILD_SOURCEMAP === 'true', + assetsInlineLimit: 10240, + chunkSizeWarningLimit: 1500, // chunk 大小警告的限制(以 kbs 为单位) + minify: 'terser', + terserOptions: { + compress: { + keep_infinity: true, // 防止 Infinity 被压缩成 1/0,这可能会导致 Chrome 上的性能问题 + drop_console: env.VITE_BUILD_DROP_CONSOLE === 'true', + drop_debugger: true, + }, + }, + rollupOptions: { + input: { + main: resolve('index.html'), + }, + output: { + entryFileNames: `js/[name]-[hash].${timeStamp}.js`, + chunkFileNames: `js/[name]-[hash].${timeStamp}.js`, + assetFileNames: `[ext]/[name]-[hash].${timeStamp}.[ext]`, + manualChunks(id) { + if (!id.includes('node_modules')) return; + const pkg = id.match(/node_modules\/(?:\.pnpm\/)?((?:@[^/]+\/)?[^/@]+)/)?.[1]; + if (!pkg) return; + // vue 及其 @vue/* 必须同 chunk,拆开会导致 TDZ:Cannot access 'isFunction' before initialization + if ( + ['vue', 'vue-router', 'pinia', 'pinia-plugin-persistedstate'].includes(pkg) || + pkg.startsWith('@vue/') + ) { + return 'vue-vendor'; + } + if (pkg === 'vant') { + return 'vant'; + } + // 仅被懒加载页面使用的重库:不进共享 vendor,避免首包被拖大 + if (['xgplayer-hls.js', 'xgplayer', 'html5-qrcode', 'pinyin-pro', 'vuedraggable-es', 'spark-md5'].includes(pkg)) { + return; + } + return 'vendor'; + }, + }, + }, + }, + }); +}; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..6e622ae --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4373 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@antfu/utils@^0.7.2": + version "0.7.2" + resolved "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.2.tgz" + integrity sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g== + +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + +"@babel/compat-data@^7.20.5": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz" + integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== + +"@babel/core@^7.0.0", "@babel/core@^7.20.12": + version "7.20.12" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.0" + +"@babel/generator@^7.20.7": + version "7.20.14" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz" + integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== + dependencies: + "@babel/types" "^7.20.7" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + +"@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" + lru-cache "^5.1.1" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" + +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== + dependencies: + "@babel/types" "^7.20.2" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.20.7": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz" + integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== + dependencies: + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.13" + "@babel/types" "^7.20.7" + +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.15.8", "@babel/parser@^7.16.4", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": + version "7.20.15" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz" + integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== + +"@babel/runtime@^7.17.2": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz" + integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/standalone@^7.20.12": + version "7.20.15" + resolved "https://registry.npmjs.org/@babel/standalone/-/standalone-7.20.15.tgz" + integrity sha512-B3LmZ1NHlTb2eFEaw8rftZc730Wh9MlmsH8ubb6IjsNoIk9+SQ2aAA0nrm/1806+PftPRAACPClmKTu8PG7Tew== + +"@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + +"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.13": + version "7.20.13" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz" + integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.20.7" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.20.13" + "@babel/types" "^7.20.7" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7": + version "7.20.7" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== + dependencies: + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.4.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@humanwhocodes/config-array@^0.11.8": + version "0.11.8" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz" + integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" + integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.17" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@nuxt/kit@^3.1.1": + version "3.2.2" + resolved "https://registry.npmjs.org/@nuxt/kit/-/kit-3.2.2.tgz" + integrity sha512-T3UeLxGSNl7dQgKzmtBbPEkUiiBYgXI+KkemmpkYbQK/l+bWy2f9VQw/Rl0HkQLfRTE2fS8q8jhsOedFiEnHQQ== + dependencies: + "@nuxt/schema" "3.2.2" + c12 "^1.1.2" + consola "^2.15.3" + defu "^6.1.2" + globby "^13.1.3" + hash-sum "^2.0.0" + ignore "^5.2.4" + jiti "^1.17.1" + knitwork "^1.0.0" + lodash.template "^4.5.0" + mlly "^1.1.1" + pathe "^1.1.0" + pkg-types "^1.0.2" + scule "^1.0.0" + semver "^7.3.8" + unctx "^2.1.2" + unimport "^2.2.4" + untyped "^1.2.2" + +"@nuxt/schema@3.2.2": + version "3.2.2" + resolved "https://registry.npmjs.org/@nuxt/schema/-/schema-3.2.2.tgz" + integrity sha512-o3O2OqLAMKqb/DlGpK8eJq4tH29NA4OMaohknSSXl35+Nw/qHB5eOLDz+cFxNE+MKHoMj1rRVMCfi/Y/PrCN6g== + dependencies: + c12 "^1.1.2" + create-require "^1.1.1" + defu "^6.1.2" + hookable "^5.4.2" + jiti "^1.17.1" + pathe "^1.1.0" + pkg-types "^1.0.2" + postcss-import-resolver "^2.0.0" + scule "^1.0.0" + std-env "^3.3.2" + ufo "^1.1.0" + unimport "^2.2.4" + untyped "^1.2.2" + +"@rollup/pluginutils@^5.0.2": + version "5.0.2" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" + integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/crypto-js@^4.1.1": + version "4.1.1" + resolved "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz" + integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.40.0" + resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-8.40.0.tgz" + integrity sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" + integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.11" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + +"@types/node@*", "@types/node@^18.13.0", "@types/node@>= 14": + version "18.14.0" + resolved "https://registry.npmjs.org/@types/node/-/node-18.14.0.tgz" + integrity sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A== + +"@types/qs@^6.9.7": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/semver@^7.3.12": + version "7.3.13" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" + integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + +"@types/spark-md5@^3.0.2": + version "3.0.2" + resolved "https://registry.npmjs.org/@types/spark-md5/-/spark-md5-3.0.2.tgz" + integrity sha512-82E/lVRaqelV9qmRzzJ1PKTpyrpnT7mwdneKNJB9hUtypZDMggloDfFUCIqRRx3lYRxteCwXSq9c+W71Vf0QnQ== + +"@types/svgo@^2.6.1": + version "2.6.4" + resolved "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz" + integrity sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.50.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz" + integrity sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg== + dependencies: + "@typescript-eslint/scope-manager" "5.52.0" + "@typescript-eslint/type-utils" "5.52.0" + "@typescript-eslint/utils" "5.52.0" + debug "^4.3.4" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + regexpp "^3.2.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.50.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz" + integrity sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA== + dependencies: + "@typescript-eslint/scope-manager" "5.52.0" + "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/typescript-estree" "5.52.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz" + integrity sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw== + dependencies: + "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/visitor-keys" "5.52.0" + +"@typescript-eslint/type-utils@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz" + integrity sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw== + dependencies: + "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/utils" "5.52.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz" + integrity sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ== + +"@typescript-eslint/typescript-estree@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz" + integrity sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ== + dependencies: + "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/visitor-keys" "5.52.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz" + integrity sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA== + dependencies: + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.52.0" + "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/typescript-estree" "5.52.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.52.0": + version "5.52.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz" + integrity sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA== + dependencies: + "@typescript-eslint/types" "5.52.0" + eslint-visitor-keys "^3.3.0" + +"@vant/popperjs@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@vant/popperjs/-/popperjs-1.3.0.tgz" + integrity sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw== + +"@vant/use@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@vant/use/-/use-1.5.0.tgz" + integrity sha512-Dk7aMn7gLpoDew2tix/mjXpP0PoERWcxWh+pRY4xxl0MG4eeByAAyZSE6PgMpof4Yorqn7yq8KmeQcaVnxq2cg== + +"@vitejs/plugin-vue@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz" + integrity sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw== + +"@volar/language-core@1.2.0-alpha.16": + version "1.2.0-alpha.16" + resolved "https://registry.npmjs.org/@volar/language-core/-/language-core-1.2.0-alpha.16.tgz" + integrity sha512-aIktWe9Zg0M+u/RIXHCuL+IoLRHTrpsbTib8olrg4etlurHDXahoVhoEnH9wmlliray0iigIo2z5vwueYInp3g== + dependencies: + "@volar/source-map" "1.2.0-alpha.16" + +"@volar/source-map@1.2.0-alpha.16": + version "1.2.0-alpha.16" + resolved "https://registry.npmjs.org/@volar/source-map/-/source-map-1.2.0-alpha.16.tgz" + integrity sha512-/AK3VqnFqONd221COI2ZnEvfgBulfoQkjA/ZjPOXpsOkWri99TLcfZY/NTQRytp7Hx6EP/1p1DDeyGuMCUYjgA== + dependencies: + muggle-string "^0.2.2" + +"@volar/typescript@1.2.0-alpha.16": + version "1.2.0-alpha.16" + resolved "https://registry.npmjs.org/@volar/typescript/-/typescript-1.2.0-alpha.16.tgz" + integrity sha512-ltlTLHIkLxgmTVBZmOnhmnlNzEj2lpvlBmmaV2GWYTrBUMt0z1OgeCq0Utlj9HjjrGPhwWxZNkv86ZABgrMA3Q== + dependencies: + "@volar/language-core" "1.2.0-alpha.16" + +"@volar/vue-language-core@1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.1.4.tgz" + integrity sha512-2C2CwHvaT5AzNzDbYZQ85lNr4jACZARoZMZBLuU5+JyIwhWeAfxvyAeoE3VbgfgycN5t6X4uBqx/Wzh1QLgD8Q== + dependencies: + "@volar/language-core" "1.2.0-alpha.16" + "@volar/source-map" "1.2.0-alpha.16" + "@vue/compiler-dom" "^3.2.47" + "@vue/compiler-sfc" "^3.2.47" + "@vue/reactivity" "^3.2.47" + "@vue/shared" "^3.2.47" + minimatch "^6.1.6" + muggle-string "^0.2.2" + vue-template-compiler "^2.7.14" + +"@volar/vue-typescript@1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.1.4.tgz" + integrity sha512-x5i5TUUXb1PM0rM80Y8XUeMBUcoS3/TjR3WTxvvEUIol9uEOPp6uxxQQ67uSv7ocN6vB0LugJqS6FA7Z93oL0Q== + dependencies: + "@volar/typescript" "1.2.0-alpha.16" + "@volar/vue-language-core" "1.1.4" + +"@vue/compiler-core@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz" + integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.47" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@^3.2.47", "@vue/compiler-dom@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz" + integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ== + dependencies: + "@vue/compiler-core" "3.2.47" + "@vue/shared" "3.2.47" + +"@vue/compiler-sfc@^3.2.47", "@vue/compiler-sfc@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz" + integrity sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.47" + "@vue/compiler-dom" "3.2.47" + "@vue/compiler-ssr" "3.2.47" + "@vue/reactivity-transform" "3.2.47" + "@vue/shared" "3.2.47" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz" + integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw== + dependencies: + "@vue/compiler-dom" "3.2.47" + "@vue/shared" "3.2.47" + +"@vue/devtools-api@^6.4.5": + version "6.5.0" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz" + integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== + +"@vue/reactivity-transform@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz" + integrity sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.47" + "@vue/shared" "3.2.47" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/reactivity@^3.2.47", "@vue/reactivity@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz" + integrity sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ== + dependencies: + "@vue/shared" "3.2.47" + +"@vue/runtime-core@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz" + integrity sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA== + dependencies: + "@vue/reactivity" "3.2.47" + "@vue/shared" "3.2.47" + +"@vue/runtime-dom@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz" + integrity sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA== + dependencies: + "@vue/runtime-core" "3.2.47" + "@vue/shared" "3.2.47" + csstype "^2.6.8" + +"@vue/server-renderer@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz" + integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA== + dependencies: + "@vue/compiler-ssr" "3.2.47" + "@vue/shared" "3.2.47" + +"@vue/shared@^3.2.47", "@vue/shared@3.2.47": + version "3.2.47" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz" + integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== + +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2: + version "8.8.2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz" + integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" + integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + dependencies: + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +axios@^1.3.2: + version "1.18.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/axios/-/axios-1.18.0.tgz" + integrity sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw== + dependencies: + follow-redirects "^1.16.0" + form-data "^4.0.5" + https-proxy-agent "^5.0.1" + proxy-from-env "^2.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird@^3.5.0: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^2.2.2: + version "2.3.2" + resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4, "browserslist@>= 4.21.0": + version "4.21.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +c12@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/c12/-/c12-1.1.2.tgz" + integrity sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA== + dependencies: + defu "^6.1.2" + dotenv "^16.0.3" + giget "^1.1.0" + jiti "^1.17.1" + mlly "^1.1.1" + pathe "^1.1.0" + pkg-types "^1.0.2" + rc9 "^2.0.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: + version "1.0.30001457" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001457.tgz" + integrity sha512-SDIV6bgE1aVbK6XyxdURbUE89zY7+k1BBBaOwYwkNCglXlel/E7mELiHC64HQ+W0xSKlqWhV9Wh7iHxUjMs4fA== + +chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.3.2: + version "2.4.2" + resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +clipboard@^2.0.6: + version "2.0.11" + resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz" + integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +clone@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" + integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" + integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colorette@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.15.1, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +compare-versions@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz" + integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA== + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +consola@^2.15.3: + version "2.15.3" + resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" + integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== + +copy-text-to-clipboard@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz" + integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== + +core-js@^3.11.0, core-js@>=3.12.1: + version "3.28.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.28.0.tgz" + integrity sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +create-require@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +csstype@^2.6.8: + version "2.6.21" + resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz" + integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== + +d@^1.0.1, d@1: + version "1.0.1" + resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +danmu.js@^1.1.2: + version "1.1.8" + resolved "https://registry.npmmirror.com/danmu.js/-/danmu.js-1.1.8.tgz" + integrity sha512-GIFSHqJ+HFTGLLaL2BHMPBaOuPY1bWPwC0Pvi/V06uMIoxNTyEGxMuoO2SzNHsDvKC/r252zR9T/Gwx93AaKfw== + dependencies: + event-emitter "^0.3.5" + +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" + integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^2.3.3: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decode-uri-component@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" + integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz" + integrity sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ== + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +defu@^6.1.2: + version "6.1.2" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz" + integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +destr@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/destr/-/destr-1.2.2.tgz" + integrity sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA== + +devtools-detector@^2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/devtools-detector/-/devtools-detector-2.0.14.tgz" + integrity sha512-lI7zNCDL+a6jusFIYG5zztJSGt6gNV+rtoDAm9Z00MhHKMHQxh58oLYLz0xlv0tFwbzl1S0Qq6P87iznwwEcGw== + dependencies: + compare-versions "^3.6.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom7@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz" + integrity sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA== + dependencies: + ssr-window "^4.0.0" + +domelementtype@^1.3.1, domelementtype@1: + version "1.3.1" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^2.3.0: + version "2.4.2" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz" + integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== + dependencies: + domelementtype "1" + +domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + +downloadjs@1.4.7: + version "1.4.7" + resolved "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz" + integrity sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q== + +draggabilly@^2.2.0: + version "2.4.1" + resolved "https://registry.npmmirror.com/draggabilly/-/draggabilly-2.4.1.tgz" + integrity sha512-HHHLPEPZqRXIDQDFRFdK7RONZausNlJ4WkA73ST7Z6O2HPWttxFHVwHo8nccuDLzXWwiVKRVuc6fTkW+CQA++A== + dependencies: + get-size "^2.0.2" + unidragger "^2.4.0" + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +electron-to-chromium@^1.4.284: + version "1.4.302" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.302.tgz" + integrity sha512-Uk7C+7aPBryUR1Fwvk9VmipBcN9fVsqBO57jV2ZjTm+IZ6BMNqu7EDVEg2HxCNufk6QcWlFsBkhQyQroB2VWKw== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +enhanced-resolve@^4.1.1: + version "4.5.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@^5.14.1: + version "5.14.1" + resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz" + integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" + integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +errno@^0.1.3: + version "0.1.8" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1: + version "1.2.1" + resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz" + integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.2" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-object-atoms/-/es-object-atoms-1.1.2.tgz" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14: + version "0.10.62" + resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +esbuild-darwin-arm64@0.15.18: + version "0.15.18" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz" + integrity sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA== + +esbuild@^0.15.9: + version "0.15.18" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz" + integrity sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q== + optionalDependencies: + "@esbuild/android-arm" "0.15.18" + "@esbuild/linux-loong64" "0.15.18" + esbuild-android-64 "0.15.18" + esbuild-android-arm64 "0.15.18" + esbuild-darwin-64 "0.15.18" + esbuild-darwin-arm64 "0.15.18" + esbuild-freebsd-64 "0.15.18" + esbuild-freebsd-arm64 "0.15.18" + esbuild-linux-32 "0.15.18" + esbuild-linux-64 "0.15.18" + esbuild-linux-arm "0.15.18" + esbuild-linux-arm64 "0.15.18" + esbuild-linux-mips64le "0.15.18" + esbuild-linux-ppc64le "0.15.18" + esbuild-linux-riscv64 "0.15.18" + esbuild-linux-s390x "0.15.18" + esbuild-netbsd-64 "0.15.18" + esbuild-openbsd-64 "0.15.18" + esbuild-sunos-64 "0.15.18" + esbuild-windows-32 "0.15.18" + esbuild-windows-64 "0.15.18" + esbuild-windows-arm64 "0.15.18" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + +escape-string-regexp@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-config-prettier@^8.6.0: + version "8.6.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz" + integrity sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA== + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-vue@^9.9.0: + version "9.9.0" + resolved "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz" + integrity sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ== + dependencies: + eslint-utils "^3.0.0" + natural-compare "^1.4.0" + nth-check "^2.0.1" + postcss-selector-parser "^6.0.9" + semver "^7.3.5" + vue-eslint-parser "^9.0.1" + xml-name-validator "^4.0.0" + +eslint-scope@^5.1.1, eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", eslint@^8.33.0, eslint@>=5, eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=7.28.0: + version "8.34.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz" + integrity sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg== + dependencies: + "@eslint/eslintrc" "^1.4.1" + "@humanwhocodes/config-array" "^0.11.8" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.4.0" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + grapheme-splitter "^1.0.4" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-sdsl "^4.1.4" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.1" + regexpp "^3.2.0" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.3.1, espree@^9.4.0: + version "9.4.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz" + integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + dependencies: + acorn "^8.8.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" + +esquery@^1.4.0: + version "1.4.2" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz" + integrity sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@^1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +ev-emitter@^1.0.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/ev-emitter/-/ev-emitter-1.1.1.tgz" + integrity sha512-ipiDYhdQSCZ4hSbX4rMW+XzNKMD1prg/sTvoVmSLkuQ1MVlwjJQQA+sW8tMYR3BLUr9KjodFV4pvzunvRhd33Q== + +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + +eventemitter3@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" + integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.2: + version "2.0.4" + resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.2.12" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + 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.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.16.0: + version "1.16.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/follow-redirects/-/follow-redirects-1.16.0.tgz" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +form-data@^4.0.5: + version "4.0.6" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/form-data/-/form-data-4.0.6.tgz" + integrity sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.4" + mime-types "^2.1.35" + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== + dependencies: + map-cache "^0.2.2" + +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-5.0.0.tgz" + integrity sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/get-intrinsic/-/get-intrinsic-1.3.0.tgz" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/get-proto/-/get-proto-1.0.1.tgz" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +get-size@^2.0.2: + version "2.0.3" + resolved "https://registry.npmmirror.com/get-size/-/get-size-2.0.3.tgz" + integrity sha512-lXNzT/h/dTjTxRbm9BXb+SGxxzkm97h/PCIKtlN/CBCxxmkkIVV21udumMS93MuVTDX583gqc94v3RjuHmI+2Q== + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== + +giget@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz" + integrity sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A== + dependencies: + colorette "^2.0.19" + defu "^6.1.2" + https-proxy-agent "^5.0.1" + mri "^1.2.0" + node-fetch-native "^1.0.2" + pathe "^1.1.0" + tar "^6.1.13" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +globby@^13.1.3: + version "13.1.3" + resolved "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz" + integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz" + integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== + dependencies: + delegate "^3.1.2" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.10" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== + +grapheme-splitter@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" + integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" + integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" + integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" + integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" + integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-sum@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz" + integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== + +hasown@^2.0.2, hasown@^2.0.4: + version "2.0.4" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/hasown/-/hasown-2.0.4.tgz" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== + dependencies: + function-bind "^1.1.2" + +he@^1.1.1, he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hls.js@^1.2.9: + version "1.3.3" + resolved "https://registry.npmjs.org/hls.js/-/hls.js-1.3.3.tgz" + integrity sha512-4Efu6g90HfFGDuQrkquhDoRpA/4iVpSMcfK9zguJ2qXEUfo5VknZt6rziwwFPHmC2DU3crZ0NtPD0eUqOhFyqg== + +hookable@^5.4.2: + version "5.4.2" + resolved "https://registry.npmjs.org/hookable/-/hookable-5.4.2.tgz" + integrity sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg== + +html5-qrcode@^2.3.8: + version "2.3.8" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/html5-qrcode/-/html5-qrcode-2.3.8.tgz" + integrity sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ== + +htmlparser2@^3.8.3: + version "3.10.1" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz" + integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== + dependencies: + domelementtype "^1.3.1" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^3.1.1" + +https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@^0.5.1: + version "0.5.5" + resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== + +immutable@^4.0.0: + version "4.2.4" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz" + integrity sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-core-module@^2.9.0: + version "2.11.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" + integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.1: + version "1.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isarray@~1.0.0, isarray@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== + dependencies: + isarray "1.0.0" + +isobject@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jiti@^1.17.1: + version "1.17.1" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.17.1.tgz" + integrity sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw== + +js-base64@^2.1.9: + version "2.6.4" + resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" + integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== + +js-md5@^0.8.3: + version "0.8.3" + resolved "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz" + integrity sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ== + +js-sdsl@^4.1.4: + version "4.3.0" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz" + integrity sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +kind-of@^3.0.2, kind-of@^3.0.3: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klona@^2.0.4: + version "2.0.6" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +knitwork@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/knitwork/-/knitwork-1.0.0.tgz" + integrity sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +local-pkg@^0.4.3: + version "0.4.3" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz" + integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz" + integrity sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.template@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz" + integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz" + integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== + dependencies: + lodash._reinterpolate "^3.0.0" + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" + integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== + dependencies: + object-visit "^1.0.0" + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-options@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz" + integrity sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg== + dependencies: + is-plain-obj "^1.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +micromatch@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz" + integrity sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.2.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^2.0.2" + fragment-cache "^0.2.1" + kind-of "^5.0.2" + nanomatch "^1.2.1" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27, mime-types@^2.1.35: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^6.1.6: + version "6.2.0" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz" + integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz" + integrity sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw== + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mitt@^3.0.1: + version "3.0.1" + resolved "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mlly@^1.1.0, mlly@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.1.1.tgz" + integrity sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw== + dependencies: + acorn "^8.8.2" + pathe "^1.1.0" + pkg-types "^1.0.1" + ufo "^1.1.0" + +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +mri@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" + integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +muggle-string@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz" + integrity sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg== + +mutation-observer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/mutation-observer/-/mutation-observer-1.0.3.tgz" + integrity sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA== + +nanoid@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanomatch@^1.2.1: + version "1.2.13" + resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + +node-fetch-native@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.0.2.tgz" + integrity sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ== + +node-releases@^2.0.8: + version "2.0.10" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" + integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" + integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== + dependencies: + isobject "^3.0.1" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathe@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz" + integrity sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw== + +pathe@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz" + integrity sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pinia-plugin-persistedstate@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-3.1.0.tgz" + integrity sha512-8UN+vYMEPBdgNLwceY08mi5olI0wkYaEb8b6hD6xW7SnBRuPydWHlEhZvUWgNb/ibuf4PvufpvtS+dmhYjJQOw== + +pinia@^2.0.0, pinia@^2.0.30: + version "2.0.30" + resolved "https://registry.npmjs.org/pinia/-/pinia-2.0.30.tgz" + integrity sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA== + dependencies: + "@vue/devtools-api" "^6.4.5" + vue-demi "*" + +pinyin-pro@^3.13.0: + version "3.13.0" + resolved "https://registry.npmjs.org/pinyin-pro/-/pinyin-pro-3.13.0.tgz" + integrity sha512-mwXkm0fbNdyBqWMCkpmPDT3by8nAIROpQBtJPd2zCQtYn/ED2KWe42X7gZ96R7jZz8zPzaWk5yq93BnOOucNNw== + +pkg-types@^1.0.1, pkg-types@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz" + integrity sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ== + dependencies: + jsonc-parser "^3.2.0" + mlly "^1.1.1" + pathe "^1.1.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== + +postcss-import-resolver@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/postcss-import-resolver/-/postcss-import-resolver-2.0.0.tgz" + integrity sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw== + dependencies: + enhanced-resolve "^4.1.1" + +postcss-prefix-selector@^1.6.0: + version "1.16.0" + resolved "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz" + integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q== + +postcss-px-to-viewport-8-plugin@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/postcss-px-to-viewport-8-plugin/-/postcss-px-to-viewport-8-plugin-1.2.0.tgz" + integrity sha512-3mbLHcJSb8LymP3zIsvwBkumkyfau5IMEGcn83dzELIRi83yKbIuJCKv3sDZW5XaJs3CntdncYugHWffbubCsg== + dependencies: + object-assign "^4.1.1" + +postcss-selector-parser@^6.0.9: + version "6.0.11" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz" + integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^5.2.17: + version "5.2.18" + resolved "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz" + integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== + dependencies: + chalk "^1.1.3" + js-base64 "^2.1.9" + source-map "^0.5.6" + supports-color "^3.2.3" + +postcss@^8.1.0, postcss@^8.1.10, postcss@^8.4.18, "postcss@>4 <9": + version "8.4.21" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +posthtml-parser@^0.2.0, posthtml-parser@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz" + integrity sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw== + dependencies: + htmlparser2 "^3.8.3" + isobject "^2.1.0" + +posthtml-rename-id@^1.0: + version "1.0.12" + resolved "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz" + integrity sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw== + dependencies: + escape-string-regexp "1.0.5" + +posthtml-render@^1.0.5, posthtml-render@^1.0.6: + version "1.4.0" + resolved "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz" + integrity sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw== + +posthtml-svg-mode@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz" + integrity sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ== + dependencies: + merge-options "1.0.1" + posthtml "^0.9.2" + posthtml-parser "^0.2.1" + posthtml-render "^1.0.6" + +posthtml@^0.9.2: + version "0.9.2" + resolved "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz" + integrity sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q== + dependencies: + posthtml-parser "^0.2.0" + posthtml-render "^1.0.5" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.8.3, prettier@>=2.0.0: + version "2.8.4" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz" + integrity sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://packages.aliyun.com/67c6c2a49f45126533f3b576/npm/npm-registry/proxy-from-env/-/proxy-from-env-2.1.0.tgz" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qrcode.vue@^3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.3.3.tgz" + integrity sha512-OsD4tQjIbxg/K6D5ZkWjBdYI9eg9K2i8qeYILdEAX5mdAydSAxV7xKmmZSP/hA12olLqEMZ9ryqDQrwa9jEMgw== + +qs@^6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +query-string@^4.3.2: + version "4.3.4" + resolved "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" + integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q== + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +rc9@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/rc9/-/rc9-2.0.1.tgz" + integrity sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA== + dependencies: + defu "^6.1.2" + destr "^1.2.2" + flat "^5.0.2" + +readable-stream@^2.0.1: + version "2.3.7" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1: + version "3.6.0" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpp@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== + +resolve@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup@^1.20.0||^2.0.0||^3.0.0, rollup@^2.79.1: + version "2.79.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== + dependencies: + ret "~0.1.10" + +sass-loader@^13.2.0: + version "13.2.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz" + integrity sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@*, sass@^1.3.0, sass@^1.58.0: + version "1.58.3" + resolved "https://registry.npmjs.org/sass/-/sass-1.58.3.tgz" + integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +schema-utils@^3.1.1, schema-utils@^3.1.2: + version "3.1.2" + resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.1.2.tgz" + integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +scule@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz" + integrity sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ== + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz" + integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +sortablejs@1.14.0: + version "1.14.0" + resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz" + integrity sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w== + +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spark-md5@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz" + integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +ssr-window@^4.0.0, ssr-window@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz" + integrity sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ== + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +std-env@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz" + integrity sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA== + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-literal@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz" + integrity sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q== + dependencies: + acorn "^8.8.2" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== + +supports-color@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg-baker@1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz" + integrity sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg== + dependencies: + bluebird "^3.5.0" + clone "^2.1.1" + he "^1.1.1" + image-size "^0.5.1" + loader-utils "^1.1.0" + merge-options "1.0.1" + micromatch "3.1.0" + postcss "^5.2.17" + postcss-prefix-selector "^1.6.0" + posthtml-rename-id "^1.0" + posthtml-svg-mode "^1.0.3" + query-string "^4.3.2" + traverse "^0.6.6" + +svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +swiper@^8.4.5: + version "8.4.7" + resolved "https://registry.npmjs.org/swiper/-/swiper-8.4.7.tgz" + integrity sha512-VwO/KU3i9IV2Sf+W2NqyzwWob4yX9Qdedq6vBtS0rFqJ6Fa5iLUJwxQkuD4I38w0WDJwmFl8ojkdcRFPHWD+2g== + dependencies: + dom7 "^4.0.4" + ssr-window "^4.0.2" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.1.13: + version "6.1.13" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^4.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" + +terser@^5.16.3, terser@^5.16.8, terser@^5.4.0: + version "5.17.6" + resolved "https://registry.npmmirror.com/terser/-/terser-5.17.6.tgz" + integrity sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ== + dependencies: + "@jridgewell/source-map" "^0.3.2" + acorn "^8.5.0" + commander "^2.20.0" + source-map-support "~0.5.20" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +traverse@^0.6.6: + version "0.6.7" + resolved "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz" + integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.npmjs.org/type/-/type-2.7.2.tgz" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + +typescript@*, typescript@^4.9.3, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.4.4: + version "4.9.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +ufo@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.1.0.tgz" + integrity sha512-LQc2s/ZDMaCN3QLpa+uzHUOQ7SdV0qgv3VBXOolQGXTaaZpIur6PwUclF5nN2hNkiTRcUugXd1zFOW3FLJ135Q== + +unctx@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/unctx/-/unctx-2.1.2.tgz" + integrity sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg== + dependencies: + acorn "^8.8.2" + estree-walker "^3.0.3" + magic-string "^0.27.0" + unplugin "^1.0.1" + +unidragger@^2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/unidragger/-/unidragger-2.4.0.tgz" + integrity sha512-MueZK2oXuGE6OAlGKIrSXK2zCq+8yb1QUZgqyTDCSJzvwYL0g2Llrad+TtoQTYxtFnNyxxSw0IMnKNIgEMia1w== + dependencies: + unipointer "^2.4.0" + +unimport@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/unimport/-/unimport-2.2.4.tgz" + integrity sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw== + dependencies: + "@rollup/pluginutils" "^5.0.2" + escape-string-regexp "^5.0.0" + fast-glob "^3.2.12" + local-pkg "^0.4.3" + magic-string "^0.27.0" + mlly "^1.1.0" + pathe "^1.1.0" + pkg-types "^1.0.1" + scule "^1.0.0" + strip-literal "^1.0.0" + unplugin "^1.0.1" + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unipointer@^2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/unipointer/-/unipointer-2.4.0.tgz" + integrity sha512-VjzDLPjGK7aYpQKH7bnDZS8X4axF5AFU/LQi+NQe1oyEHfaz6lWKhaQ7n4o7vJ1iJ4i2T0quCIfrQM139p05Sw== + dependencies: + ev-emitter "^1.0.1" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unplugin-vue-components@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.23.0.tgz" + integrity sha512-JAJ+BGvjHvi9P7lICwOzDx2Av+OcI6ZTzvySmjXDNGCNVPrt2NQQmbcp7cW027CR1mRugIX5G//awm3doHyqkg== + dependencies: + "@antfu/utils" "^0.7.2" + "@nuxt/kit" "^3.1.1" + "@rollup/pluginutils" "^5.0.2" + chokidar "^3.5.3" + debug "^4.3.4" + fast-glob "^3.2.12" + local-pkg "^0.4.3" + magic-string "^0.27.0" + minimatch "^6.1.6" + resolve "^1.22.1" + unplugin "^1.0.1" + +unplugin@^1.0.1: + version "1.1.0" + resolved "https://registry.npmjs.org/unplugin/-/unplugin-1.1.0.tgz" + integrity sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A== + dependencies: + acorn "^8.8.2" + chokidar "^3.5.3" + webpack-sources "^3.2.3" + webpack-virtual-modules "^0.5.0" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untyped@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/untyped/-/untyped-1.2.2.tgz" + integrity sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw== + dependencies: + "@babel/core" "^7.20.12" + "@babel/standalone" "^7.20.12" + "@babel/types" "^7.20.7" + scule "^1.0.0" + +update-browserslist-db@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +vant@^4.0.10: + version "4.0.11" + resolved "https://registry.npmjs.org/vant/-/vant-4.0.11.tgz" + integrity sha512-axVP6eHH4vGb5FQ2hqNhB5DykMSBQb0KK97HT4bVVFTYM81EJq1YImqOglzsVt3OC98NRoT01DIwt4y2n1iwVw== + dependencies: + "@vant/popperjs" "^1.3.0" + "@vant/use" "^1.5.0" + +vary@^1: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vconsole@^3.15.0: + version "3.15.0" + resolved "https://registry.npmjs.org/vconsole/-/vconsole-3.15.0.tgz" + integrity sha512-8hq7wabPcRucSWQyN7/1tthMawP9JPvM95zgtMHpPknMMMCKj+abpoK7P7oKK4B0qw58C24Mdvo9+raUdpHyVQ== + dependencies: + "@babel/runtime" "^7.17.2" + copy-text-to-clipboard "^3.0.1" + core-js "^3.11.0" + mutation-observer "^1.0.3" + +vite-plugin-compression@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz" + integrity sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg== + dependencies: + chalk "^4.1.2" + debug "^4.3.3" + fs-extra "^10.0.0" + +vite-plugin-svg-icons@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz" + integrity sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA== + dependencies: + "@types/svgo" "^2.6.1" + cors "^2.8.5" + debug "^4.3.3" + etag "^1.8.1" + fs-extra "^10.0.0" + pathe "^0.2.0" + svg-baker "1.7.0" + svgo "^2.8.0" + +vite-plugin-vconsole@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/vite-plugin-vconsole/-/vite-plugin-vconsole-1.3.1.tgz" + integrity sha512-fSuk+UROXpxIZsQID7/CSvBxIRO4Zug5P+Qv8H2Rdnl4ks9nAhSCzNBE4amyZhJLJE1Rl4z0EMIOomK8sHLugQ== + +vite@^3.0.0, vite@^3.2.5, vite@>=2.0.0: + version "3.2.5" + resolved "https://registry.npmjs.org/vite/-/vite-3.2.5.tgz" + integrity sha512-4mVEpXpSOgrssFZAOmGIr85wPHKvaDAcXqxVxVRZhljkJOMZi1ibLibzjLHzJvcok8BMguLc7g1W6W/GqZbLdQ== + dependencies: + esbuild "^0.15.9" + postcss "^8.4.18" + resolve "^1.22.1" + rollup "^2.79.1" + optionalDependencies: + fsevents "~2.3.2" + +vue-clipboard3@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz" + integrity sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A== + dependencies: + clipboard "^2.0.6" + +vue-demi@*: + version "0.13.11" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz" + integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A== + +vue-eslint-parser@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz" + integrity sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ== + dependencies: + debug "^4.3.4" + eslint-scope "^7.1.1" + eslint-visitor-keys "^3.3.0" + espree "^9.3.1" + esquery "^1.4.0" + lodash "^4.17.21" + semver "^7.3.6" + +vue-router@^4.1.6: + version "4.1.6" + resolved "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz" + integrity sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ== + dependencies: + "@vue/devtools-api" "^6.4.5" + +vue-template-compiler@^2.7.14: + version "2.7.14" + resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz" + integrity sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ== + dependencies: + de-indent "^1.0.2" + he "^1.2.0" + +vue-tsc@^1.0.24: + version "1.1.4" + resolved "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.1.4.tgz" + integrity sha512-CMG8KZsBBPyulYie05XxJCfq/yAPiB/uMMeHmog09aLm2Kml82C6tUSRgQz8ujM4JoCrpDqVCd9G0NuM9aLt1g== + dependencies: + "@volar/vue-language-core" "1.1.4" + "@volar/vue-typescript" "1.1.4" + +"vue@^2.6.14 || ^3.2.0", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.25, vue@^3.2.31, vue@^3.2.45, "vue@2 || 3", vue@3.2.47: + version "3.2.47" + resolved "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz" + integrity sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ== + dependencies: + "@vue/compiler-dom" "3.2.47" + "@vue/compiler-sfc" "3.2.47" + "@vue/runtime-dom" "3.2.47" + "@vue/server-renderer" "3.2.47" + "@vue/shared" "3.2.47" + +vuedraggable-es@^4.1.1: + version "4.1.1" + resolved "https://registry.npmmirror.com/vuedraggable-es/-/vuedraggable-es-4.1.1.tgz" + integrity sha512-F35pjSwC8HS/lnaOd+B59nYR4FZmwuhWAzccK9xftRuWds8SU1TZh5myKVM86j5dFOI7S26O64Kwe7LUHnXjlA== + dependencies: + sortablejs "1.14.0" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack-virtual-modules@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz" + integrity sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw== + +webpack@^5.0.0, webpack@^5.1.0: + version "5.84.1" + resolved "https://registry.npmmirror.com/webpack/-/webpack-5.84.1.tgz" + integrity sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.14.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.2" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +xgplayer-hls.js@^2.6.4: + version "2.6.4" + resolved "https://registry.npmjs.org/xgplayer-hls.js/-/xgplayer-hls.js-2.6.4.tgz" + integrity sha512-yHIXppRRGWVCZqkI+sAa6lFUXgocd87rk0BhGks04ARh4T8sMrpOBhyNq1PDolPu/mbOvIe8iwG4VwDJFkdwvg== + dependencies: + deepmerge "2.0.1" + event-emitter "^0.3.5" + eventemitter3 "^4.0.7" + hls.js "^1.2.9" + +xgplayer-subtitles@^1.0.19: + version "1.1.1" + resolved "https://registry.npmmirror.com/xgplayer-subtitles/-/xgplayer-subtitles-1.1.1.tgz" + integrity sha512-GYzrK/e4ydAATP3Xg06sXYliiSCcyNIqqQSwnWbs7pw+cc5NwyrYXuLfa3Bp9skIxT6pT+A7qTicUps58N3eEQ== + dependencies: + eventemitter3 "^4.0.7" + +xgplayer@^2.0.0: + version "2.32.2" + resolved "https://registry.npmmirror.com/xgplayer/-/xgplayer-2.32.2.tgz" + integrity sha512-VWK8Hp5K3Fs5YoHadpyCw2zwuiOimRjkPo2PSJZPYKj59VNnL9oLruZp6cy86LHoAgWELRIQj6Nmw5SkQNByWQ== + dependencies: + chalk "^2.3.2" + commander "^2.15.1" + danmu.js "^1.1.2" + downloadjs "1.4.7" + draggabilly "^2.2.0" + event-emitter "^0.3.5" + fs-extra "^5.0.0" + xgplayer-subtitles "^1.0.19" + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==