├── i-007.enc ├── DLsite-Play-Downloader-vue ├── .vite │ └── deps │ │ ├── package.json │ │ └── _metadata.json ├── .vscode │ └── extensions.json ├── src │ ├── style.css │ ├── dlsiteplay-enc-detector │ │ ├── type.ts │ │ ├── puzzle.js │ │ └── xor.js │ ├── vite-env.d.ts │ ├── utils.js │ ├── origConsole.js │ ├── main.ts │ ├── log.js │ ├── hookFetch.js │ └── App.vue ├── tsconfig.json ├── tsconfig.tsbuildinfo ├── .gitignore ├── package.json ├── tsconfig.node.json ├── README.md ├── tsconfig.app.json ├── vite.config.ts └── package-lock.json ├── decrypted.webp ├── README.md ├── de.py ├── LICENSE └── DLsite-Play-Downloader-old.user.js /i-007.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cpuopt/DLsite-Play-Downloader/HEAD/i-007.enc -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/.vite/deps/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /decrypted.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cpuopt/DLsite-Play-Downloader/HEAD/decrypted.webp -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/style.css: -------------------------------------------------------------------------------- 1 | .dlsite-play-downloader-vue { 2 | position: fixed; 3 | z-index: 9999; 4 | } -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/tsconfig.tsbuildinfo: -------------------------------------------------------------------------------- 1 | {"root":["./vite.config.ts","./src/app.vue","./src/main.ts","./src/vite-env.d.ts","./src/dlsiteplay-enc-detector/type.ts"],"errors":true,"version":"5.9.2"} -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/dlsiteplay-enc-detector/type.ts: -------------------------------------------------------------------------------- 1 | export type ENC_METHOD = "xor" | "puzzle"; 2 | 3 | export type encDetectorResult = { 4 | method: ENC_METHOD; 5 | data: string; 6 | }; 7 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/.vite/deps/_metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "f37ce647", 3 | "configHash": "dcae37b8", 4 | "lockfileHash": "05c7b070", 5 | "browserHash": "b6fc8fb0", 6 | "optimized": {}, 7 | "chunks": {} 8 | } -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | //// 4 | /// 5 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 从形如 3 | * https://play.dlsite.com/work/BJ366185/viewer 4 | * 中提取BJ366185 5 | * @param url 6 | */ 7 | export function extractDlsiteId(url) { 8 | return url.match(/work\/([A-Z\d]+)\//)?.[1] ?? null; 9 | } -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/origConsole.js: -------------------------------------------------------------------------------- 1 | const c = window.console; 2 | 3 | export const origConsole = (() => { 4 | return { 5 | log: c.log.bind(c), 6 | warn: c.warn.bind(c), 7 | info: c.info.bind(c), 8 | error: c.error.bind(c), 9 | debug: c.debug.bind(c), 10 | }; 11 | })(); 12 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from "vue"; 2 | import "./style.css"; 3 | import App from "./App.vue"; 4 | 5 | createApp(App).mount( 6 | (() => { 7 | const app = document.createElement("div"); 8 | app.className = "dlsite-play-downloader-vue"; 9 | document.body.append(app); 10 | return app; 11 | })() 12 | ); 13 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/log.js: -------------------------------------------------------------------------------- 1 | import { ref } from "vue"; 2 | import { unsafeWindow } from "$"; 3 | export function useLog() { 4 | const log_list = ref([]) 5 | 6 | function add_log(text) { 7 | log_list.value.unshift(text); 8 | } 9 | unsafeWindow.add_log = add_log 10 | 11 | return { 12 | log_list, 13 | add_log, 14 | } 15 | } -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/dlsiteplay-enc-detector/puzzle.js: -------------------------------------------------------------------------------- 1 | import { unsafeWindow } from "$"; 2 | import { origConsole } from "../origConsole"; 3 | 4 | /** 5 | * 监听 fetch 请求,检测是否为拼图加密加载方式 6 | * @returns {Promise} 7 | */ 8 | export const hookFetchPuzzle = () => { 9 | return new Promise((resolve, reject) => { 10 | registerRequestHook(/\//, (json, response, url) => { 11 | origConsole.log(url) 12 | }, true); 13 | }); 14 | }; 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DLsite-Play-Downloader 2 | 在浏览器完成的DLsite Play漫画的下载、拼图和保存。 3 | 4 | Download comics from DLsite Play in browser. 5 | ## 安装 Install 6 | [从Github安装](https://github.com/cpuopt/DLsite-Play-Downloader/raw/vite-monkey/DLsite-Play-Downloader-vue/dist/dlsite-play-downloader-vue.user.js) 7 | 8 | 前往[Greasy Fork](https://greasyfork.org/zh-CN/scripts/480281-dlsite-play-downloader)页面 9 | ## 使用 Usage 10 | 需进入漫画阅读器界面后使用 11 | 12 | 13 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dlsite-play-downloader-vue", 3 | "private": true, 4 | "version": "2.0.2", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc -b && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "adm-zip": "^0.5.16", 13 | "element-plus": "^2.11.4", 14 | "fflate": "^0.8.2", 15 | "file-type": "^21.0.0", 16 | "vue": "^3.5.19" 17 | }, 18 | "devDependencies": { 19 | "@vitejs/plugin-vue": "^6.0.1", 20 | "typescript": "^5.9.2", 21 | "unplugin-element-plus": "^0.10.0", 22 | "vite": "^7.1.3", 23 | "vite-plugin-monkey": "^7.1.1", 24 | "vue-tsc": "^3.0.6" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/README.md: -------------------------------------------------------------------------------- 1 | # Vue 3 + TypeScript + Vite 2 | 3 | This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` 186 | 187 | 236 | 237 | 238 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/src/dlsiteplay-enc-detector/xor.js: -------------------------------------------------------------------------------- 1 | import { origConsole } from "../origConsole"; 2 | import { registerRequestHook } from "../hookFetch"; 3 | import { extractDlsiteId } from "../utils"; 4 | 5 | import { fileTypeFromBuffer } from "file-type"; 6 | import { zip } from "fflate"; 7 | import { unsafeWindow } from "$"; 8 | 9 | 10 | export const hookXorEnc = () => { 11 | return new Promise((resolve, reject) => { 12 | Promise.all([hookXorKey(), hookEncBinUrl(), hookViewerMeta(), hookApiV2Work()]).then(([{ key: encDetectorKey }, { url: binUrl }, { json: viewerMeta }, { json: apiV2WorkMeta }]) => { 13 | origConsole.log("viewerMeta ", viewerMeta); 14 | origConsole.log("xor key ", encDetectorKey); 15 | origConsole.log("binUrl ", binUrl); 16 | const encBinUrls = makeEncBinUrls(binUrl, viewerMeta) 17 | origConsole.log("encBinUrls ", encBinUrls.length); 18 | const saveName = makeArtworkSaveName(viewerMeta, apiV2WorkMeta) 19 | origConsole.log("makeArtworkSaveName ", saveName); 20 | resolve({ 21 | method: "xor", 22 | data: { 23 | urls: encBinUrls, 24 | key: encDetectorKey, 25 | zipFileName: saveName, 26 | download: () => downloadAndDecryptToZip(encBinUrls, encDetectorKey, `${saveName}.zip`).catch(origConsole.error), 27 | }, 28 | }) 29 | }) 30 | }) 31 | }; 32 | 33 | function makeArtworkSaveName(viewerMeta, apiV2WorkMeta) { 34 | console.log(apiV2WorkMeta); 35 | 36 | let creator = undefined 37 | if (viewerMeta.meta_data.creator?.length > 0) { 38 | creator = viewerMeta.meta_data.creator.join(" ") 39 | } 40 | 41 | let apiV2_maker = "" 42 | if (apiV2WorkMeta?.maker?.name?.ja_JP) { 43 | apiV2_maker = apiV2WorkMeta.maker?.name?.ja_JP 44 | } 45 | 46 | let apiV2_name = "" 47 | if (apiV2WorkMeta?.name?.ja_JP) { 48 | apiV2_name = apiV2WorkMeta?.name?.ja_JP 49 | } 50 | 51 | let publisher = "" 52 | if (viewerMeta.meta_data.publisher) { 53 | publisher = viewerMeta.meta_data.publisher 54 | } 55 | let title = undefined 56 | if (viewerMeta.meta_data.title) { 57 | title = viewerMeta.meta_data.title 58 | } 59 | let no = "" 60 | const NO = extractDlsiteId(window.location.href); 61 | if (NO) { 62 | no = NO 63 | } 64 | return `[${no}] (${publisher})(${creator ?? apiV2_maker}) ${title ?? apiV2_name}` 65 | } 66 | 67 | function extractNumberOrKeepOriginal(str) { 68 | const match = str.match(/\d+/); 69 | return match ? match[0] : str; 70 | } 71 | 72 | function makeEncBinUrls(binUrlExample, viewerMeta) { 73 | const binUrls = [] 74 | viewerMeta.pages.forEach(({ src }, _i) => { 75 | const url = binUrlExample.replace(/\/((i-\d+)|cover|\d+)\.enc\b/, `/${src}`) 76 | binUrls.push({ 77 | url: url, 78 | name: `${_i}-${extractNumberOrKeepOriginal(src.replace(".enc", ""))}` 79 | }) 80 | }); 81 | return binUrls 82 | } 83 | /** 84 | * hook Worker的postMessage方法,尝试截获xor key以判断是否为xor加密方式 85 | * @returns {Promise} 86 | */ 87 | const hookXorKey = () => { 88 | return new Promise((resolve, reject) => { 89 | 90 | 91 | const origPostMessage = Worker.prototype.postMessage; 92 | 93 | Worker.prototype.postMessage = function (msg, ...rest) { 94 | if (msg && msg.param) { 95 | if (msg.param.key && msg.param.method === "xor") { 96 | Worker.prototype.postMessage = origPostMessage; 97 | resolve({ 98 | key: msg.param.key, 99 | }); 100 | } 101 | } 102 | 103 | return origPostMessage.call(this, msg, ...rest); 104 | }; 105 | 106 | 107 | const originalDecrypt = crypto.subtle.decrypt; 108 | 109 | crypto.subtle.decrypt = async function (algorithm, key, data) { 110 | const result = await originalDecrypt.call(this, algorithm, key, data); 111 | const utf8String = new TextDecoder('utf-8').decode(result); 112 | resolve({ 113 | key: utf8String, 114 | }) 115 | return result; 116 | }; 117 | }); 118 | } 119 | 120 | const hookEncBinUrl = () => { 121 | return new Promise((resolve, reject) => { 122 | registerRequestHook(/\/((i-\d+)|cover|\d+)\.enc\?Policy=/, (json, response, url) => { 123 | resolve({ 124 | url: url, 125 | }); 126 | }, true); 127 | }) 128 | } 129 | 130 | const hookViewerMeta = () => { 131 | return new Promise((resolve, reject) => { 132 | registerRequestHook(/\/viewer\-meta\.json\b/, (json, response, url) => { 133 | resolve({ 134 | json: json, 135 | }); 136 | }, true); 137 | }); 138 | } 139 | 140 | const hookApiV2Work = () => { 141 | return new Promise((resolve, reject) => { 142 | registerRequestHook(/\/api\/v2\/work\/.+$/, (json, response, url) => { 143 | resolve({ 144 | json: json, 145 | }); 146 | }, true); 147 | }); 148 | } 149 | 150 | 151 | /** 152 | * XOR 解密 153 | */ 154 | function xorDecrypt(data, keyHex) { 155 | // keyHex -> Uint8Array 156 | const key = Uint8Array.from(keyHex.match(/.{1,2}/g).map(b => parseInt(b, 16))); 157 | const keyLen = key.length; 158 | const result = new Uint8Array(data.length); 159 | for (let i = 0; i < data.length; i++) { 160 | result[i] = data[i] ^ key[i % keyLen]; 161 | } 162 | return result; 163 | } 164 | 165 | // 使用 XHR 下载 ArrayBuffer 166 | function downloadArrayBuffer(url) { 167 | return new Promise((resolve, reject) => { 168 | const xhr = new XMLHttpRequest(); 169 | xhr.open("GET", url, true); 170 | xhr.responseType = "arraybuffer"; 171 | xhr.onload = () => { 172 | if (xhr.status === 200) resolve(xhr.response); 173 | else reject(new Error(`下载失败: ${xhr.status} ${xhr.statusText}`)); 174 | }; 175 | xhr.onerror = () => reject(new Error("XHR 请求失败")); 176 | xhr.send(); 177 | }); 178 | } 179 | 180 | /** 181 | * 异步下载+解密+自动识别文件类型+打包ZIP (支持多线程) 182 | * @param {Array<{url: string, name: string}>} files - 文件列表 183 | * @param {string} keyHex - XOR 密钥 184 | * @param {string} outputZip - 输出 ZIP 名称 185 | * @param {number} concurrency - 并发线程数(默认 5) 186 | */ 187 | const downloadAndDecryptToZip = async (files, keyHex, outputZip, concurrency = 3) => { 188 | const zipFiles = {}; 189 | let successCount = 0; 190 | let failCount = 0; 191 | 192 | // 改进的并发控制器 193 | const runWithConcurrency = async (tasks, maxConcurrent) => { 194 | const results = []; 195 | const executing = new Set(); 196 | 197 | for (const task of tasks) { 198 | // 等待有位置空出来 199 | if (executing.size >= maxConcurrent) { 200 | await Promise.race(executing); 201 | } 202 | 203 | const taskPromise = runTask(task).finally(() => { 204 | executing.delete(taskPromise); 205 | }); 206 | 207 | executing.add(taskPromise); 208 | results.push(taskPromise); 209 | } 210 | 211 | return Promise.allSettled(results); 212 | }; 213 | 214 | const runTask = async ({ url, name }) => { 215 | try { 216 | origConsole.log(`下载中: ${name}`); 217 | unsafeWindow.add_log?.(`下载中: ${name}`); 218 | 219 | const arrayBuffer = await downloadArrayBuffer(url); 220 | const encrypted = new Uint8Array(arrayBuffer); 221 | const decrypted = xorDecrypt(encrypted, keyHex); 222 | 223 | const type = await fileTypeFromBuffer(decrypted); 224 | const ext = type ? type.ext : "bin"; 225 | const finalName = name.endsWith(`.${ext}`) ? name : `${name}.${ext}`; 226 | zipFiles[finalName] = decrypted; 227 | 228 | successCount++; 229 | origConsole.log(`✓ 已完成: ${finalName} (${type?.mime || "未知类型"})`); 230 | unsafeWindow.add_log?.(`✓ 已完成: ${finalName} (${type?.mime || "未知类型"})`); 231 | 232 | return { success: true, name: finalName }; 233 | } catch (err) { 234 | failCount++; 235 | origConsole.error(`✗ 处理失败: ${name}`, err); 236 | unsafeWindow.add_log?.(`✗ 处理失败: ${name} (${err.message})`); 237 | return { success: false, name, error: err.message }; 238 | } 239 | }; 240 | 241 | // 执行所有任务 242 | await runWithConcurrency(files, concurrency); 243 | 244 | // 检查是否有成功文件 245 | if (Object.keys(zipFiles).length === 0) { 246 | const errorMsg = "所有文件处理失败,无法创建ZIP"; 247 | origConsole.error(errorMsg); 248 | unsafeWindow.add_log?.(errorMsg); 249 | throw new Error(errorMsg); 250 | } 251 | 252 | // 压缩 ZIP 253 | return new Promise((resolve, reject) => { 254 | zip(zipFiles, (err, zipped) => { 255 | if (err) { 256 | origConsole.error("ZIP 压缩失败", err); 257 | unsafeWindow.add_log?.("ZIP 压缩失败", err); 258 | reject(err); 259 | return; 260 | } 261 | 262 | const blob = new Blob([zipped], { type: "application/zip" }); 263 | const blobUrl = URL.createObjectURL(blob); 264 | const a = document.createElement("a"); 265 | a.href = blobUrl; 266 | a.download = outputZip; 267 | 268 | const summary = `完成: ${successCount} 成功, ${failCount} 失败 -> ${outputZip}`; 269 | origConsole.log(summary); 270 | unsafeWindow.add_log?.(summary); 271 | 272 | resolve({ 273 | save: () => { 274 | a.click(); 275 | setTimeout(() => URL.revokeObjectURL(blobUrl), 1000); 276 | }, 277 | successCount, 278 | failCount, 279 | blobUrl 280 | }); 281 | }); 282 | }); 283 | }; 284 | 285 | 286 | 287 | 288 | /** 289 | * 290 | * , LC = async e => { 291 | const r = new TextEncoder().encode(e) 292 | , a = await crypto.subtle.digest("SHA-256", r); 293 | return Array.from(new Uint8Array(a)).map(l => l.toString(16).padStart(2, "0")).join("") 294 | } 295 | */ 296 | 297 | 298 | // const DH = { 299 | // name: "RSA-OAEP", 300 | // modulusLength: 4096, 301 | // publicExponent: new Uint8Array([1, 0, 1]), 302 | // hash: "SHA-256" 303 | // }; 304 | 305 | 306 | // const FIXED_KEYPAIR = await crypto.subtle.generateKey(DH, true, ["encrypt", "decrypt"]); 307 | 308 | // /** 309 | // * 使用固定的 RSA 私钥解密 Base64 编码的密文 310 | // * @param {string} cipherBase64 - Base64 编码的密文 311 | // * @returns {Promise} 解密后的字符串 312 | // */ 313 | // async function decryptRSA(cipherBase64) { 314 | // const subtle = crypto.subtle; 315 | // const algorithm = { name: "RSA-OAEP" }; 316 | 317 | // const base64ToBytes = (base64) => { 318 | // const binary = atob(base64); 319 | // const bytes = new Uint8Array(binary.length); 320 | // for (let i = 0; i < binary.length; i++) { 321 | // bytes[i] = binary.charCodeAt(i); 322 | // } 323 | // return bytes; 324 | // }; 325 | 326 | // const bytesToString = (buffer) => String.fromCharCode(...new Uint8Array(buffer)); 327 | 328 | // const decrypted = await subtle.decrypt(algorithm, FIXED_KEYPAIR.privateKey, base64ToBytes(cipherBase64)); 329 | // return bytesToString(decrypted); 330 | // } 331 | 332 | 333 | 334 | // decryptRSA(key).then(r => { 335 | // console.log(r); 336 | 337 | // }) 338 | 339 | (function () { 340 | const orig = crypto.subtle.generateKey; 341 | crypto.subtle.generateKey = async function (algorithm, extractable, usages) { 342 | console.log("%c[HOOK] generateKey called", "color: lime;"); 343 | console.log("algorithm:", algorithm); 344 | console.log("extractable:", extractable); 345 | console.log("usages:", usages); 346 | 347 | const keyPair = await orig.apply(this, arguments); 348 | 349 | console.log("%c[HOOK] generated keyPair:", "color: cyan;"); 350 | console.log("publicKey:", keyPair.publicKey); 351 | console.log("privateKey:", keyPair.privateKey); 352 | 353 | debugger 354 | 355 | try { 356 | const spki = await crypto.subtle.exportKey("spki", keyPair.publicKey); 357 | const pkcs8 = await crypto.subtle.exportKey("pkcs8", keyPair.privateKey); 358 | const toBase64 = buf => btoa(String.fromCharCode(...new Uint8Array(buf))); 359 | console.log("publicKey (SPKI base64):", toBase64(spki)); 360 | console.log("privateKey (PKCS8 base64):", toBase64(pkcs8)); 361 | } catch (err) { 362 | console.warn("[HOOK] exportKey failed:", err); 363 | } 364 | 365 | return keyPair; 366 | }; 367 | })(); 368 | 369 | 370 | /** 371 | * 372 | * "MII*** 373 | publicKey (SPKI base64): 374 | 请求https://play.dlsite.com/api/v3/viewer/token/BJ****** 的载荷public_key参数 375 | */ 376 | 377 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-old.user.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name DLsite Play Downloader 3 | // @namespace https://github.com/cpuopt/DLsite-Play-Downloader 4 | // @version 1.7.1 5 | // @description 在浏览器完成DLsite Play漫画的下载、拼图和保存 6 | // @author cpufan 7 | // @match https://play.dlsite.com/* 8 | // @icon https://www.google.com/s2/favicons?sz=64&domain=dlsite.com 9 | // @license MIT 10 | // @grant window.onurlchange 11 | // @grant GM_addStyle 12 | // @grant GM_setValue 13 | // @grant GM_getValue 14 | // @grant GM_deleteValue 15 | // @grant window.close 16 | // @grant GM_addValueChangeListener 17 | // @grant GM_removeValueChangeListener 18 | // @supportURL https://github.com/cpuopt/DLsite-Play-Downloader/issues 19 | // @downloadURL https://update.greasyfork.org/scripts/480281/DLsite%20Play%20Downloader.user.js 20 | // @updateURL https://update.greasyfork.org/scripts/480281/DLsite%20Play%20Downloader.meta.js 21 | // ==/UserScript== 22 | 23 | (function () { 24 | "use strict"; 25 | 26 | GM_addStyle(` 27 | .button-down{ 28 | border: none; 29 | background-color: #007aff; 30 | color: white; 31 | padding-inline: 0.6rem; 32 | position: absolute; 33 | right: 0; 34 | height: 100%; 35 | z-index: 2; 36 | font-weight: bolder; 37 | transition: background-color .5s; 38 | } 39 | .button-down:hover{ 40 | background-color: #000000; 41 | } 42 | .jpeg-button-down{ 43 | margin-left: auto; 44 | border: none; 45 | background-color: #007aff; 46 | color: white; 47 | padding-inline: 0.6rem; 48 | z-index: 2; 49 | font-weight: bolder; 50 | transition: background-color .5s; 51 | } 52 | .jpeg-button-down:hover{ 53 | background-color: #000000; 54 | } 55 | `); 56 | var mutationob; 57 | var pluginPanel; 58 | var dlsiteMangaDownloader; 59 | class MutationOb { 60 | observer; 61 | 62 | constructor() { 63 | let self = this; 64 | this.observer = new MutationObserver(() => { 65 | let artwork = document.querySelector("ol[class^='_tree_'] > li[class^='_item_']:has(svg)"); 66 | let jpegs = document.querySelectorAll("ol[class^='_tree_'] > li[class^='_item_']:has(img)"); 67 | console.debug("触发监视器", artwork, jpegs); 68 | if (artwork != null && artwork.querySelector("button") == null) { 69 | self.haveArtwork(artwork); 70 | } 71 | if (jpegs.length > 0 && document.querySelector("div[class^='_worktree_'] ul").querySelector("button") == null) { 72 | self.haveJpegs(jpegs); 73 | } 74 | }); 75 | } 76 | start() { 77 | const illustsDivNode = document.querySelector("body"); 78 | console.debug(illustsDivNode); 79 | this.observer.observe(illustsDivNode, { 80 | attributes: false, 81 | childList: true, 82 | subtree: true, 83 | }); 84 | console.debug("监视器启动"); 85 | } 86 | stop() { 87 | this.observer.disconnect(); 88 | console.debug("监视器停止"); 89 | } 90 | haveArtwork(artwork) { 91 | this.stop(); 92 | let button = new ArtworkDownloadButton("button-down", artwork); 93 | if (pluginPanel == undefined) { 94 | mutationob.start(); 95 | } 96 | } 97 | haveJpegs(jpegs) { 98 | this.stop(); 99 | let button = new JpegsDownloadButton("jpeg-button-down", document.querySelector("div[class^='_worktree_'] ul")); 100 | if (pluginPanel == undefined) { 101 | mutationob.start(); 102 | } 103 | } 104 | } 105 | 106 | // fetch拦截器 用于截获xml文件url 107 | class FetchInterceptor { 108 | static originalFetch = unsafeWindow.fetch; 109 | 110 | static intercept() { 111 | const o = unsafeWindow.fetch; 112 | unsafeWindow.fetch = (...args) => { 113 | return new Promise((resolve, reject) => { 114 | let [resource, config] = args; 115 | // request interceptor starts 116 | console.log(resource, config); 117 | 118 | if (/https:\/\/play.dl.dlsite.com\/csr\/api\/diazepam_hybrid.php\?mode=7&file=face.xml&reqtype=0&vm=\d¶m=.*&time=\d+/.test(resource)) { 119 | FetchInterceptor.stop(); 120 | GM_setValue("URLStyle", resource); 121 | console.debug(`成功获取到图片链接格式`, resource); 122 | GM_setValue("download", false); 123 | window.close(); 124 | } else { 125 | console.debug("图片链接格式不匹配"); 126 | GM_setValue("download", false); 127 | 128 | // window.location.reload(); 129 | } 130 | 131 | // request interceptor ends 132 | 133 | o(...args).then((response) => { 134 | console.log(response); 135 | 136 | resolve(response); 137 | }); 138 | 139 | // response interceptor here 140 | }); 141 | }; 142 | } 143 | 144 | static stop() { 145 | unsafeWindow.fetch = this.originalFetch; 146 | } 147 | } 148 | class DLsiteMangaDownloader { 149 | preffix; 150 | suffix; 151 | pageNum; 152 | faceScramble; 153 | HorBlock; 154 | VerBlock; 155 | Width; 156 | Height; 157 | urls; 158 | filename; 159 | outputBlobs = new Array(); 160 | 161 | constructor(URLStyle, filename) { 162 | this.filename = filename; 163 | // 解析url前缀和后缀 164 | let urlExample = URLStyle; 165 | let modeIndex = urlExample.search(/\?mode/); 166 | let reqtypeIndex = urlExample.search(/&reqtype/); 167 | this.preffix = urlExample.substring(0, modeIndex); 168 | this.suffix = urlExample.substring(reqtypeIndex); 169 | pluginPanel.addLog("解析链接完成"); 170 | } 171 | 172 | buildUrls(page) { 173 | let urls = new Array(); 174 | 175 | for (let i = 0; i < page; i++) { 176 | let xml = `${this.preffix}?mode=8&file=${i.toString().padStart(4, "0")}.xml${this.suffix}`; 177 | let bin = `${this.preffix}?mode=1&file=${i.toString().padStart(4, "0")}_0000.bin${this.suffix}`; 178 | urls.push({ xml, bin }); 179 | } 180 | 181 | return urls; 182 | } 183 | 184 | async getFaceInfo() { 185 | const faceResponse = await fetch(`${this.preffix}?mode=7&file=face.xml${this.suffix}`, { 186 | method: "GET", 187 | headers: { 188 | Accept: "*/*", 189 | "Accept-Encoding": "gzip, deflate, br", 190 | "Accept-Language": "zh-CN,zh;q=0.9", 191 | }, 192 | referrer: "https://play.dlsite.com/", 193 | credentials: "same-origin", 194 | }); 195 | let doc = DLsiteMangaDownloader.parseText2Xml(await faceResponse.text()); 196 | this.HorBlock = parseInt(doc.evaluate("//Scramble/Width", doc).iterateNext().textContent); 197 | this.VerBlock = parseInt(doc.evaluate("//Scramble/Height", doc).iterateNext().textContent); 198 | this.Width = parseInt(doc.evaluate("//ContentFrame/Width", doc).iterateNext().textContent); 199 | this.Height = parseInt(doc.evaluate("//ContentFrame/Height", doc).iterateNext().textContent); 200 | this.pageNum = parseInt(doc.evaluate("//TotalPage", doc).iterateNext().textContent); 201 | } 202 | 203 | // 解析xml响应为document 204 | static parseText2Xml(text) { 205 | const parser = new DOMParser(); 206 | const doc = parser.parseFromString(text, "application/xml"); 207 | return doc; 208 | } 209 | 210 | async makeImages() { 211 | let self = this; 212 | await this.getFaceInfo(); 213 | this.urls = this.buildUrls(this.pageNum); 214 | 215 | this.urls.forEach(async ({ xml, bin }, index) => { 216 | console.debug(`${index}\n${xml}\n${bin}`); 217 | let xmlResponse = await fetch(xml, { 218 | method: "GET", 219 | headers: { 220 | Accept: "*/*", 221 | "Accept-Encoding": "gzip, deflate, br", 222 | "Accept-Language": "zh-CN,zh;q=0.9", 223 | }, 224 | referrer: "https://play.dlsite.com/", 225 | credentials: "same-origin", 226 | }); 227 | 228 | let binResponse = await fetch(bin, { 229 | method: "GET", 230 | headers: { 231 | Accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", 232 | "Accept-Encoding": "gzip, deflate, br", 233 | "Accept-Language": "zh-CN,zh;q=0.9", 234 | "Sec-Fetch-Dest": "image", 235 | }, 236 | referrer: "https://play.dlsite.com/", 237 | credentials: "same-origin", 238 | }); 239 | 240 | if (xmlResponse.ok && binResponse.ok) { 241 | let doc = DLsiteMangaDownloader.parseText2Xml(await xmlResponse.text()); 242 | let mateix = doc.evaluate("//Scramble", doc).iterateNext().textContent.split(","); 243 | const width = parseInt(doc.evaluate("//StepRect/Width", doc).iterateNext().textContent); 244 | const height = parseInt(doc.evaluate("//StepRect/Height", doc).iterateNext().textContent); 245 | let vector = new Array(mateix.length); 246 | mateix.forEach((num, index) => { 247 | vector[parseInt(num)] = index; 248 | }); 249 | console.debug(index, mateix, vector); 250 | let image = await binResponse.blob(); 251 | 252 | self.imagePuzzle({ 253 | index: index, 254 | vector: vector, 255 | blob: image, 256 | TocTitle: null, 257 | size: { width: width, height: height }, 258 | }); 259 | } 260 | }); 261 | } 262 | imagePuzzle({ index, vector, blob, TocTitle, size }) { 263 | let self = this; 264 | let canvas = document.createElement("canvas"); 265 | canvas.width = size.width; 266 | canvas.height = size.height; 267 | let HorBlock = this.HorBlock; 268 | let VerBlock = this.VerBlock; 269 | let sourceW = Math.trunc(size.width / (this.HorBlock * 8)) * 8; 270 | let sourceH = Math.trunc(size.height / (this.VerBlock * 8)) * 8; 271 | let ctx = canvas.getContext("2d"); 272 | const img = new Image(); 273 | img.src = URL.createObjectURL(blob); 274 | img.onload = function () { 275 | ctx.drawImage(img, 0, 0); 276 | 277 | for (let [index, item] of vector.entries()) { 278 | let sourceX = sourceW * (index % HorBlock); 279 | let sourceY = sourceH * Math.trunc(index / VerBlock); 280 | let x = sourceW * (item % HorBlock); 281 | let y = sourceH * Math.trunc(item / VerBlock); 282 | 283 | ctx.drawImage(img, sourceX, sourceY, sourceW, sourceH, x, y, sourceW, sourceH); 284 | } 285 | canvas.toBlob( 286 | function (blob) { 287 | self.outputBlobs.push({ 288 | index: index, 289 | blob: blob, 290 | TocTitle: null, 291 | }); 292 | pluginPanel.addLog(`已处理完成:${self.outputBlobs.length}/${self.urls.length}`); 293 | 294 | if (self.outputBlobs.length == self.urls.length) { 295 | // 所有图片已经处理完成 296 | self.save(self.filename); 297 | pluginPanel.addLog("下载已完成"); 298 | pluginPanel.addLog("提示:为最大限度保持画质,图片以PNG储存"); 299 | pluginPanel.addLog("提示:返回或切换页面即可关闭此窗口"); 300 | mutationob.start(); 301 | } 302 | } 303 | // document.querySelector("#imgType").value, 304 | // 1.0 305 | ); 306 | }; 307 | 308 | // document.body.appendChild(canvas); 309 | } 310 | save(mangaName) { 311 | let self = this; 312 | const fileStream = streamSaver.createWriteStream(`${mangaName}.zip`); 313 | 314 | const readableZipStream = new ZIP({ 315 | start(ctrl) { 316 | self.outputBlobs.forEach(({ index, blob, TocTitle }, _) => { 317 | let file = { 318 | // name: `${mangaName}/${(index + 1).toString().padStart(4, "0")}.jpg`, 319 | name: `${(index + 1).toString().padStart(4, "0")}.png`, 320 | stream: () => blob.stream(), 321 | }; 322 | ctrl.enqueue(file); 323 | }); 324 | ctrl.close(); 325 | }, 326 | }); 327 | 328 | // more optimized 329 | if (window.WritableStream && readableZipStream.pipeTo) { 330 | return readableZipStream.pipeTo(fileStream).then(() => console.debug("done writing")); 331 | } 332 | 333 | // less optimized 334 | const writer = fileStream.getWriter(); 335 | const reader = readableZipStream.getReader(); 336 | const pump = () => reader.read().then((res) => (res.done ? writer.close() : writer.write(res.value).then(pump))); 337 | 338 | pump(); 339 | } 340 | } 341 | class ArtworkDownloadButton { 342 | button; 343 | constructor(className, father) { 344 | let button = document.createElement("button"); 345 | button.className = className; 346 | button.innerText = "使用脚本下载"; 347 | let Title = father.querySelector("div[class^='_text_'] > p[class*='_titleMedium_']").innerText; 348 | let Author = document.querySelector("div[class^='_contentMain_'] > p[class^='_text_'][class*='_onSurface_']").innerText.replace("/", " "); 349 | let Maker = document.querySelector("div[class^='_contentMain_'] > p[class^='_text_'][class*='_onSurfacePrimary_'] > a[class^='_link_']").innerText.replace("/", " "); 350 | button.addEventListener("click", (e) => { 351 | // 显示插件面板 352 | pluginPanel = new PluginPanel(); 353 | mutationob.stop(); 354 | 355 | GM_setValue("download", true); 356 | GM_setValue("filename", `[${Author}] ${Title}`); 357 | console.debug("filename:\n", `[${Author}] ${Title}`); 358 | pluginPanel.addLog(`获取到标题:${Title}`); 359 | pluginPanel.addLog(`获取到作者:${Author}`); 360 | pluginPanel.addLog(`获取到出版商:${Maker}`); 361 | e.stopPropagation(); // 阻止冒泡 362 | GM_deleteValue("URLStyle"); 363 | 364 | // 事件监听器获取URLStyle 365 | var URLStylelistener = GM_addValueChangeListener("URLStyle", function (key, oldValue, newValue, remote) { 366 | console.debug(key + ":\n" + oldValue + "=>" + newValue); 367 | pluginPanel.addLog(`获取到URL格式:` + newValue); 368 | dlsiteMangaDownloader = new DLsiteMangaDownloader(newValue, `[${Maker}] [${Author}] ${Title}`); 369 | GM_removeValueChangeListener(URLStylelistener); 370 | dlsiteMangaDownloader.makeImages(); 371 | }); 372 | 373 | pluginPanel.addLog("准备前往阅读器获取URL..."); 374 | // 延迟两秒开启阅读器界面 375 | setTimeout(() => { 376 | father.click(); 377 | }, 2000); 378 | }); 379 | father.appendChild(button); 380 | this.button = button; 381 | } 382 | } 383 | class JpegsDownloadButton { 384 | button; 385 | constructor(className, father) { 386 | let button = document.createElement("button"); 387 | button.className = className; 388 | button.innerText = "使用脚本下载"; 389 | let Title = document.querySelector("div[class^='_info_'] > div[class*='_contentMain_'] > :nth-child(1)").innerText; 390 | let Author = document.querySelector("div[class^='_info_'] > div[class*='_contentMain_'] > :nth-child(2)").innerText.replace("/", " "); 391 | let Maker = document.querySelector("div[class^='_info_'] > div[class*='_contentMain_'] > :nth-child(3)").innerText.replace("/", " "); 392 | button.addEventListener("click", async (e) => { 393 | // 显示插件面板 394 | pluginPanel = new PluginPanel(); 395 | mutationob.stop(); 396 | 397 | console.debug("filename:\n", `[${Author}] ${Title}`); 398 | pluginPanel.addLog(`获取到标题:${Title}`); 399 | pluginPanel.addLog(`获取到作者:${Author}`); 400 | pluginPanel.addLog(`获取到出版商:${Maker}`); 401 | e.stopPropagation(); // 阻止冒泡 402 | 403 | const { url: downloadPrefix, cookies } = await getDownloadCredential(); 404 | console.log(downloadPrefix); 405 | 406 | const [mangaName, downloadUrls] = await Promise.all([getMangaName(), getDownloadUrls(downloadPrefix)]); 407 | const downloadResults = await Promise.all(downloadUrls.map((value) => imagePuzzle(downloadPrefix, value))); 408 | 409 | save(mangaName, downloadResults); 410 | }); 411 | father.appendChild(button); 412 | this.button = button; 413 | } 414 | } 415 | class PluginPanel { 416 | element; 417 | title; 418 | hr; 419 | log; 420 | 421 | constructor() { 422 | GM_addStyle(` 423 | .plugin-panel{ 424 | border: solid #007aff 2px; 425 | border-radius: 1rem; 426 | display: block; 427 | box-sizing: border-box; 428 | width: 50rem; 429 | height: 30rem; 430 | margin: 0 auto; 431 | position: fixed; 432 | background-color: white; 433 | z-index: 5000; 434 | margin-left: 50%; 435 | margin-top: 50%; 436 | top: -15rem; 437 | left: -25rem; 438 | padding-block: 1rem; 439 | font-size: 1.6rem; 440 | box-shadow: 5px 5px 10px #ccc; 441 | } 442 | .plugin-panel-title{ 443 | margin: 0 auto; 444 | text-align: center; 445 | } 446 | .plugin-panel-hr{ 447 | margin-block: 0.2rem; 448 | } 449 | .plugin-panel-log{ 450 | margin-inline: 2rem; 451 | margin-block: 0.5rem; 452 | height: 10rem; 453 | border: solid #000000a6 1.5px; 454 | box-sizing: border-box; 455 | font-size: 1.2rem; 456 | padding: 0.5rem; 457 | border-radius: 0.5rem; 458 | overflow: auto; 459 | } 460 | ::-webkit-scrollbar { 461 | display: none; 462 | } 463 | `); 464 | let element = document.createElement("div"); 465 | element.className = "plugin-panel"; 466 | document.body.appendChild(element); 467 | let title = document.createElement("div"); 468 | title.className = "plugin-panel-title"; 469 | title.innerText = "DLsite Play Downloader"; 470 | element.appendChild(title); 471 | let hr = document.createElement("hr"); 472 | hr.className = "plugin-panel-hr"; 473 | element.appendChild(hr); 474 | let log = document.createElement("div"); 475 | log.className = "plugin-panel-log"; 476 | element.appendChild(log); 477 | 478 | this.log = log; 479 | this.element = element; 480 | } 481 | addLog(text) { 482 | let oldHTML = this.log.innerHTML; 483 | this.log.innerHTML = oldHTML + `

${text}

`; 484 | this.log.scrollTop = this.log.scrollHeight; 485 | } 486 | destroy() { 487 | const element = document.querySelector("div.plugin-panel"); 488 | if (element) { 489 | document.body.removeChild(element); 490 | } 491 | } 492 | } 493 | 494 | if (!window.location.href.startsWith("https://play.dlsite.com/csr/")) { 495 | // 非漫画阅读器页面 再启动监视器 496 | mutationob = new MutationOb(); 497 | mutationob.start(); 498 | GM_deleteValue("URLStyle"); 499 | // 加载StreamSaver和zip-stream 500 | let scripts = ["https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.1/cropper.min.js", "https://cdn.jsdelivr.net/npm/streamsaver@2.0.3/StreamSaver.min.js", "https://jimmywarting.github.io/StreamSaver.js/examples/zip-stream.js", "https://unpkg.com/mersenne-twister@1.1.0/src/mersenne-twister.js"]; 501 | scripts.forEach((url) => { 502 | let script = document.createElement("script"); 503 | script.setAttribute("type", "text/javascript"); 504 | script.src = url; 505 | document.documentElement.appendChild(script); 506 | }); 507 | if (window.onurlchange === null) { 508 | // feature is supported 509 | window.addEventListener("urlchange", () => { 510 | mutationob.stop(); 511 | if (pluginPanel != undefined && pluginPanel.element != undefined) { 512 | pluginPanel.element.remove(); 513 | pluginPanel.destroy(); 514 | } 515 | setTimeout(() => { 516 | mutationob.start(); 517 | }, 100); 518 | }); 519 | } 520 | } 521 | if (window.location.href.startsWith("https://play.dlsite.com/csr/") && GM_getValue("download")) { 522 | // 当前位于漫画阅读器 523 | console.debug("当前位于漫画阅读器", "下载状态:", GM_getValue("download")); 524 | 525 | // 加载StreamSaver和zip-stream 526 | let scripts = ["https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.6.1/cropper.min.js", "https://cdn.jsdelivr.net/npm/streamsaver@2.0.3/StreamSaver.min.js", "https://jimmywarting.github.io/StreamSaver.js/examples/zip-stream.js"]; 527 | scripts.forEach((url) => { 528 | let script = document.createElement("script"); 529 | script.setAttribute("type", "text/javascript"); 530 | script.src = url; 531 | document.documentElement.appendChild(script); 532 | }); 533 | FetchInterceptor.intercept(); 534 | } 535 | async function getDownloadCredential() { 536 | const response = await fetch(`https://play.dl.dlsite.com/api/download/sign/cookie?workno=${location.href.match(/\/work\/(\w+)\//)[1]}`, { 537 | method: "GET", 538 | headers: { 539 | Accept: "*/*", 540 | "Accept-Encoding": "gzip, deflate, br", 541 | "Accept-Language": "zh-CN,zh;q=0.9", 542 | }, 543 | referrer: "https://play.dlsite.com/", 544 | credentials: "include", 545 | }); 546 | return await response.json(); 547 | } 548 | 549 | async function getDownloadUrls(prefix) { 550 | const response = await fetch(`${prefix}ziptree.json`, { 551 | referrer: "https://play.dlsite.com/", 552 | credentials: "include", 553 | }); 554 | const zipTree = await response.json(); 555 | 556 | const result = []; 557 | 558 | const travel = (fileObj, index, path) => { 559 | if (fileObj.type === "folder") { 560 | fileObj.children.forEach((child, index) => travel(child, index, fileObj.path)); 561 | } 562 | if (fileObj.type === "file" && !fileObj.hashname.endsWith(".pdf")) { 563 | result.push({ 564 | filename: `${path ? `${path}/` : ""}${fileObj.name}`, 565 | optimized: zipTree.playfile[fileObj.hashname].image.optimized, 566 | }); 567 | } 568 | }; 569 | zipTree.tree.forEach(travel); 570 | // console.log(result); 571 | return result; 572 | } 573 | 574 | function getDecryptedImageData(optimized) { 575 | const qv = (t, s) => { 576 | // const MersenneTwister = unsafeWindow.module.exports; 577 | // const MersenneTwister = window.module.exports; 578 | const n = new MersenneTwister(t); 579 | for (let r = s.length - 1; r > 0; r--) { 580 | const o = Math.floor(n.random() * (r + 1)); 581 | [s[r], s[o]] = [s[o], s[r]]; 582 | } 583 | return s; 584 | }, 585 | Ir = (t, s) => (t >= s ? t % s : t), 586 | Lr = (t, s) => (t >= s ? Math.floor(t / s) : 0); 587 | const n = { 588 | w: Math.ceil(optimized.width / 128), 589 | h: Math.ceil(optimized.height / 128), 590 | }, 591 | r = parseInt(optimized.name.substring(5, 12), 16), 592 | i = qv(r, [...Array(n.w * n.h).keys()]).map((value, index) => ({ 593 | sx: 128 * Ir(index, n.w), 594 | sy: 128 * Lr(index, n.w), 595 | dx: 128 * Ir(value, n.w), 596 | dy: 128 * Lr(value, n.w), 597 | })); 598 | return { sourceCropSize: 128, cropCount: n, coordinates: i }; 599 | } 600 | 601 | async function imagePuzzle(downloadPrefix, { filename, optimized }) { 602 | let canvas = document.createElement("canvas"); 603 | canvas.width = optimized.width; 604 | canvas.height = optimized.height; 605 | let ctx = canvas.getContext("2d"); 606 | let binResponse = await fetch(`${downloadPrefix}optimized/${optimized.name}`, { 607 | method: "GET", 608 | headers: { 609 | Accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8", 610 | "Accept-Encoding": "gzip, deflate, br", 611 | "Accept-Language": "zh-CN,zh;q=0.9", 612 | "Sec-Fetch-Dest": "image", 613 | }, 614 | referrer: "https://play.dlsite.com/", 615 | credentials: "include", 616 | }); 617 | let blob = await binResponse.blob(); 618 | const img = new Image(); 619 | img.src = URL.createObjectURL(blob); 620 | return new Promise((resolve) => { 621 | img.onload = function () { 622 | const { sourceCropSize: sourceCropSize, cropCount: cropCount, coordinates: coordinates } = getDecryptedImageData(optimized), 623 | // g = isSpread && m === 1 ? t[0].width : 0, 624 | g = 0, 625 | // y = t[isSpread && m === 0 ? 1 : 0].height, 626 | // w = isSpread && optimized.height < y ? Math.round((y - optimized.height) / 2) : 0, 627 | w = 0, 628 | x = { 629 | w: img.width - optimized.width, 630 | h: img.height - optimized.height, 631 | }; 632 | for (const coordinate of coordinates) { 633 | const k = coordinate.dx + sourceCropSize === sourceCropSize * cropCount.w ? sourceCropSize - x.w : sourceCropSize, 634 | O = coordinate.dy + sourceCropSize === sourceCropSize * cropCount.h ? sourceCropSize - x.h : sourceCropSize; 635 | ctx.drawImage(img, coordinate.sx, coordinate.sy, k, O, coordinate.dx + g, coordinate.dy + w, k, O); 636 | } 637 | 638 | canvas.toBlob(function (blob) { 639 | resolve({ filename, blob }); 640 | }); 641 | }; 642 | }); 643 | } 644 | function save(mangaName, blobs) { 645 | const fileStream = streamSaver.createWriteStream(`${mangaName}.zip`); 646 | 647 | const readableZipStream = new ZIP({ 648 | start(ctrl) { 649 | blobs.forEach(({ blob, filename }, arrayIndex) => { 650 | let file = { 651 | // name: `${mangaName}/${(index + 1).toString().padStart(4, "0")}.jpg`, 652 | // name: `${(index + 1).toString().padStart(4, "0")}.png`, 653 | name: `${filename.split(".")[0]}.png`, 654 | stream: () => blob.stream(), 655 | }; 656 | ctrl.enqueue(file); 657 | }); 658 | ctrl.close(); 659 | }, 660 | }); 661 | 662 | // more optimized 663 | if (window.WritableStream && readableZipStream.pipeTo) { 664 | return readableZipStream.pipeTo(fileStream).then(() => { 665 | console.debug("done writing"); 666 | pluginPanel.addLog("下载已完成"); 667 | }); 668 | } 669 | 670 | // less optimized 671 | const writer = fileStream.getWriter(); 672 | const reader = readableZipStream.getReader(); 673 | const pump = () => reader.read().then((res) => (res.done ? writer.close() : writer.write(res.value).then(pump))); 674 | 675 | pump(); 676 | } 677 | 678 | async function getMangaName() { 679 | const response = await fetch(`https://play.dlsite.com/api/work/${location.href.match(/\/work\/(\w+)\//)[1]}`, { 680 | referrer: "https://play.dlsite.com/", 681 | credentials: "include", 682 | }); 683 | const result = await response.json(); 684 | return result.name["ja_JP"]; 685 | } 686 | })(); 687 | -------------------------------------------------------------------------------- /DLsite-Play-Downloader-vue/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dlsite-play-downloader-vue", 3 | "version": "2.0.2", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "dlsite-play-downloader-vue", 9 | "version": "2.0.2", 10 | "dependencies": { 11 | "adm-zip": "^0.5.16", 12 | "element-plus": "^2.11.4", 13 | "fflate": "^0.8.2", 14 | "file-type": "^21.0.0", 15 | "vue": "^3.5.19" 16 | }, 17 | "devDependencies": { 18 | "@vitejs/plugin-vue": "^6.0.1", 19 | "typescript": "^5.9.2", 20 | "unplugin-element-plus": "^0.10.0", 21 | "vite": "^7.1.3", 22 | "vite-plugin-monkey": "^7.1.1", 23 | "vue-tsc": "^3.0.6" 24 | } 25 | }, 26 | "node_modules/@babel/helper-string-parser": { 27 | "version": "7.27.1", 28 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", 29 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", 30 | "license": "MIT", 31 | "engines": { 32 | "node": ">=6.9.0" 33 | } 34 | }, 35 | "node_modules/@babel/helper-validator-identifier": { 36 | "version": "7.27.1", 37 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", 38 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", 39 | "license": "MIT", 40 | "engines": { 41 | "node": ">=6.9.0" 42 | } 43 | }, 44 | "node_modules/@babel/parser": { 45 | "version": "7.28.4", 46 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", 47 | "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", 48 | "license": "MIT", 49 | "dependencies": { 50 | "@babel/types": "^7.28.4" 51 | }, 52 | "bin": { 53 | "parser": "bin/babel-parser.js" 54 | }, 55 | "engines": { 56 | "node": ">=6.0.0" 57 | } 58 | }, 59 | "node_modules/@babel/types": { 60 | "version": "7.28.4", 61 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", 62 | "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", 63 | "license": "MIT", 64 | "dependencies": { 65 | "@babel/helper-string-parser": "^7.27.1", 66 | "@babel/helper-validator-identifier": "^7.27.1" 67 | }, 68 | "engines": { 69 | "node": ">=6.9.0" 70 | } 71 | }, 72 | "node_modules/@borewit/text-codec": { 73 | "version": "0.1.1", 74 | "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.1.1.tgz", 75 | "integrity": "sha512-5L/uBxmjaCIX5h8Z+uu+kA9BQLkc/Wl06UGR5ajNRxu+/XjonB5i8JpgFMrPj3LXTCPA0pv8yxUvbUi+QthGGA==", 76 | "license": "MIT", 77 | "funding": { 78 | "type": "github", 79 | "url": "https://github.com/sponsors/Borewit" 80 | } 81 | }, 82 | "node_modules/@ctrl/tinycolor": { 83 | "version": "3.6.1", 84 | "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", 85 | "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", 86 | "license": "MIT", 87 | "engines": { 88 | "node": ">=10" 89 | } 90 | }, 91 | "node_modules/@element-plus/icons-vue": { 92 | "version": "2.3.2", 93 | "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", 94 | "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", 95 | "license": "MIT", 96 | "peerDependencies": { 97 | "vue": "^3.2.0" 98 | } 99 | }, 100 | "node_modules/@esbuild/aix-ppc64": { 101 | "version": "0.25.9", 102 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", 103 | "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", 104 | "cpu": [ 105 | "ppc64" 106 | ], 107 | "dev": true, 108 | "license": "MIT", 109 | "optional": true, 110 | "os": [ 111 | "aix" 112 | ], 113 | "engines": { 114 | "node": ">=18" 115 | } 116 | }, 117 | "node_modules/@esbuild/android-arm": { 118 | "version": "0.25.9", 119 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", 120 | "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", 121 | "cpu": [ 122 | "arm" 123 | ], 124 | "dev": true, 125 | "license": "MIT", 126 | "optional": true, 127 | "os": [ 128 | "android" 129 | ], 130 | "engines": { 131 | "node": ">=18" 132 | } 133 | }, 134 | "node_modules/@esbuild/android-arm64": { 135 | "version": "0.25.9", 136 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", 137 | "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", 138 | "cpu": [ 139 | "arm64" 140 | ], 141 | "dev": true, 142 | "license": "MIT", 143 | "optional": true, 144 | "os": [ 145 | "android" 146 | ], 147 | "engines": { 148 | "node": ">=18" 149 | } 150 | }, 151 | "node_modules/@esbuild/android-x64": { 152 | "version": "0.25.9", 153 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", 154 | "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", 155 | "cpu": [ 156 | "x64" 157 | ], 158 | "dev": true, 159 | "license": "MIT", 160 | "optional": true, 161 | "os": [ 162 | "android" 163 | ], 164 | "engines": { 165 | "node": ">=18" 166 | } 167 | }, 168 | "node_modules/@esbuild/darwin-arm64": { 169 | "version": "0.25.9", 170 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", 171 | "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", 172 | "cpu": [ 173 | "arm64" 174 | ], 175 | "dev": true, 176 | "license": "MIT", 177 | "optional": true, 178 | "os": [ 179 | "darwin" 180 | ], 181 | "engines": { 182 | "node": ">=18" 183 | } 184 | }, 185 | "node_modules/@esbuild/darwin-x64": { 186 | "version": "0.25.9", 187 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", 188 | "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", 189 | "cpu": [ 190 | "x64" 191 | ], 192 | "dev": true, 193 | "license": "MIT", 194 | "optional": true, 195 | "os": [ 196 | "darwin" 197 | ], 198 | "engines": { 199 | "node": ">=18" 200 | } 201 | }, 202 | "node_modules/@esbuild/freebsd-arm64": { 203 | "version": "0.25.9", 204 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", 205 | "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", 206 | "cpu": [ 207 | "arm64" 208 | ], 209 | "dev": true, 210 | "license": "MIT", 211 | "optional": true, 212 | "os": [ 213 | "freebsd" 214 | ], 215 | "engines": { 216 | "node": ">=18" 217 | } 218 | }, 219 | "node_modules/@esbuild/freebsd-x64": { 220 | "version": "0.25.9", 221 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", 222 | "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", 223 | "cpu": [ 224 | "x64" 225 | ], 226 | "dev": true, 227 | "license": "MIT", 228 | "optional": true, 229 | "os": [ 230 | "freebsd" 231 | ], 232 | "engines": { 233 | "node": ">=18" 234 | } 235 | }, 236 | "node_modules/@esbuild/linux-arm": { 237 | "version": "0.25.9", 238 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", 239 | "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", 240 | "cpu": [ 241 | "arm" 242 | ], 243 | "dev": true, 244 | "license": "MIT", 245 | "optional": true, 246 | "os": [ 247 | "linux" 248 | ], 249 | "engines": { 250 | "node": ">=18" 251 | } 252 | }, 253 | "node_modules/@esbuild/linux-arm64": { 254 | "version": "0.25.9", 255 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", 256 | "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", 257 | "cpu": [ 258 | "arm64" 259 | ], 260 | "dev": true, 261 | "license": "MIT", 262 | "optional": true, 263 | "os": [ 264 | "linux" 265 | ], 266 | "engines": { 267 | "node": ">=18" 268 | } 269 | }, 270 | "node_modules/@esbuild/linux-ia32": { 271 | "version": "0.25.9", 272 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", 273 | "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", 274 | "cpu": [ 275 | "ia32" 276 | ], 277 | "dev": true, 278 | "license": "MIT", 279 | "optional": true, 280 | "os": [ 281 | "linux" 282 | ], 283 | "engines": { 284 | "node": ">=18" 285 | } 286 | }, 287 | "node_modules/@esbuild/linux-loong64": { 288 | "version": "0.25.9", 289 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", 290 | "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", 291 | "cpu": [ 292 | "loong64" 293 | ], 294 | "dev": true, 295 | "license": "MIT", 296 | "optional": true, 297 | "os": [ 298 | "linux" 299 | ], 300 | "engines": { 301 | "node": ">=18" 302 | } 303 | }, 304 | "node_modules/@esbuild/linux-mips64el": { 305 | "version": "0.25.9", 306 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", 307 | "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", 308 | "cpu": [ 309 | "mips64el" 310 | ], 311 | "dev": true, 312 | "license": "MIT", 313 | "optional": true, 314 | "os": [ 315 | "linux" 316 | ], 317 | "engines": { 318 | "node": ">=18" 319 | } 320 | }, 321 | "node_modules/@esbuild/linux-ppc64": { 322 | "version": "0.25.9", 323 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", 324 | "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", 325 | "cpu": [ 326 | "ppc64" 327 | ], 328 | "dev": true, 329 | "license": "MIT", 330 | "optional": true, 331 | "os": [ 332 | "linux" 333 | ], 334 | "engines": { 335 | "node": ">=18" 336 | } 337 | }, 338 | "node_modules/@esbuild/linux-riscv64": { 339 | "version": "0.25.9", 340 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", 341 | "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", 342 | "cpu": [ 343 | "riscv64" 344 | ], 345 | "dev": true, 346 | "license": "MIT", 347 | "optional": true, 348 | "os": [ 349 | "linux" 350 | ], 351 | "engines": { 352 | "node": ">=18" 353 | } 354 | }, 355 | "node_modules/@esbuild/linux-s390x": { 356 | "version": "0.25.9", 357 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", 358 | "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", 359 | "cpu": [ 360 | "s390x" 361 | ], 362 | "dev": true, 363 | "license": "MIT", 364 | "optional": true, 365 | "os": [ 366 | "linux" 367 | ], 368 | "engines": { 369 | "node": ">=18" 370 | } 371 | }, 372 | "node_modules/@esbuild/linux-x64": { 373 | "version": "0.25.9", 374 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", 375 | "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", 376 | "cpu": [ 377 | "x64" 378 | ], 379 | "dev": true, 380 | "license": "MIT", 381 | "optional": true, 382 | "os": [ 383 | "linux" 384 | ], 385 | "engines": { 386 | "node": ">=18" 387 | } 388 | }, 389 | "node_modules/@esbuild/netbsd-arm64": { 390 | "version": "0.25.9", 391 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", 392 | "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", 393 | "cpu": [ 394 | "arm64" 395 | ], 396 | "dev": true, 397 | "license": "MIT", 398 | "optional": true, 399 | "os": [ 400 | "netbsd" 401 | ], 402 | "engines": { 403 | "node": ">=18" 404 | } 405 | }, 406 | "node_modules/@esbuild/netbsd-x64": { 407 | "version": "0.25.9", 408 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", 409 | "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", 410 | "cpu": [ 411 | "x64" 412 | ], 413 | "dev": true, 414 | "license": "MIT", 415 | "optional": true, 416 | "os": [ 417 | "netbsd" 418 | ], 419 | "engines": { 420 | "node": ">=18" 421 | } 422 | }, 423 | "node_modules/@esbuild/openbsd-arm64": { 424 | "version": "0.25.9", 425 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", 426 | "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", 427 | "cpu": [ 428 | "arm64" 429 | ], 430 | "dev": true, 431 | "license": "MIT", 432 | "optional": true, 433 | "os": [ 434 | "openbsd" 435 | ], 436 | "engines": { 437 | "node": ">=18" 438 | } 439 | }, 440 | "node_modules/@esbuild/openbsd-x64": { 441 | "version": "0.25.9", 442 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", 443 | "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", 444 | "cpu": [ 445 | "x64" 446 | ], 447 | "dev": true, 448 | "license": "MIT", 449 | "optional": true, 450 | "os": [ 451 | "openbsd" 452 | ], 453 | "engines": { 454 | "node": ">=18" 455 | } 456 | }, 457 | "node_modules/@esbuild/openharmony-arm64": { 458 | "version": "0.25.9", 459 | "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", 460 | "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", 461 | "cpu": [ 462 | "arm64" 463 | ], 464 | "dev": true, 465 | "license": "MIT", 466 | "optional": true, 467 | "os": [ 468 | "openharmony" 469 | ], 470 | "engines": { 471 | "node": ">=18" 472 | } 473 | }, 474 | "node_modules/@esbuild/sunos-x64": { 475 | "version": "0.25.9", 476 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", 477 | "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", 478 | "cpu": [ 479 | "x64" 480 | ], 481 | "dev": true, 482 | "license": "MIT", 483 | "optional": true, 484 | "os": [ 485 | "sunos" 486 | ], 487 | "engines": { 488 | "node": ">=18" 489 | } 490 | }, 491 | "node_modules/@esbuild/win32-arm64": { 492 | "version": "0.25.9", 493 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", 494 | "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", 495 | "cpu": [ 496 | "arm64" 497 | ], 498 | "dev": true, 499 | "license": "MIT", 500 | "optional": true, 501 | "os": [ 502 | "win32" 503 | ], 504 | "engines": { 505 | "node": ">=18" 506 | } 507 | }, 508 | "node_modules/@esbuild/win32-ia32": { 509 | "version": "0.25.9", 510 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", 511 | "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", 512 | "cpu": [ 513 | "ia32" 514 | ], 515 | "dev": true, 516 | "license": "MIT", 517 | "optional": true, 518 | "os": [ 519 | "win32" 520 | ], 521 | "engines": { 522 | "node": ">=18" 523 | } 524 | }, 525 | "node_modules/@esbuild/win32-x64": { 526 | "version": "0.25.9", 527 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", 528 | "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", 529 | "cpu": [ 530 | "x64" 531 | ], 532 | "dev": true, 533 | "license": "MIT", 534 | "optional": true, 535 | "os": [ 536 | "win32" 537 | ], 538 | "engines": { 539 | "node": ">=18" 540 | } 541 | }, 542 | "node_modules/@floating-ui/core": { 543 | "version": "1.7.3", 544 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", 545 | "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", 546 | "license": "MIT", 547 | "dependencies": { 548 | "@floating-ui/utils": "^0.2.10" 549 | } 550 | }, 551 | "node_modules/@floating-ui/dom": { 552 | "version": "1.7.4", 553 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", 554 | "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", 555 | "license": "MIT", 556 | "dependencies": { 557 | "@floating-ui/core": "^1.7.3", 558 | "@floating-ui/utils": "^0.2.10" 559 | } 560 | }, 561 | "node_modules/@floating-ui/utils": { 562 | "version": "0.2.10", 563 | "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", 564 | "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", 565 | "license": "MIT" 566 | }, 567 | "node_modules/@jridgewell/gen-mapping": { 568 | "version": "0.3.13", 569 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 570 | "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 571 | "dev": true, 572 | "license": "MIT", 573 | "dependencies": { 574 | "@jridgewell/sourcemap-codec": "^1.5.0", 575 | "@jridgewell/trace-mapping": "^0.3.24" 576 | } 577 | }, 578 | "node_modules/@jridgewell/remapping": { 579 | "version": "2.3.5", 580 | "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 581 | "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 582 | "dev": true, 583 | "license": "MIT", 584 | "dependencies": { 585 | "@jridgewell/gen-mapping": "^0.3.5", 586 | "@jridgewell/trace-mapping": "^0.3.24" 587 | } 588 | }, 589 | "node_modules/@jridgewell/resolve-uri": { 590 | "version": "3.1.2", 591 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 592 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 593 | "dev": true, 594 | "license": "MIT", 595 | "engines": { 596 | "node": ">=6.0.0" 597 | } 598 | }, 599 | "node_modules/@jridgewell/sourcemap-codec": { 600 | "version": "1.5.5", 601 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 602 | "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 603 | "license": "MIT" 604 | }, 605 | "node_modules/@jridgewell/trace-mapping": { 606 | "version": "0.3.31", 607 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 608 | "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 609 | "dev": true, 610 | "license": "MIT", 611 | "dependencies": { 612 | "@jridgewell/resolve-uri": "^3.1.0", 613 | "@jridgewell/sourcemap-codec": "^1.4.14" 614 | } 615 | }, 616 | "node_modules/@popperjs/core": { 617 | "name": "@sxzz/popperjs-es", 618 | "version": "2.11.7", 619 | "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", 620 | "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", 621 | "license": "MIT", 622 | "funding": { 623 | "type": "opencollective", 624 | "url": "https://opencollective.com/popperjs" 625 | } 626 | }, 627 | "node_modules/@rolldown/pluginutils": { 628 | "version": "1.0.0-beta.29", 629 | "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.29.tgz", 630 | "integrity": "sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==", 631 | "dev": true, 632 | "license": "MIT" 633 | }, 634 | "node_modules/@rollup/rollup-android-arm-eabi": { 635 | "version": "4.50.1", 636 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", 637 | "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", 638 | "cpu": [ 639 | "arm" 640 | ], 641 | "dev": true, 642 | "license": "MIT", 643 | "optional": true, 644 | "os": [ 645 | "android" 646 | ] 647 | }, 648 | "node_modules/@rollup/rollup-android-arm64": { 649 | "version": "4.50.1", 650 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", 651 | "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", 652 | "cpu": [ 653 | "arm64" 654 | ], 655 | "dev": true, 656 | "license": "MIT", 657 | "optional": true, 658 | "os": [ 659 | "android" 660 | ] 661 | }, 662 | "node_modules/@rollup/rollup-darwin-arm64": { 663 | "version": "4.50.1", 664 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", 665 | "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", 666 | "cpu": [ 667 | "arm64" 668 | ], 669 | "dev": true, 670 | "license": "MIT", 671 | "optional": true, 672 | "os": [ 673 | "darwin" 674 | ] 675 | }, 676 | "node_modules/@rollup/rollup-darwin-x64": { 677 | "version": "4.50.1", 678 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", 679 | "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", 680 | "cpu": [ 681 | "x64" 682 | ], 683 | "dev": true, 684 | "license": "MIT", 685 | "optional": true, 686 | "os": [ 687 | "darwin" 688 | ] 689 | }, 690 | "node_modules/@rollup/rollup-freebsd-arm64": { 691 | "version": "4.50.1", 692 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", 693 | "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", 694 | "cpu": [ 695 | "arm64" 696 | ], 697 | "dev": true, 698 | "license": "MIT", 699 | "optional": true, 700 | "os": [ 701 | "freebsd" 702 | ] 703 | }, 704 | "node_modules/@rollup/rollup-freebsd-x64": { 705 | "version": "4.50.1", 706 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", 707 | "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", 708 | "cpu": [ 709 | "x64" 710 | ], 711 | "dev": true, 712 | "license": "MIT", 713 | "optional": true, 714 | "os": [ 715 | "freebsd" 716 | ] 717 | }, 718 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 719 | "version": "4.50.1", 720 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", 721 | "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", 722 | "cpu": [ 723 | "arm" 724 | ], 725 | "dev": true, 726 | "license": "MIT", 727 | "optional": true, 728 | "os": [ 729 | "linux" 730 | ] 731 | }, 732 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 733 | "version": "4.50.1", 734 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", 735 | "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", 736 | "cpu": [ 737 | "arm" 738 | ], 739 | "dev": true, 740 | "license": "MIT", 741 | "optional": true, 742 | "os": [ 743 | "linux" 744 | ] 745 | }, 746 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 747 | "version": "4.50.1", 748 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", 749 | "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", 750 | "cpu": [ 751 | "arm64" 752 | ], 753 | "dev": true, 754 | "license": "MIT", 755 | "optional": true, 756 | "os": [ 757 | "linux" 758 | ] 759 | }, 760 | "node_modules/@rollup/rollup-linux-arm64-musl": { 761 | "version": "4.50.1", 762 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", 763 | "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", 764 | "cpu": [ 765 | "arm64" 766 | ], 767 | "dev": true, 768 | "license": "MIT", 769 | "optional": true, 770 | "os": [ 771 | "linux" 772 | ] 773 | }, 774 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 775 | "version": "4.50.1", 776 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", 777 | "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", 778 | "cpu": [ 779 | "loong64" 780 | ], 781 | "dev": true, 782 | "license": "MIT", 783 | "optional": true, 784 | "os": [ 785 | "linux" 786 | ] 787 | }, 788 | "node_modules/@rollup/rollup-linux-ppc64-gnu": { 789 | "version": "4.50.1", 790 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", 791 | "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", 792 | "cpu": [ 793 | "ppc64" 794 | ], 795 | "dev": true, 796 | "license": "MIT", 797 | "optional": true, 798 | "os": [ 799 | "linux" 800 | ] 801 | }, 802 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 803 | "version": "4.50.1", 804 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", 805 | "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", 806 | "cpu": [ 807 | "riscv64" 808 | ], 809 | "dev": true, 810 | "license": "MIT", 811 | "optional": true, 812 | "os": [ 813 | "linux" 814 | ] 815 | }, 816 | "node_modules/@rollup/rollup-linux-riscv64-musl": { 817 | "version": "4.50.1", 818 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", 819 | "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", 820 | "cpu": [ 821 | "riscv64" 822 | ], 823 | "dev": true, 824 | "license": "MIT", 825 | "optional": true, 826 | "os": [ 827 | "linux" 828 | ] 829 | }, 830 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 831 | "version": "4.50.1", 832 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", 833 | "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", 834 | "cpu": [ 835 | "s390x" 836 | ], 837 | "dev": true, 838 | "license": "MIT", 839 | "optional": true, 840 | "os": [ 841 | "linux" 842 | ] 843 | }, 844 | "node_modules/@rollup/rollup-linux-x64-gnu": { 845 | "version": "4.50.1", 846 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", 847 | "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", 848 | "cpu": [ 849 | "x64" 850 | ], 851 | "dev": true, 852 | "license": "MIT", 853 | "optional": true, 854 | "os": [ 855 | "linux" 856 | ] 857 | }, 858 | "node_modules/@rollup/rollup-linux-x64-musl": { 859 | "version": "4.50.1", 860 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", 861 | "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", 862 | "cpu": [ 863 | "x64" 864 | ], 865 | "dev": true, 866 | "license": "MIT", 867 | "optional": true, 868 | "os": [ 869 | "linux" 870 | ] 871 | }, 872 | "node_modules/@rollup/rollup-openharmony-arm64": { 873 | "version": "4.50.1", 874 | "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", 875 | "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", 876 | "cpu": [ 877 | "arm64" 878 | ], 879 | "dev": true, 880 | "license": "MIT", 881 | "optional": true, 882 | "os": [ 883 | "openharmony" 884 | ] 885 | }, 886 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 887 | "version": "4.50.1", 888 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", 889 | "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", 890 | "cpu": [ 891 | "arm64" 892 | ], 893 | "dev": true, 894 | "license": "MIT", 895 | "optional": true, 896 | "os": [ 897 | "win32" 898 | ] 899 | }, 900 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 901 | "version": "4.50.1", 902 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", 903 | "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", 904 | "cpu": [ 905 | "ia32" 906 | ], 907 | "dev": true, 908 | "license": "MIT", 909 | "optional": true, 910 | "os": [ 911 | "win32" 912 | ] 913 | }, 914 | "node_modules/@rollup/rollup-win32-x64-msvc": { 915 | "version": "4.50.1", 916 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", 917 | "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", 918 | "cpu": [ 919 | "x64" 920 | ], 921 | "dev": true, 922 | "license": "MIT", 923 | "optional": true, 924 | "os": [ 925 | "win32" 926 | ] 927 | }, 928 | "node_modules/@tokenizer/inflate": { 929 | "version": "0.2.7", 930 | "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", 931 | "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", 932 | "license": "MIT", 933 | "dependencies": { 934 | "debug": "^4.4.0", 935 | "fflate": "^0.8.2", 936 | "token-types": "^6.0.0" 937 | }, 938 | "engines": { 939 | "node": ">=18" 940 | }, 941 | "funding": { 942 | "type": "github", 943 | "url": "https://github.com/sponsors/Borewit" 944 | } 945 | }, 946 | "node_modules/@tokenizer/token": { 947 | "version": "0.3.0", 948 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 949 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", 950 | "license": "MIT" 951 | }, 952 | "node_modules/@types/estree": { 953 | "version": "1.0.8", 954 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", 955 | "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", 956 | "dev": true, 957 | "license": "MIT" 958 | }, 959 | "node_modules/@types/lodash": { 960 | "version": "4.17.20", 961 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", 962 | "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", 963 | "license": "MIT" 964 | }, 965 | "node_modules/@types/lodash-es": { 966 | "version": "4.17.12", 967 | "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", 968 | "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", 969 | "license": "MIT", 970 | "dependencies": { 971 | "@types/lodash": "*" 972 | } 973 | }, 974 | "node_modules/@types/web-bluetooth": { 975 | "version": "0.0.16", 976 | "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", 977 | "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", 978 | "license": "MIT" 979 | }, 980 | "node_modules/@vitejs/plugin-vue": { 981 | "version": "6.0.1", 982 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", 983 | "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", 984 | "dev": true, 985 | "license": "MIT", 986 | "dependencies": { 987 | "@rolldown/pluginutils": "1.0.0-beta.29" 988 | }, 989 | "engines": { 990 | "node": "^20.19.0 || >=22.12.0" 991 | }, 992 | "peerDependencies": { 993 | "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", 994 | "vue": "^3.2.25" 995 | } 996 | }, 997 | "node_modules/@volar/language-core": { 998 | "version": "2.4.23", 999 | "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.23.tgz", 1000 | "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==", 1001 | "dev": true, 1002 | "license": "MIT", 1003 | "dependencies": { 1004 | "@volar/source-map": "2.4.23" 1005 | } 1006 | }, 1007 | "node_modules/@volar/source-map": { 1008 | "version": "2.4.23", 1009 | "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.23.tgz", 1010 | "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==", 1011 | "dev": true, 1012 | "license": "MIT" 1013 | }, 1014 | "node_modules/@volar/typescript": { 1015 | "version": "2.4.23", 1016 | "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.23.tgz", 1017 | "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==", 1018 | "dev": true, 1019 | "license": "MIT", 1020 | "dependencies": { 1021 | "@volar/language-core": "2.4.23", 1022 | "path-browserify": "^1.0.1", 1023 | "vscode-uri": "^3.0.8" 1024 | } 1025 | }, 1026 | "node_modules/@vue/compiler-core": { 1027 | "version": "3.5.21", 1028 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.21.tgz", 1029 | "integrity": "sha512-8i+LZ0vf6ZgII5Z9XmUvrCyEzocvWT+TeR2VBUVlzIH6Tyv57E20mPZ1bCS+tbejgUgmjrEh7q/0F0bibskAmw==", 1030 | "license": "MIT", 1031 | "dependencies": { 1032 | "@babel/parser": "^7.28.3", 1033 | "@vue/shared": "3.5.21", 1034 | "entities": "^4.5.0", 1035 | "estree-walker": "^2.0.2", 1036 | "source-map-js": "^1.2.1" 1037 | } 1038 | }, 1039 | "node_modules/@vue/compiler-core/node_modules/entities": { 1040 | "version": "4.5.0", 1041 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1042 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1043 | "license": "BSD-2-Clause", 1044 | "engines": { 1045 | "node": ">=0.12" 1046 | }, 1047 | "funding": { 1048 | "url": "https://github.com/fb55/entities?sponsor=1" 1049 | } 1050 | }, 1051 | "node_modules/@vue/compiler-dom": { 1052 | "version": "3.5.21", 1053 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.21.tgz", 1054 | "integrity": "sha512-jNtbu/u97wiyEBJlJ9kmdw7tAr5Vy0Aj5CgQmo+6pxWNQhXZDPsRr1UWPN4v3Zf82s2H3kF51IbzZ4jMWAgPlQ==", 1055 | "license": "MIT", 1056 | "dependencies": { 1057 | "@vue/compiler-core": "3.5.21", 1058 | "@vue/shared": "3.5.21" 1059 | } 1060 | }, 1061 | "node_modules/@vue/compiler-sfc": { 1062 | "version": "3.5.21", 1063 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.21.tgz", 1064 | "integrity": "sha512-SXlyk6I5eUGBd2v8Ie7tF6ADHE9kCR6mBEuPyH1nUZ0h6Xx6nZI29i12sJKQmzbDyr2tUHMhhTt51Z6blbkTTQ==", 1065 | "license": "MIT", 1066 | "dependencies": { 1067 | "@babel/parser": "^7.28.3", 1068 | "@vue/compiler-core": "3.5.21", 1069 | "@vue/compiler-dom": "3.5.21", 1070 | "@vue/compiler-ssr": "3.5.21", 1071 | "@vue/shared": "3.5.21", 1072 | "estree-walker": "^2.0.2", 1073 | "magic-string": "^0.30.18", 1074 | "postcss": "^8.5.6", 1075 | "source-map-js": "^1.2.1" 1076 | } 1077 | }, 1078 | "node_modules/@vue/compiler-ssr": { 1079 | "version": "3.5.21", 1080 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.21.tgz", 1081 | "integrity": "sha512-vKQ5olH5edFZdf5ZrlEgSO1j1DMA4u23TVK5XR1uMhvwnYvVdDF0nHXJUblL/GvzlShQbjhZZ2uvYmDlAbgo9w==", 1082 | "license": "MIT", 1083 | "dependencies": { 1084 | "@vue/compiler-dom": "3.5.21", 1085 | "@vue/shared": "3.5.21" 1086 | } 1087 | }, 1088 | "node_modules/@vue/compiler-vue2": { 1089 | "version": "2.7.16", 1090 | "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", 1091 | "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", 1092 | "dev": true, 1093 | "license": "MIT", 1094 | "dependencies": { 1095 | "de-indent": "^1.0.2", 1096 | "he": "^1.2.0" 1097 | } 1098 | }, 1099 | "node_modules/@vue/language-core": { 1100 | "version": "3.0.6", 1101 | "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.0.6.tgz", 1102 | "integrity": "sha512-e2RRzYWm+qGm8apUHW1wA5RQxzNhkqbbKdbKhiDUcmMrNAZGyM8aTiL3UrTqkaFI5s7wJRGGrp4u3jgusuBp2A==", 1103 | "dev": true, 1104 | "license": "MIT", 1105 | "dependencies": { 1106 | "@volar/language-core": "2.4.23", 1107 | "@vue/compiler-dom": "^3.5.0", 1108 | "@vue/compiler-vue2": "^2.7.16", 1109 | "@vue/shared": "^3.5.0", 1110 | "alien-signals": "^2.0.5", 1111 | "muggle-string": "^0.4.1", 1112 | "path-browserify": "^1.0.1", 1113 | "picomatch": "^4.0.2" 1114 | }, 1115 | "peerDependencies": { 1116 | "typescript": "*" 1117 | }, 1118 | "peerDependenciesMeta": { 1119 | "typescript": { 1120 | "optional": true 1121 | } 1122 | } 1123 | }, 1124 | "node_modules/@vue/reactivity": { 1125 | "version": "3.5.21", 1126 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.21.tgz", 1127 | "integrity": "sha512-3ah7sa+Cwr9iiYEERt9JfZKPw4A2UlbY8RbbnH2mGCE8NwHkhmlZt2VsH0oDA3P08X3jJd29ohBDtX+TbD9AsA==", 1128 | "license": "MIT", 1129 | "dependencies": { 1130 | "@vue/shared": "3.5.21" 1131 | } 1132 | }, 1133 | "node_modules/@vue/runtime-core": { 1134 | "version": "3.5.21", 1135 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.21.tgz", 1136 | "integrity": "sha512-+DplQlRS4MXfIf9gfD1BOJpk5RSyGgGXD/R+cumhe8jdjUcq/qlxDawQlSI8hCKupBlvM+3eS1se5xW+SuNAwA==", 1137 | "license": "MIT", 1138 | "dependencies": { 1139 | "@vue/reactivity": "3.5.21", 1140 | "@vue/shared": "3.5.21" 1141 | } 1142 | }, 1143 | "node_modules/@vue/runtime-dom": { 1144 | "version": "3.5.21", 1145 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.21.tgz", 1146 | "integrity": "sha512-3M2DZsOFwM5qI15wrMmNF5RJe1+ARijt2HM3TbzBbPSuBHOQpoidE+Pa+XEaVN+czbHf81ETRoG1ltztP2em8w==", 1147 | "license": "MIT", 1148 | "dependencies": { 1149 | "@vue/reactivity": "3.5.21", 1150 | "@vue/runtime-core": "3.5.21", 1151 | "@vue/shared": "3.5.21", 1152 | "csstype": "^3.1.3" 1153 | } 1154 | }, 1155 | "node_modules/@vue/server-renderer": { 1156 | "version": "3.5.21", 1157 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.21.tgz", 1158 | "integrity": "sha512-qr8AqgD3DJPJcGvLcJKQo2tAc8OnXRcfxhOJCPF+fcfn5bBGz7VCcO7t+qETOPxpWK1mgysXvVT/j+xWaHeMWA==", 1159 | "license": "MIT", 1160 | "dependencies": { 1161 | "@vue/compiler-ssr": "3.5.21", 1162 | "@vue/shared": "3.5.21" 1163 | }, 1164 | "peerDependencies": { 1165 | "vue": "3.5.21" 1166 | } 1167 | }, 1168 | "node_modules/@vue/shared": { 1169 | "version": "3.5.21", 1170 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.21.tgz", 1171 | "integrity": "sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==", 1172 | "license": "MIT" 1173 | }, 1174 | "node_modules/@vueuse/core": { 1175 | "version": "9.13.0", 1176 | "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", 1177 | "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", 1178 | "license": "MIT", 1179 | "dependencies": { 1180 | "@types/web-bluetooth": "^0.0.16", 1181 | "@vueuse/metadata": "9.13.0", 1182 | "@vueuse/shared": "9.13.0", 1183 | "vue-demi": "*" 1184 | }, 1185 | "funding": { 1186 | "url": "https://github.com/sponsors/antfu" 1187 | } 1188 | }, 1189 | "node_modules/@vueuse/core/node_modules/vue-demi": { 1190 | "version": "0.14.10", 1191 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", 1192 | "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", 1193 | "hasInstallScript": true, 1194 | "license": "MIT", 1195 | "bin": { 1196 | "vue-demi-fix": "bin/vue-demi-fix.js", 1197 | "vue-demi-switch": "bin/vue-demi-switch.js" 1198 | }, 1199 | "engines": { 1200 | "node": ">=12" 1201 | }, 1202 | "funding": { 1203 | "url": "https://github.com/sponsors/antfu" 1204 | }, 1205 | "peerDependencies": { 1206 | "@vue/composition-api": "^1.0.0-rc.1", 1207 | "vue": "^3.0.0-0 || ^2.6.0" 1208 | }, 1209 | "peerDependenciesMeta": { 1210 | "@vue/composition-api": { 1211 | "optional": true 1212 | } 1213 | } 1214 | }, 1215 | "node_modules/@vueuse/metadata": { 1216 | "version": "9.13.0", 1217 | "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", 1218 | "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", 1219 | "license": "MIT", 1220 | "funding": { 1221 | "url": "https://github.com/sponsors/antfu" 1222 | } 1223 | }, 1224 | "node_modules/@vueuse/shared": { 1225 | "version": "9.13.0", 1226 | "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", 1227 | "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", 1228 | "license": "MIT", 1229 | "dependencies": { 1230 | "vue-demi": "*" 1231 | }, 1232 | "funding": { 1233 | "url": "https://github.com/sponsors/antfu" 1234 | } 1235 | }, 1236 | "node_modules/@vueuse/shared/node_modules/vue-demi": { 1237 | "version": "0.14.10", 1238 | "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", 1239 | "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", 1240 | "hasInstallScript": true, 1241 | "license": "MIT", 1242 | "bin": { 1243 | "vue-demi-fix": "bin/vue-demi-fix.js", 1244 | "vue-demi-switch": "bin/vue-demi-switch.js" 1245 | }, 1246 | "engines": { 1247 | "node": ">=12" 1248 | }, 1249 | "funding": { 1250 | "url": "https://github.com/sponsors/antfu" 1251 | }, 1252 | "peerDependencies": { 1253 | "@vue/composition-api": "^1.0.0-rc.1", 1254 | "vue": "^3.0.0-0 || ^2.6.0" 1255 | }, 1256 | "peerDependenciesMeta": { 1257 | "@vue/composition-api": { 1258 | "optional": true 1259 | } 1260 | } 1261 | }, 1262 | "node_modules/acorn": { 1263 | "version": "8.15.0", 1264 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", 1265 | "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", 1266 | "dev": true, 1267 | "license": "MIT", 1268 | "bin": { 1269 | "acorn": "bin/acorn" 1270 | }, 1271 | "engines": { 1272 | "node": ">=0.4.0" 1273 | } 1274 | }, 1275 | "node_modules/acorn-walk": { 1276 | "version": "8.3.4", 1277 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", 1278 | "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", 1279 | "dev": true, 1280 | "license": "MIT", 1281 | "dependencies": { 1282 | "acorn": "^8.11.0" 1283 | }, 1284 | "engines": { 1285 | "node": ">=0.4.0" 1286 | } 1287 | }, 1288 | "node_modules/adm-zip": { 1289 | "version": "0.5.16", 1290 | "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", 1291 | "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", 1292 | "license": "MIT", 1293 | "engines": { 1294 | "node": ">=12.0" 1295 | } 1296 | }, 1297 | "node_modules/alien-signals": { 1298 | "version": "2.0.7", 1299 | "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-2.0.7.tgz", 1300 | "integrity": "sha512-wE7y3jmYeb0+h6mr5BOovuqhFv22O/MV9j5p0ndJsa7z1zJNPGQ4ph5pQk/kTTCWRC3xsA4SmtwmkzQO+7NCNg==", 1301 | "dev": true, 1302 | "license": "MIT" 1303 | }, 1304 | "node_modules/async-validator": { 1305 | "version": "4.2.5", 1306 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", 1307 | "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", 1308 | "license": "MIT" 1309 | }, 1310 | "node_modules/balanced-match": { 1311 | "version": "1.0.2", 1312 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1313 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1314 | "dev": true, 1315 | "license": "MIT" 1316 | }, 1317 | "node_modules/brace-expansion": { 1318 | "version": "1.1.12", 1319 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", 1320 | "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 1321 | "dev": true, 1322 | "license": "MIT", 1323 | "dependencies": { 1324 | "balanced-match": "^1.0.0", 1325 | "concat-map": "0.0.1" 1326 | } 1327 | }, 1328 | "node_modules/bundle-name": { 1329 | "version": "4.1.0", 1330 | "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", 1331 | "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", 1332 | "dev": true, 1333 | "license": "MIT", 1334 | "dependencies": { 1335 | "run-applescript": "^7.0.0" 1336 | }, 1337 | "engines": { 1338 | "node": ">=18" 1339 | }, 1340 | "funding": { 1341 | "url": "https://github.com/sponsors/sindresorhus" 1342 | } 1343 | }, 1344 | "node_modules/concat-map": { 1345 | "version": "0.0.1", 1346 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 1347 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 1348 | "dev": true, 1349 | "license": "MIT" 1350 | }, 1351 | "node_modules/cross-spawn": { 1352 | "version": "7.0.6", 1353 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1354 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1355 | "dev": true, 1356 | "license": "MIT", 1357 | "dependencies": { 1358 | "path-key": "^3.1.0", 1359 | "shebang-command": "^2.0.0", 1360 | "which": "^2.0.1" 1361 | }, 1362 | "engines": { 1363 | "node": ">= 8" 1364 | } 1365 | }, 1366 | "node_modules/csstype": { 1367 | "version": "3.1.3", 1368 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1369 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1370 | "license": "MIT" 1371 | }, 1372 | "node_modules/cuint": { 1373 | "version": "0.2.2", 1374 | "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", 1375 | "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", 1376 | "dev": true, 1377 | "license": "MIT" 1378 | }, 1379 | "node_modules/dayjs": { 1380 | "version": "1.11.18", 1381 | "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", 1382 | "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", 1383 | "license": "MIT" 1384 | }, 1385 | "node_modules/de-indent": { 1386 | "version": "1.0.2", 1387 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", 1388 | "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", 1389 | "dev": true, 1390 | "license": "MIT" 1391 | }, 1392 | "node_modules/debug": { 1393 | "version": "4.4.3", 1394 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", 1395 | "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", 1396 | "license": "MIT", 1397 | "dependencies": { 1398 | "ms": "^2.1.3" 1399 | }, 1400 | "engines": { 1401 | "node": ">=6.0" 1402 | }, 1403 | "peerDependenciesMeta": { 1404 | "supports-color": { 1405 | "optional": true 1406 | } 1407 | } 1408 | }, 1409 | "node_modules/default-browser": { 1410 | "version": "5.2.1", 1411 | "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", 1412 | "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", 1413 | "dev": true, 1414 | "license": "MIT", 1415 | "dependencies": { 1416 | "bundle-name": "^4.1.0", 1417 | "default-browser-id": "^5.0.0" 1418 | }, 1419 | "engines": { 1420 | "node": ">=18" 1421 | }, 1422 | "funding": { 1423 | "url": "https://github.com/sponsors/sindresorhus" 1424 | } 1425 | }, 1426 | "node_modules/default-browser-id": { 1427 | "version": "5.0.0", 1428 | "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", 1429 | "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", 1430 | "dev": true, 1431 | "license": "MIT", 1432 | "engines": { 1433 | "node": ">=18" 1434 | }, 1435 | "funding": { 1436 | "url": "https://github.com/sponsors/sindresorhus" 1437 | } 1438 | }, 1439 | "node_modules/define-lazy-prop": { 1440 | "version": "3.0.0", 1441 | "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", 1442 | "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", 1443 | "dev": true, 1444 | "license": "MIT", 1445 | "engines": { 1446 | "node": ">=12" 1447 | }, 1448 | "funding": { 1449 | "url": "https://github.com/sponsors/sindresorhus" 1450 | } 1451 | }, 1452 | "node_modules/dom-serializer": { 1453 | "version": "2.0.0", 1454 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", 1455 | "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", 1456 | "dev": true, 1457 | "license": "MIT", 1458 | "dependencies": { 1459 | "domelementtype": "^2.3.0", 1460 | "domhandler": "^5.0.2", 1461 | "entities": "^4.2.0" 1462 | }, 1463 | "funding": { 1464 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 1465 | } 1466 | }, 1467 | "node_modules/dom-serializer/node_modules/entities": { 1468 | "version": "4.5.0", 1469 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1470 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 1471 | "dev": true, 1472 | "license": "BSD-2-Clause", 1473 | "engines": { 1474 | "node": ">=0.12" 1475 | }, 1476 | "funding": { 1477 | "url": "https://github.com/fb55/entities?sponsor=1" 1478 | } 1479 | }, 1480 | "node_modules/domelementtype": { 1481 | "version": "2.3.0", 1482 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 1483 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 1484 | "dev": true, 1485 | "funding": [ 1486 | { 1487 | "type": "github", 1488 | "url": "https://github.com/sponsors/fb55" 1489 | } 1490 | ], 1491 | "license": "BSD-2-Clause" 1492 | }, 1493 | "node_modules/domhandler": { 1494 | "version": "5.0.3", 1495 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", 1496 | "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", 1497 | "dev": true, 1498 | "license": "BSD-2-Clause", 1499 | "dependencies": { 1500 | "domelementtype": "^2.3.0" 1501 | }, 1502 | "engines": { 1503 | "node": ">= 4" 1504 | }, 1505 | "funding": { 1506 | "url": "https://github.com/fb55/domhandler?sponsor=1" 1507 | } 1508 | }, 1509 | "node_modules/domutils": { 1510 | "version": "3.2.2", 1511 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", 1512 | "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", 1513 | "dev": true, 1514 | "license": "BSD-2-Clause", 1515 | "dependencies": { 1516 | "dom-serializer": "^2.0.0", 1517 | "domelementtype": "^2.3.0", 1518 | "domhandler": "^5.0.3" 1519 | }, 1520 | "funding": { 1521 | "url": "https://github.com/fb55/domutils?sponsor=1" 1522 | } 1523 | }, 1524 | "node_modules/element-plus": { 1525 | "version": "2.11.4", 1526 | "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.11.4.tgz", 1527 | "integrity": "sha512-sLq+Ypd0cIVilv8wGGMEGvzRVBBsRpJjnAS5PsI/1JU1COZXqzH3N1UYMUc/HCdvdjf6dfrBy80Sj7KcACsT7w==", 1528 | "license": "MIT", 1529 | "dependencies": { 1530 | "@ctrl/tinycolor": "^3.4.1", 1531 | "@element-plus/icons-vue": "^2.3.1", 1532 | "@floating-ui/dom": "^1.0.1", 1533 | "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", 1534 | "@types/lodash": "^4.17.20", 1535 | "@types/lodash-es": "^4.17.12", 1536 | "@vueuse/core": "^9.1.0", 1537 | "async-validator": "^4.2.5", 1538 | "dayjs": "^1.11.13", 1539 | "escape-html": "^1.0.3", 1540 | "lodash": "^4.17.21", 1541 | "lodash-es": "^4.17.21", 1542 | "lodash-unified": "^1.0.3", 1543 | "memoize-one": "^6.0.0", 1544 | "normalize-wheel-es": "^1.2.0" 1545 | }, 1546 | "peerDependencies": { 1547 | "vue": "^3.2.0" 1548 | } 1549 | }, 1550 | "node_modules/entities": { 1551 | "version": "6.0.1", 1552 | "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", 1553 | "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", 1554 | "dev": true, 1555 | "license": "BSD-2-Clause", 1556 | "engines": { 1557 | "node": ">=0.12" 1558 | }, 1559 | "funding": { 1560 | "url": "https://github.com/fb55/entities?sponsor=1" 1561 | } 1562 | }, 1563 | "node_modules/es-module-lexer": { 1564 | "version": "1.7.0", 1565 | "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", 1566 | "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", 1567 | "dev": true, 1568 | "license": "MIT" 1569 | }, 1570 | "node_modules/esbuild": { 1571 | "version": "0.25.9", 1572 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", 1573 | "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", 1574 | "dev": true, 1575 | "hasInstallScript": true, 1576 | "license": "MIT", 1577 | "bin": { 1578 | "esbuild": "bin/esbuild" 1579 | }, 1580 | "engines": { 1581 | "node": ">=18" 1582 | }, 1583 | "optionalDependencies": { 1584 | "@esbuild/aix-ppc64": "0.25.9", 1585 | "@esbuild/android-arm": "0.25.9", 1586 | "@esbuild/android-arm64": "0.25.9", 1587 | "@esbuild/android-x64": "0.25.9", 1588 | "@esbuild/darwin-arm64": "0.25.9", 1589 | "@esbuild/darwin-x64": "0.25.9", 1590 | "@esbuild/freebsd-arm64": "0.25.9", 1591 | "@esbuild/freebsd-x64": "0.25.9", 1592 | "@esbuild/linux-arm": "0.25.9", 1593 | "@esbuild/linux-arm64": "0.25.9", 1594 | "@esbuild/linux-ia32": "0.25.9", 1595 | "@esbuild/linux-loong64": "0.25.9", 1596 | "@esbuild/linux-mips64el": "0.25.9", 1597 | "@esbuild/linux-ppc64": "0.25.9", 1598 | "@esbuild/linux-riscv64": "0.25.9", 1599 | "@esbuild/linux-s390x": "0.25.9", 1600 | "@esbuild/linux-x64": "0.25.9", 1601 | "@esbuild/netbsd-arm64": "0.25.9", 1602 | "@esbuild/netbsd-x64": "0.25.9", 1603 | "@esbuild/openbsd-arm64": "0.25.9", 1604 | "@esbuild/openbsd-x64": "0.25.9", 1605 | "@esbuild/openharmony-arm64": "0.25.9", 1606 | "@esbuild/sunos-x64": "0.25.9", 1607 | "@esbuild/win32-arm64": "0.25.9", 1608 | "@esbuild/win32-ia32": "0.25.9", 1609 | "@esbuild/win32-x64": "0.25.9" 1610 | } 1611 | }, 1612 | "node_modules/escape-html": { 1613 | "version": "1.0.3", 1614 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1615 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 1616 | "license": "MIT" 1617 | }, 1618 | "node_modules/estree-walker": { 1619 | "version": "2.0.2", 1620 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1621 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1622 | "license": "MIT" 1623 | }, 1624 | "node_modules/fdir": { 1625 | "version": "6.5.0", 1626 | "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", 1627 | "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", 1628 | "dev": true, 1629 | "license": "MIT", 1630 | "engines": { 1631 | "node": ">=12.0.0" 1632 | }, 1633 | "peerDependencies": { 1634 | "picomatch": "^3 || ^4" 1635 | }, 1636 | "peerDependenciesMeta": { 1637 | "picomatch": { 1638 | "optional": true 1639 | } 1640 | } 1641 | }, 1642 | "node_modules/fflate": { 1643 | "version": "0.8.2", 1644 | "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", 1645 | "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", 1646 | "license": "MIT" 1647 | }, 1648 | "node_modules/file-type": { 1649 | "version": "21.0.0", 1650 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.0.0.tgz", 1651 | "integrity": "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==", 1652 | "license": "MIT", 1653 | "dependencies": { 1654 | "@tokenizer/inflate": "^0.2.7", 1655 | "strtok3": "^10.2.2", 1656 | "token-types": "^6.0.0", 1657 | "uint8array-extras": "^1.4.0" 1658 | }, 1659 | "engines": { 1660 | "node": ">=20" 1661 | }, 1662 | "funding": { 1663 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 1664 | } 1665 | }, 1666 | "node_modules/fsevents": { 1667 | "version": "2.3.3", 1668 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1669 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1670 | "dev": true, 1671 | "hasInstallScript": true, 1672 | "license": "MIT", 1673 | "optional": true, 1674 | "os": [ 1675 | "darwin" 1676 | ], 1677 | "engines": { 1678 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1679 | } 1680 | }, 1681 | "node_modules/he": { 1682 | "version": "1.2.0", 1683 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 1684 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 1685 | "dev": true, 1686 | "license": "MIT", 1687 | "bin": { 1688 | "he": "bin/he" 1689 | } 1690 | }, 1691 | "node_modules/htmlparser2": { 1692 | "version": "10.0.0", 1693 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", 1694 | "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", 1695 | "dev": true, 1696 | "funding": [ 1697 | "https://github.com/fb55/htmlparser2?sponsor=1", 1698 | { 1699 | "type": "github", 1700 | "url": "https://github.com/sponsors/fb55" 1701 | } 1702 | ], 1703 | "license": "MIT", 1704 | "dependencies": { 1705 | "domelementtype": "^2.3.0", 1706 | "domhandler": "^5.0.3", 1707 | "domutils": "^3.2.1", 1708 | "entities": "^6.0.0" 1709 | } 1710 | }, 1711 | "node_modules/ieee754": { 1712 | "version": "1.2.1", 1713 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1714 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1715 | "funding": [ 1716 | { 1717 | "type": "github", 1718 | "url": "https://github.com/sponsors/feross" 1719 | }, 1720 | { 1721 | "type": "patreon", 1722 | "url": "https://www.patreon.com/feross" 1723 | }, 1724 | { 1725 | "type": "consulting", 1726 | "url": "https://feross.org/support" 1727 | } 1728 | ], 1729 | "license": "BSD-3-Clause" 1730 | }, 1731 | "node_modules/import-meta-resolve": { 1732 | "version": "4.2.0", 1733 | "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", 1734 | "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", 1735 | "dev": true, 1736 | "license": "MIT", 1737 | "funding": { 1738 | "type": "github", 1739 | "url": "https://github.com/sponsors/wooorm" 1740 | } 1741 | }, 1742 | "node_modules/is-docker": { 1743 | "version": "3.0.0", 1744 | "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", 1745 | "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", 1746 | "dev": true, 1747 | "license": "MIT", 1748 | "bin": { 1749 | "is-docker": "cli.js" 1750 | }, 1751 | "engines": { 1752 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1753 | }, 1754 | "funding": { 1755 | "url": "https://github.com/sponsors/sindresorhus" 1756 | } 1757 | }, 1758 | "node_modules/is-inside-container": { 1759 | "version": "1.0.0", 1760 | "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", 1761 | "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", 1762 | "dev": true, 1763 | "license": "MIT", 1764 | "dependencies": { 1765 | "is-docker": "^3.0.0" 1766 | }, 1767 | "bin": { 1768 | "is-inside-container": "cli.js" 1769 | }, 1770 | "engines": { 1771 | "node": ">=14.16" 1772 | }, 1773 | "funding": { 1774 | "url": "https://github.com/sponsors/sindresorhus" 1775 | } 1776 | }, 1777 | "node_modules/is-wsl": { 1778 | "version": "3.1.0", 1779 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", 1780 | "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", 1781 | "dev": true, 1782 | "license": "MIT", 1783 | "dependencies": { 1784 | "is-inside-container": "^1.0.0" 1785 | }, 1786 | "engines": { 1787 | "node": ">=16" 1788 | }, 1789 | "funding": { 1790 | "url": "https://github.com/sponsors/sindresorhus" 1791 | } 1792 | }, 1793 | "node_modules/isexe": { 1794 | "version": "2.0.0", 1795 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1796 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1797 | "dev": true, 1798 | "license": "ISC" 1799 | }, 1800 | "node_modules/lodash": { 1801 | "version": "4.17.21", 1802 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1803 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1804 | "license": "MIT" 1805 | }, 1806 | "node_modules/lodash-es": { 1807 | "version": "4.17.21", 1808 | "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", 1809 | "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", 1810 | "license": "MIT" 1811 | }, 1812 | "node_modules/lodash-unified": { 1813 | "version": "1.0.3", 1814 | "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", 1815 | "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", 1816 | "license": "MIT", 1817 | "peerDependencies": { 1818 | "@types/lodash-es": "*", 1819 | "lodash": "*", 1820 | "lodash-es": "*" 1821 | } 1822 | }, 1823 | "node_modules/magic-string": { 1824 | "version": "0.30.18", 1825 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", 1826 | "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", 1827 | "license": "MIT", 1828 | "dependencies": { 1829 | "@jridgewell/sourcemap-codec": "^1.5.5" 1830 | } 1831 | }, 1832 | "node_modules/make-dir": { 1833 | "version": "3.1.0", 1834 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", 1835 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", 1836 | "dev": true, 1837 | "license": "MIT", 1838 | "dependencies": { 1839 | "semver": "^6.0.0" 1840 | }, 1841 | "engines": { 1842 | "node": ">=8" 1843 | }, 1844 | "funding": { 1845 | "url": "https://github.com/sponsors/sindresorhus" 1846 | } 1847 | }, 1848 | "node_modules/memoize-one": { 1849 | "version": "6.0.0", 1850 | "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", 1851 | "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", 1852 | "license": "MIT" 1853 | }, 1854 | "node_modules/mime": { 1855 | "version": "2.5.2", 1856 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", 1857 | "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", 1858 | "dev": true, 1859 | "license": "MIT", 1860 | "bin": { 1861 | "mime": "cli.js" 1862 | }, 1863 | "engines": { 1864 | "node": ">=4.0.0" 1865 | } 1866 | }, 1867 | "node_modules/minimatch": { 1868 | "version": "3.0.8", 1869 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", 1870 | "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", 1871 | "dev": true, 1872 | "license": "ISC", 1873 | "dependencies": { 1874 | "brace-expansion": "^1.1.7" 1875 | }, 1876 | "engines": { 1877 | "node": "*" 1878 | } 1879 | }, 1880 | "node_modules/mrmime": { 1881 | "version": "2.0.1", 1882 | "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", 1883 | "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", 1884 | "dev": true, 1885 | "license": "MIT", 1886 | "engines": { 1887 | "node": ">=10" 1888 | } 1889 | }, 1890 | "node_modules/ms": { 1891 | "version": "2.1.3", 1892 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1893 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1894 | "license": "MIT" 1895 | }, 1896 | "node_modules/muggle-string": { 1897 | "version": "0.4.1", 1898 | "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", 1899 | "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", 1900 | "dev": true, 1901 | "license": "MIT" 1902 | }, 1903 | "node_modules/nanoid": { 1904 | "version": "3.3.11", 1905 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", 1906 | "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", 1907 | "funding": [ 1908 | { 1909 | "type": "github", 1910 | "url": "https://github.com/sponsors/ai" 1911 | } 1912 | ], 1913 | "license": "MIT", 1914 | "bin": { 1915 | "nanoid": "bin/nanoid.cjs" 1916 | }, 1917 | "engines": { 1918 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1919 | } 1920 | }, 1921 | "node_modules/normalize-wheel-es": { 1922 | "version": "1.2.0", 1923 | "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", 1924 | "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", 1925 | "license": "BSD-3-Clause" 1926 | }, 1927 | "node_modules/open": { 1928 | "version": "10.2.0", 1929 | "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", 1930 | "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", 1931 | "dev": true, 1932 | "license": "MIT", 1933 | "dependencies": { 1934 | "default-browser": "^5.2.1", 1935 | "define-lazy-prop": "^3.0.0", 1936 | "is-inside-container": "^1.0.0", 1937 | "wsl-utils": "^0.1.0" 1938 | }, 1939 | "engines": { 1940 | "node": ">=18" 1941 | }, 1942 | "funding": { 1943 | "url": "https://github.com/sponsors/sindresorhus" 1944 | } 1945 | }, 1946 | "node_modules/path-browserify": { 1947 | "version": "1.0.1", 1948 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 1949 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 1950 | "dev": true, 1951 | "license": "MIT" 1952 | }, 1953 | "node_modules/path-key": { 1954 | "version": "3.1.1", 1955 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1956 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1957 | "dev": true, 1958 | "license": "MIT", 1959 | "engines": { 1960 | "node": ">=8" 1961 | } 1962 | }, 1963 | "node_modules/pathe": { 1964 | "version": "2.0.3", 1965 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", 1966 | "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", 1967 | "dev": true, 1968 | "license": "MIT" 1969 | }, 1970 | "node_modules/picocolors": { 1971 | "version": "1.1.1", 1972 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 1973 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 1974 | "license": "ISC" 1975 | }, 1976 | "node_modules/picomatch": { 1977 | "version": "4.0.3", 1978 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", 1979 | "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", 1980 | "dev": true, 1981 | "license": "MIT", 1982 | "engines": { 1983 | "node": ">=12" 1984 | }, 1985 | "funding": { 1986 | "url": "https://github.com/sponsors/jonschlinkert" 1987 | } 1988 | }, 1989 | "node_modules/postcss": { 1990 | "version": "8.5.6", 1991 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 1992 | "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 1993 | "funding": [ 1994 | { 1995 | "type": "opencollective", 1996 | "url": "https://opencollective.com/postcss/" 1997 | }, 1998 | { 1999 | "type": "tidelift", 2000 | "url": "https://tidelift.com/funding/github/npm/postcss" 2001 | }, 2002 | { 2003 | "type": "github", 2004 | "url": "https://github.com/sponsors/ai" 2005 | } 2006 | ], 2007 | "license": "MIT", 2008 | "dependencies": { 2009 | "nanoid": "^3.3.11", 2010 | "picocolors": "^1.1.1", 2011 | "source-map-js": "^1.2.1" 2012 | }, 2013 | "engines": { 2014 | "node": "^10 || ^12 || >=14" 2015 | } 2016 | }, 2017 | "node_modules/postcss-url": { 2018 | "version": "10.1.3", 2019 | "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", 2020 | "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", 2021 | "dev": true, 2022 | "license": "MIT", 2023 | "dependencies": { 2024 | "make-dir": "~3.1.0", 2025 | "mime": "~2.5.2", 2026 | "minimatch": "~3.0.4", 2027 | "xxhashjs": "~0.2.2" 2028 | }, 2029 | "engines": { 2030 | "node": ">=10" 2031 | }, 2032 | "peerDependencies": { 2033 | "postcss": "^8.0.0" 2034 | } 2035 | }, 2036 | "node_modules/rollup": { 2037 | "version": "4.50.1", 2038 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", 2039 | "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", 2040 | "dev": true, 2041 | "license": "MIT", 2042 | "dependencies": { 2043 | "@types/estree": "1.0.8" 2044 | }, 2045 | "bin": { 2046 | "rollup": "dist/bin/rollup" 2047 | }, 2048 | "engines": { 2049 | "node": ">=18.0.0", 2050 | "npm": ">=8.0.0" 2051 | }, 2052 | "optionalDependencies": { 2053 | "@rollup/rollup-android-arm-eabi": "4.50.1", 2054 | "@rollup/rollup-android-arm64": "4.50.1", 2055 | "@rollup/rollup-darwin-arm64": "4.50.1", 2056 | "@rollup/rollup-darwin-x64": "4.50.1", 2057 | "@rollup/rollup-freebsd-arm64": "4.50.1", 2058 | "@rollup/rollup-freebsd-x64": "4.50.1", 2059 | "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", 2060 | "@rollup/rollup-linux-arm-musleabihf": "4.50.1", 2061 | "@rollup/rollup-linux-arm64-gnu": "4.50.1", 2062 | "@rollup/rollup-linux-arm64-musl": "4.50.1", 2063 | "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", 2064 | "@rollup/rollup-linux-ppc64-gnu": "4.50.1", 2065 | "@rollup/rollup-linux-riscv64-gnu": "4.50.1", 2066 | "@rollup/rollup-linux-riscv64-musl": "4.50.1", 2067 | "@rollup/rollup-linux-s390x-gnu": "4.50.1", 2068 | "@rollup/rollup-linux-x64-gnu": "4.50.1", 2069 | "@rollup/rollup-linux-x64-musl": "4.50.1", 2070 | "@rollup/rollup-openharmony-arm64": "4.50.1", 2071 | "@rollup/rollup-win32-arm64-msvc": "4.50.1", 2072 | "@rollup/rollup-win32-ia32-msvc": "4.50.1", 2073 | "@rollup/rollup-win32-x64-msvc": "4.50.1", 2074 | "fsevents": "~2.3.2" 2075 | } 2076 | }, 2077 | "node_modules/run-applescript": { 2078 | "version": "7.0.0", 2079 | "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", 2080 | "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", 2081 | "dev": true, 2082 | "license": "MIT", 2083 | "engines": { 2084 | "node": ">=18" 2085 | }, 2086 | "funding": { 2087 | "url": "https://github.com/sponsors/sindresorhus" 2088 | } 2089 | }, 2090 | "node_modules/semver": { 2091 | "version": "6.3.1", 2092 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2093 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2094 | "dev": true, 2095 | "license": "ISC", 2096 | "bin": { 2097 | "semver": "bin/semver.js" 2098 | } 2099 | }, 2100 | "node_modules/shebang-command": { 2101 | "version": "2.0.0", 2102 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2103 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2104 | "dev": true, 2105 | "license": "MIT", 2106 | "dependencies": { 2107 | "shebang-regex": "^3.0.0" 2108 | }, 2109 | "engines": { 2110 | "node": ">=8" 2111 | } 2112 | }, 2113 | "node_modules/shebang-regex": { 2114 | "version": "3.0.0", 2115 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2116 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2117 | "dev": true, 2118 | "license": "MIT", 2119 | "engines": { 2120 | "node": ">=8" 2121 | } 2122 | }, 2123 | "node_modules/source-map-js": { 2124 | "version": "1.2.1", 2125 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2126 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2127 | "license": "BSD-3-Clause", 2128 | "engines": { 2129 | "node": ">=0.10.0" 2130 | } 2131 | }, 2132 | "node_modules/strtok3": { 2133 | "version": "10.3.4", 2134 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", 2135 | "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", 2136 | "license": "MIT", 2137 | "dependencies": { 2138 | "@tokenizer/token": "^0.3.0" 2139 | }, 2140 | "engines": { 2141 | "node": ">=18" 2142 | }, 2143 | "funding": { 2144 | "type": "github", 2145 | "url": "https://github.com/sponsors/Borewit" 2146 | } 2147 | }, 2148 | "node_modules/systemjs": { 2149 | "version": "6.15.1", 2150 | "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.15.1.tgz", 2151 | "integrity": "sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==", 2152 | "dev": true, 2153 | "license": "MIT" 2154 | }, 2155 | "node_modules/tinyglobby": { 2156 | "version": "0.2.15", 2157 | "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", 2158 | "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", 2159 | "dev": true, 2160 | "license": "MIT", 2161 | "dependencies": { 2162 | "fdir": "^6.5.0", 2163 | "picomatch": "^4.0.3" 2164 | }, 2165 | "engines": { 2166 | "node": ">=12.0.0" 2167 | }, 2168 | "funding": { 2169 | "url": "https://github.com/sponsors/SuperchupuDev" 2170 | } 2171 | }, 2172 | "node_modules/token-types": { 2173 | "version": "6.1.1", 2174 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.1.tgz", 2175 | "integrity": "sha512-kh9LVIWH5CnL63Ipf0jhlBIy0UsrMj/NJDfpsy1SqOXlLKEVyXXYrnFxFT1yOOYVGBSApeVnjPw/sBz5BfEjAQ==", 2176 | "license": "MIT", 2177 | "dependencies": { 2178 | "@borewit/text-codec": "^0.1.0", 2179 | "@tokenizer/token": "^0.3.0", 2180 | "ieee754": "^1.2.1" 2181 | }, 2182 | "engines": { 2183 | "node": ">=14.16" 2184 | }, 2185 | "funding": { 2186 | "type": "github", 2187 | "url": "https://github.com/sponsors/Borewit" 2188 | } 2189 | }, 2190 | "node_modules/typescript": { 2191 | "version": "5.9.2", 2192 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", 2193 | "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", 2194 | "devOptional": true, 2195 | "license": "Apache-2.0", 2196 | "bin": { 2197 | "tsc": "bin/tsc", 2198 | "tsserver": "bin/tsserver" 2199 | }, 2200 | "engines": { 2201 | "node": ">=14.17" 2202 | } 2203 | }, 2204 | "node_modules/uint8array-extras": { 2205 | "version": "1.5.0", 2206 | "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", 2207 | "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", 2208 | "license": "MIT", 2209 | "engines": { 2210 | "node": ">=18" 2211 | }, 2212 | "funding": { 2213 | "url": "https://github.com/sponsors/sindresorhus" 2214 | } 2215 | }, 2216 | "node_modules/unplugin": { 2217 | "version": "2.3.10", 2218 | "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", 2219 | "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", 2220 | "dev": true, 2221 | "license": "MIT", 2222 | "dependencies": { 2223 | "@jridgewell/remapping": "^2.3.5", 2224 | "acorn": "^8.15.0", 2225 | "picomatch": "^4.0.3", 2226 | "webpack-virtual-modules": "^0.6.2" 2227 | }, 2228 | "engines": { 2229 | "node": ">=18.12.0" 2230 | } 2231 | }, 2232 | "node_modules/unplugin-element-plus": { 2233 | "version": "0.10.0", 2234 | "resolved": "https://registry.npmjs.org/unplugin-element-plus/-/unplugin-element-plus-0.10.0.tgz", 2235 | "integrity": "sha512-oRSW0x6U58xBOWKy8TcoVZNA8ElIpfp3TUJRLQI6ey/E9PpjHl9/deeTAZNt8D57Li4OA4pCJtM6p2cb4Ff4ZA==", 2236 | "dev": true, 2237 | "license": "MIT", 2238 | "dependencies": { 2239 | "es-module-lexer": "^1.6.0", 2240 | "magic-string": "^0.30.17", 2241 | "unplugin": "^2.3.2", 2242 | "unplugin-utils": "^0.2.4" 2243 | }, 2244 | "engines": { 2245 | "node": ">=18.12.0" 2246 | } 2247 | }, 2248 | "node_modules/unplugin-utils": { 2249 | "version": "0.2.5", 2250 | "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", 2251 | "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", 2252 | "dev": true, 2253 | "license": "MIT", 2254 | "dependencies": { 2255 | "pathe": "^2.0.3", 2256 | "picomatch": "^4.0.3" 2257 | }, 2258 | "engines": { 2259 | "node": ">=18.12.0" 2260 | }, 2261 | "funding": { 2262 | "url": "https://github.com/sponsors/sxzz" 2263 | } 2264 | }, 2265 | "node_modules/vite": { 2266 | "version": "7.1.4", 2267 | "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", 2268 | "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", 2269 | "dev": true, 2270 | "license": "MIT", 2271 | "dependencies": { 2272 | "esbuild": "^0.25.0", 2273 | "fdir": "^6.5.0", 2274 | "picomatch": "^4.0.3", 2275 | "postcss": "^8.5.6", 2276 | "rollup": "^4.43.0", 2277 | "tinyglobby": "^0.2.14" 2278 | }, 2279 | "bin": { 2280 | "vite": "bin/vite.js" 2281 | }, 2282 | "engines": { 2283 | "node": "^20.19.0 || >=22.12.0" 2284 | }, 2285 | "funding": { 2286 | "url": "https://github.com/vitejs/vite?sponsor=1" 2287 | }, 2288 | "optionalDependencies": { 2289 | "fsevents": "~2.3.3" 2290 | }, 2291 | "peerDependencies": { 2292 | "@types/node": "^20.19.0 || >=22.12.0", 2293 | "jiti": ">=1.21.0", 2294 | "less": "^4.0.0", 2295 | "lightningcss": "^1.21.0", 2296 | "sass": "^1.70.0", 2297 | "sass-embedded": "^1.70.0", 2298 | "stylus": ">=0.54.8", 2299 | "sugarss": "^5.0.0", 2300 | "terser": "^5.16.0", 2301 | "tsx": "^4.8.1", 2302 | "yaml": "^2.4.2" 2303 | }, 2304 | "peerDependenciesMeta": { 2305 | "@types/node": { 2306 | "optional": true 2307 | }, 2308 | "jiti": { 2309 | "optional": true 2310 | }, 2311 | "less": { 2312 | "optional": true 2313 | }, 2314 | "lightningcss": { 2315 | "optional": true 2316 | }, 2317 | "sass": { 2318 | "optional": true 2319 | }, 2320 | "sass-embedded": { 2321 | "optional": true 2322 | }, 2323 | "stylus": { 2324 | "optional": true 2325 | }, 2326 | "sugarss": { 2327 | "optional": true 2328 | }, 2329 | "terser": { 2330 | "optional": true 2331 | }, 2332 | "tsx": { 2333 | "optional": true 2334 | }, 2335 | "yaml": { 2336 | "optional": true 2337 | } 2338 | } 2339 | }, 2340 | "node_modules/vite-plugin-monkey": { 2341 | "version": "7.1.4", 2342 | "resolved": "https://registry.npmjs.org/vite-plugin-monkey/-/vite-plugin-monkey-7.1.4.tgz", 2343 | "integrity": "sha512-nA/uWbLT3b0uyCFBV7bsIUn+OZCpPzymDX1Nx9btKrG7in06m0txbT2SipCZPZJZyyQHPFNLrCSrWsQIFDHDlg==", 2344 | "dev": true, 2345 | "license": "MIT", 2346 | "dependencies": { 2347 | "acorn": "^8.15.0", 2348 | "acorn-walk": "^8.3.4", 2349 | "cross-spawn": "^7.0.6", 2350 | "htmlparser2": "^10.0.0", 2351 | "import-meta-resolve": "^4.1.0", 2352 | "magic-string": "^0.30.17", 2353 | "mrmime": "^2.0.1", 2354 | "open": "^10.2.0", 2355 | "picocolors": "^1.1.1", 2356 | "postcss-url": "^10.1.3", 2357 | "systemjs": "^6.15.1" 2358 | }, 2359 | "peerDependencies": { 2360 | "vite": "^6.0.0 || ^7.0.0" 2361 | }, 2362 | "peerDependenciesMeta": { 2363 | "vite": { 2364 | "optional": true 2365 | } 2366 | } 2367 | }, 2368 | "node_modules/vscode-uri": { 2369 | "version": "3.1.0", 2370 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", 2371 | "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", 2372 | "dev": true, 2373 | "license": "MIT" 2374 | }, 2375 | "node_modules/vue": { 2376 | "version": "3.5.21", 2377 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.21.tgz", 2378 | "integrity": "sha512-xxf9rum9KtOdwdRkiApWL+9hZEMWE90FHh8yS1+KJAiWYh+iGWV1FquPjoO9VUHQ+VIhsCXNNyZ5Sf4++RVZBA==", 2379 | "license": "MIT", 2380 | "dependencies": { 2381 | "@vue/compiler-dom": "3.5.21", 2382 | "@vue/compiler-sfc": "3.5.21", 2383 | "@vue/runtime-dom": "3.5.21", 2384 | "@vue/server-renderer": "3.5.21", 2385 | "@vue/shared": "3.5.21" 2386 | }, 2387 | "peerDependencies": { 2388 | "typescript": "*" 2389 | }, 2390 | "peerDependenciesMeta": { 2391 | "typescript": { 2392 | "optional": true 2393 | } 2394 | } 2395 | }, 2396 | "node_modules/vue-tsc": { 2397 | "version": "3.0.6", 2398 | "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.0.6.tgz", 2399 | "integrity": "sha512-Tbs8Whd43R2e2nxez4WXPvvdjGbW24rOSgRhLOHXzWiT4pcP4G7KeWh0YCn18rF4bVwv7tggLLZ6MJnO6jXPBg==", 2400 | "dev": true, 2401 | "license": "MIT", 2402 | "dependencies": { 2403 | "@volar/typescript": "2.4.23", 2404 | "@vue/language-core": "3.0.6" 2405 | }, 2406 | "bin": { 2407 | "vue-tsc": "bin/vue-tsc.js" 2408 | }, 2409 | "peerDependencies": { 2410 | "typescript": ">=5.0.0" 2411 | } 2412 | }, 2413 | "node_modules/webpack-virtual-modules": { 2414 | "version": "0.6.2", 2415 | "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", 2416 | "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", 2417 | "dev": true, 2418 | "license": "MIT" 2419 | }, 2420 | "node_modules/which": { 2421 | "version": "2.0.2", 2422 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2423 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2424 | "dev": true, 2425 | "license": "ISC", 2426 | "dependencies": { 2427 | "isexe": "^2.0.0" 2428 | }, 2429 | "bin": { 2430 | "node-which": "bin/node-which" 2431 | }, 2432 | "engines": { 2433 | "node": ">= 8" 2434 | } 2435 | }, 2436 | "node_modules/wsl-utils": { 2437 | "version": "0.1.0", 2438 | "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", 2439 | "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", 2440 | "dev": true, 2441 | "license": "MIT", 2442 | "dependencies": { 2443 | "is-wsl": "^3.1.0" 2444 | }, 2445 | "engines": { 2446 | "node": ">=18" 2447 | }, 2448 | "funding": { 2449 | "url": "https://github.com/sponsors/sindresorhus" 2450 | } 2451 | }, 2452 | "node_modules/xxhashjs": { 2453 | "version": "0.2.2", 2454 | "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", 2455 | "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", 2456 | "dev": true, 2457 | "license": "MIT", 2458 | "dependencies": { 2459 | "cuint": "^0.2.2" 2460 | } 2461 | } 2462 | } 2463 | } 2464 | --------------------------------------------------------------------------------