commit 764addd7f6dae777659d4637587853a612e89819 Author: lonelyhentxi Date: Sun Mar 16 00:22:42 2025 +0800 feat: first step diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4bc8a7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,193 @@ + +# Created by https://www.gitignore.io/api/vim,node,jetbrains+all,visualstudiocode + +### JetBrains+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +### JetBrains+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/ + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +### Vim ### +# Swap +[._]*.s[a-v][a-z] +[._]*.sw[a-p] +[._]s[a-rt-v][a-z] +[._]ss[a-gi-z] +[._]sw[a-p] + +# Session +Session.vim + +# Temporary +.netrwhist +*~ + +# Persistent undo +[._]*.un~ + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + + +# End of https://www.gitignore.io/api/vim,node,jetbrains+all,visualstudiocode + +# babel generated folder now; no need for it to be kept +lib/ +/flow-typed/npm/ +# https://atom.io/packages/atomic-management +.atom/* + + +# Added by cargo + +**/target +/.vitest +**/dist \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fd01114 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +Copyright (c) 2025 Yeheng Zhou (konoebml) + +Copyright (c) 2023 Liam Dyer (ebml-web-stream) + +Copyright (c) 2013-2018 Mark Schmale and contributors (ebml-stream) + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE diff --git a/README.md b/README.md new file mode 100644 index 0000000..fd7a75a --- /dev/null +++ b/README.md @@ -0,0 +1,93 @@ +

+ logo +
+ Konoebml +
status-badge
+

+ +

A modern JavaScript implementation of RFC8794 (EBML).

+ +## Note + +[EBML][EBML] stands for Extensible Binary Meta-Language and is somewhat of a binary version of XML. It's used for container formats like [WebM][webm] or [MKV][mkv]. + +This package is serving as a fork with extensive rewrites and enhancements to [ebml-web-stream][ebml-web-stream] and [ebml-stream][ebml-stream], providing: + +- better [unknown size vint][unknown size vint] support +- bigint support for vint, unsigned and signed int data type +- better error types + +# Install + +Install via NPM: + +```bash +npm install konoebml +``` + +# Usage and Examples + +This example reads a media file into memory and decodes it. + +```js +import fs from 'node:fs/promises'; +import { + ReadableStream, + WritableStream, + type TransformStream, +} from 'node:stream/web'; +import { EbmlStreamDecoder } from 'konoebml'; + +async function main() { + const fileBuffer = await fs.readFile('media/test.webm'); + await new ReadableStream({ + pull(controller) { + controller.enqueue(fileBuffer); + controller.close(); + }, + }) + .pipeThrough(new EbmlStreamDecoder() as unknown as TransformStream) + .pipeTo(new WritableStream({ write: console.log })); +} + +main(); +``` + +**Todo: add more docs and tests** + +# State of this project + +Parsing and writing should both work. If something is broken, please create [an issue][new-issue]. + +Any additional feature requests can also be submitted as [an issue][new-issue]. + +If any well-known tags have special parsing/encoding rules or data structures that aren't implemented, pull requests are welcome! + +# License + +[MIT](./LICENSE) + +# Other Contributors + +(in alphabetical order) + +* [Austin Blake](https://github.com/austinleroy) +* [Chris Price](https://github.com/chrisprice) +* [Davy Van Deursen](https://github.com/dvdeurse) +* [Ed Markowski](https://github.com/siphontv) +* [Jonathan Sifuentes](https://github.com/jayands) +* [Liam Dyer](https://github.com/Saghen) +* [Manuel Wiedenmann](https://github.com/fsmanuel) +* [Mark Schmale](https://github.com/themasch) +* [Mathias Buus](https://github.com/mafintosh) +* [Max Ogden](https://github.com/maxogden) +* [Oliver Jones](https://github.com/OllieJones) +* [Oliver Walzer](https://github.com/owcd) + +[EBML]: http://ebml.sourceforge.net/ +[mkv]: http://www.matroska.org/technical/specs/index.html +[webm]: https://www.webmproject.org/ +[new-issue]: https://github.com/saghen/ebml-web-stream/issues/new +[unknown size vint]: (https://www.rfc-editor.org/rfc/rfc8794.html#name-unknown-data-size) +[ebml-web-stream]: (https://github.com/Saghen/ebml-web-stream) +[ebml-stream]: (https://github.com/austinleroy/node-ebml) \ No newline at end of file diff --git a/assets/konoebml-512x512.png b/assets/konoebml-512x512.png new file mode 100644 index 0000000..8e02ef9 Binary files /dev/null and b/assets/konoebml-512x512.png differ diff --git a/assets/konoebml-512x512.webp b/assets/konoebml-512x512.webp new file mode 100644 index 0000000..10a8fb1 Binary files /dev/null and b/assets/konoebml-512x512.webp differ diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 0000000..a197530 --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,62 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "extends": [ + "ultracite" + ], + "linter": { + "rules": { + "style": { + "noNonNullAssertion": "off", + "noParameterAssign": "off", + "useFilenamingConvention": "off", + "noParameterProperties": "off" + }, + "suspicious": { + "noExplicitAny": "off" + }, + "complexity": { + "noForEach": "off" + }, + "correctness": { + "noUnusedImports": { + "fix": "none", + "level": "warn" + } + }, + "nursery": { + "noEnum": "off", + "useConsistentMemberAccessibility": "off" + } + } + }, + "files": { + "ignore": [ + ".vscode/*.json" + ] + }, + "overrides": [ + { + "include": [ + "tests/**" + ], + "javascript": { + "globals": [ + "describe", + "beforeEach", + "it", + "expect" + ] + }, + "linter": { + "rules": { + "performance": { + "useTopLevelRegex": "off" + }, + "suspicious": { + "noMisplacedAssertion": "off" + } + } + } + } + ] +} \ No newline at end of file diff --git a/examples/playground.ts b/examples/playground.ts new file mode 100644 index 0000000..275cb89 --- /dev/null +++ b/examples/playground.ts @@ -0,0 +1,21 @@ +import fs from 'node:fs/promises'; +import { + ReadableStream, + WritableStream, + type TransformStream, +} from 'node:stream/web'; +import { EbmlStreamDecoder } from 'konoebml'; + +async function main() { + const fileBuffer = await fs.readFile('media/test.webm'); + await new ReadableStream({ + pull(controller) { + controller.enqueue(fileBuffer); + controller.close(); + }, + }) + .pipeThrough(new EbmlStreamDecoder() as unknown as TransformStream) + .pipeTo(new WritableStream({ write: console.log })); +} + +main(); diff --git a/media/audiosample.webm b/media/audiosample.webm new file mode 100644 index 0000000..e49dc5b Binary files /dev/null and b/media/audiosample.webm differ diff --git a/media/test.webm b/media/test.webm new file mode 100644 index 0000000..6c2138d Binary files /dev/null and b/media/test.webm differ diff --git a/media/video-webm-codecs-avc1-42E01E.webm b/media/video-webm-codecs-avc1-42E01E.webm new file mode 100644 index 0000000..d1e58b0 Binary files /dev/null and b/media/video-webm-codecs-avc1-42E01E.webm differ diff --git a/media/video-webm-codecs-vp8.webm b/media/video-webm-codecs-vp8.webm new file mode 100644 index 0000000..ec3576e Binary files /dev/null and b/media/video-webm-codecs-vp8.webm differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..bfa0940 --- /dev/null +++ b/package.json @@ -0,0 +1,84 @@ +{ + "name": "konoebml", + "version": "0.1.0-rc.1", + "description": "A modern JavaScript implementation of EBML RFC8794", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "type": "module", + "maintainers": [ + "Yeheng Zhou " + ], + "files": [ + "dist", + "LICENSE", + "README.md" + ], + "scripts": { + "build": "rslib build", + "dev": "rslib build --watch", + "test": "vitest --coverage", + "test-ci": "vitest --watch=false --coverage", + "prepublishOnly": "npm run build", + "lint": "ultracite lint", + "format": "ultracite format", + "playground": "tsx --tsconfig=./tsconfig.example.json ./examples/playground.ts" + }, + "repository": "github:dumtruck/konoebml", + "engines": { + "node": ">= 18.0.0" + }, + "keywords": [ + "ebml", + "webm", + "mkv", + "matroska", + "format", + "rfc8794" + ], + "devDependencies": { + "@biomejs/biome": "^1.9.4", + "@rslib/core": "^0.5.3", + "@swc/core": "^1.11.8", + "@types/jasmine": "^5.1.7", + "@types/node": "^22.13.10", + "@vitest/coverage-v8": "^3.0.8", + "cross-env": "^7.0.3", + "happy-dom": "^17.4.3", + "rimraf": "^6.0.1", + "ts-node": "^10.9.2", + "typescript": "^5.8.2", + "ultracite": "^4.1.21", + "unplugin-swc": "^1.5.1", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.0.8" + }, + "contributors": [ + "Yeheng Zhou ", + "Liam Dyer ", + "Austin Blake ", + "Chris Price ", + "Davy Van Deursen ", + "Ed Markowski ", + "Jonathan Sifuentes ", + "Manuel Wiedenmann ", + "Mathias Buus ", + "Max Ogden ", + "Oliver Walzer ", + "greenkeeperio-bot " + ], + "license": "MIT", + "bugs": { + "url": "https://github.com/dumtruck/konoebml/issues" + }, + "homepage": "https://github.com/dumtruck/konoebml#readme", + "dependencies": { + "mnemonist": "^0.40.3", + "type-fest": "^4.37.0" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "@swc/core" + ] + } +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..fd2db76 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2338 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + mnemonist: + specifier: ^0.40.3 + version: 0.40.3 + type-fest: + specifier: ^4.37.0 + version: 4.37.0 + devDependencies: + '@biomejs/biome': + specifier: ^1.9.4 + version: 1.9.4 + '@rslib/core': + specifier: ^0.5.3 + version: 0.5.3(typescript@5.8.2) + '@swc/core': + specifier: ^1.11.8 + version: 1.11.8(@swc/helpers@0.5.15) + '@types/jasmine': + specifier: ^5.1.7 + version: 5.1.7 + '@types/node': + specifier: ^22.13.10 + version: 22.13.10 + '@vitest/coverage-v8': + specifier: ^3.0.8 + version: 3.0.8(vitest@3.0.8(@types/node@22.13.10)(happy-dom@17.4.3)(jiti@2.4.2)) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + happy-dom: + specifier: ^17.4.3 + version: 17.4.3 + rimraf: + specifier: ^6.0.1 + version: 6.0.1 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@22.13.10)(typescript@5.8.2) + typescript: + specifier: ^5.8.2 + version: 5.8.2 + ultracite: + specifier: ^4.1.21 + version: 4.1.21 + unplugin-swc: + specifier: ^1.5.1 + version: 1.5.1(@swc/core@1.11.8(@swc/helpers@0.5.15))(rollup@4.35.0) + vite-tsconfig-paths: + specifier: ^5.1.4 + version: 5.1.4(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)) + vitest: + specifier: ^3.0.8 + version: 3.0.8(@types/node@22.13.10)(happy-dom@17.4.3)(jiti@2.4.2) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@ast-grep/napi-darwin-arm64@0.35.0': + resolution: {integrity: sha512-T+MN4Oinc+sXjXCIHzfxDDWY7r2pKgPxM6zVeVlkMTrJV2mJtyKYBIS+CABhRM6kflps2T2I6l4DGaKV/8Ym9w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@ast-grep/napi-darwin-x64@0.35.0': + resolution: {integrity: sha512-pEYiN6JI1HY2uWhMYJ9+3yIMyVYKuYdFzeD+dL7odA3qzK0o9N9AM3/NOt4ynU2EhufaWCJr0P5NoQ636qN6MQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@ast-grep/napi-linux-arm64-gnu@0.35.0': + resolution: {integrity: sha512-NBuzQngABGKz7lhG08IQb+7nPqUx81Ol37xmS3ZhVSdSgM0mtp93rCbgFTkJcAFE8IMfCHQSg7G4g0Iotz4ABQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@ast-grep/napi-linux-arm64-musl@0.35.0': + resolution: {integrity: sha512-1EcvHPwyWpCL/96LuItBYGfeI5FaMTRvL+dHbO/hL5q1npqbb5qn+ppJwtNOjTPz8tayvgggxVk9T4C2O7taYA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@ast-grep/napi-linux-x64-gnu@0.35.0': + resolution: {integrity: sha512-FDzNdlqmQnsiWXhnLxusw5AOfEcEM+5xtmrnAf3SBRFr86JyWD9qsynnFYC2pnP9hlMfifNH2TTmMpyGJW49Xw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@ast-grep/napi-linux-x64-musl@0.35.0': + resolution: {integrity: sha512-wlmndjfBafT8u5p4DBnoRQyoCSGNuVSz7rT3TqhvlHcPzUouRWMn95epU9B1LNLyjXvr9xHeRjSktyCN28w57Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@ast-grep/napi-win32-arm64-msvc@0.35.0': + resolution: {integrity: sha512-gkhJeYc4rrZLX2icLxalPikTLMR57DuIYLwLr9g+StHYXIsGHrbfrE6Nnbdd8Izfs34ArFCrcwdaMrGlvOPSeg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@ast-grep/napi-win32-ia32-msvc@0.35.0': + resolution: {integrity: sha512-OdUuRa3chHCZ65y+qALfkUjz0W0Eg21YZ9TyPquV5why07M6HAK38mmYGzLxFH6294SvRQhs+FA/rAfbKeH0jA==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@ast-grep/napi-win32-x64-msvc@0.35.0': + resolution: {integrity: sha512-pcQRUHqbroTN1oQ56V982a7IZTUUySQYWa2KEyksiifHGuBuitlzcyzFGjT96ThcqD9XW0UVJMvpoF2Qjh006Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@ast-grep/napi@0.35.0': + resolution: {integrity: sha512-3ucaaSxV6fxXoqHrE/rxAvP1THnDdY5jNzGlnvx+JvnY9C/dSRKc0jlRMRz59N3El572+/yNRUUpAV1T9aBJug==} + engines: {node: '>= 10'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.9': + resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.26.9': + resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@1.0.2': + resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} + engines: {node: '>=18'} + + '@biomejs/biome@1.9.4': + resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.9.4': + resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.9.4': + resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.9.4': + resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.9.4': + resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.9.4': + resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.9.4': + resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.9.4': + resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.9.4': + resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@esbuild/aix-ppc64@0.25.1': + resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.1': + resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.1': + resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.1': + resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.1': + resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.1': + resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.1': + resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.1': + resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.1': + resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.1': + resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.1': + resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.1': + resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.1': + resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.1': + resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.1': + resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.1': + resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.1': + resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.1': + resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.1': + resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.1': + resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.1': + resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.1': + resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.1': + resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.1': + resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.1': + resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@module-federation/error-codes@0.8.4': + resolution: {integrity: sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==} + + '@module-federation/runtime-tools@0.8.4': + resolution: {integrity: sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==} + + '@module-federation/runtime@0.8.4': + resolution: {integrity: sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==} + + '@module-federation/sdk@0.8.4': + resolution: {integrity: sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==} + + '@module-federation/webpack-bundler-runtime@0.8.4': + resolution: {integrity: sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.35.0': + resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.35.0': + resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.35.0': + resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.35.0': + resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.35.0': + resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.35.0': + resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.35.0': + resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.35.0': + resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.35.0': + resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.35.0': + resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.35.0': + resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': + resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.35.0': + resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.35.0': + resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.35.0': + resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.35.0': + resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.35.0': + resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.35.0': + resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.35.0': + resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==} + cpu: [x64] + os: [win32] + + '@rsbuild/core@1.2.16': + resolution: {integrity: sha512-LxiZUTKhg3ZHFIeZkDmrOG8pWn/lny4vx0AqtSxovWPDnFHgYeuL45rAGDfkrx4TuGwwDN3qJgbetPRSYA8cWw==} + engines: {node: '>=16.7.0'} + hasBin: true + + '@rslib/core@0.5.3': + resolution: {integrity: sha512-HlFGd4PZ4kJDrGZ4VBPIglGPjsTI+LuVWTaFg/hrmElnmXpw3iq0Oln5Esv24L3VBofyvZGPMlu1fZTiqTPzcw==} + engines: {node: '>=16.7.0'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7 + typescript: ^5 + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + typescript: + optional: true + + '@rspack/binding-darwin-arm64@1.2.7': + resolution: {integrity: sha512-dT5eSMTknZaI8Djmz8KnaWM68rjZuBZwsKyF144o+ZSJM55vgiNXyL0lQYB8mX9nR3Gck+jKuGUAT2W/EF/t5Q==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.2.7': + resolution: {integrity: sha512-5n8IhKBxH71d4BUIvyzTwSOAOKNneLPJwLIphSPNIbCMGjLI59/EVpxSQ/AAUfyMkqOs635NNCn0eGQVuzpI/w==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.2.7': + resolution: {integrity: sha512-DTtFBJmgQQrVWjbklpgJDr3kE9Uf1fHsPh+1GVslsBuyn+o4O7JslrnjuVsQCYKoiEg0Lg4ZPQmwnhJLHssZ5A==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.2.7': + resolution: {integrity: sha512-01/OoQQF9eyDvRKkxj4DzCznfGZIvnzI8qOsrv+M7VBm8FLoKpb3hygXixaGQOXmNL42XTh61qjgm++fBu6aUA==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.2.7': + resolution: {integrity: sha512-lUOAUq0YSsofCXsP6XnlgfH0ZRDZ2X2XqXLXYjqf4xkSxCl5eBmE0EQYjAHF4zjUvU5rVx4a4bDLWv7+t3bOHg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.2.7': + resolution: {integrity: sha512-ZrPXfgT30p4DlydYavaTHiluxHkWvZHt7K4q7qNyTfYYowG6jRGwWi/PATdugNICGv027Wsh5nzEO4o27Iuhwg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-win32-arm64-msvc@1.2.7': + resolution: {integrity: sha512-1OzzM+OUSWX39XYcDfxJ8bGX5vNNrRejCMGotBEdP+uQ3KMWCPz0G4KRc3QIjghaLIYk3ofd83hcfUxyk/2Xog==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.2.7': + resolution: {integrity: sha512-VWlDCV9kDtijk9GK6ZtBQmYoVzKGpnrJB0iI3d2gIEa/2NwikJ89bLMFE4dFx8UNH3p/sSyb5pmPOQnbudFK7Q==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.2.7': + resolution: {integrity: sha512-l/sTdeMsQF1a1aB79cWykDNRZG6nkUA0biJo2/sEARP3ijdr8TuwUdirp2JRDmZfQJkoJnQ2un9y9qyW+TIZzA==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.2.7': + resolution: {integrity: sha512-QH+kxkG0I9C6lmlwgBUDFsy24ihXMGG5lfiNtQilk4CyBN+AgSWFENcYrnkUaBioZAvMBznQLiccV3X0JeH9iQ==} + + '@rspack/core@1.2.7': + resolution: {integrity: sha512-Vg7ySflnqI1nNOBPd6VJkQozWADssxn3einbxa9OqDVAB+dGSj8qihTs6rlaTSewidoaYTGIAiTMHO2y+61qqQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@rspack/tracing': ^1.x + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@rspack/tracing': + optional: true + '@swc/helpers': + optional: true + + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} + engines: {node: '>=16.0.0'} + + '@swc/core-darwin-arm64@1.11.8': + resolution: {integrity: sha512-rrSsunyJWpHN+5V1zumndwSSifmIeFQBK9i2RMQQp15PgbgUNxHK5qoET1n20pcUrmZeT6jmJaEWlQchkV//Og==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.11.8': + resolution: {integrity: sha512-44goLqQuuo0HgWnG8qC+ZFw/qnjCVVeqffhzFr9WAXXotogVaxM8ze6egE58VWrfEc8me8yCcxOYL9RbtjhS/Q==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.11.8': + resolution: {integrity: sha512-Mzo8umKlhTWwF1v8SLuTM1z2A+P43UVhf4R8RZDhzIRBuB2NkeyE+c0gexIOJBuGSIATryuAF4O4luDu727D1w==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.11.8': + resolution: {integrity: sha512-EyhO6U+QdoGYC1MeHOR0pyaaSaKYyNuT4FQNZ1eZIbnuueXpuICC7iNmLIOfr3LE5bVWcZ7NKGVPlM2StJEcgA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.11.8': + resolution: {integrity: sha512-QU6wOkZnS6/QuBN1MHD6G2BgFxB0AclvTVGbqYkRA7MsVkcC29PffESqzTXnypzB252/XkhQjoB2JIt9rPYf6A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.11.8': + resolution: {integrity: sha512-r72onUEIU1iJi9EUws3R28pztQ/eM3EshNpsPRBfuLwKy+qn3et55vXOyDhIjGCUph5Eg2Yn8H3h6MTxDdLd+w==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.11.8': + resolution: {integrity: sha512-294k8cLpO103++f4ZUEDr3vnBeUfPitW6G0a3qeVZuoXFhFgaW7ANZIWknUc14WiLOMfMecphJAEiy9C8OeYSw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.11.8': + resolution: {integrity: sha512-EbjOzQ+B85rumHyeesBYxZ+hq3ZQn+YAAT1ZNE9xW1/8SuLoBmHy/K9YniRGVDq/2NRmp5kI5+5h5TX0asIS9A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.11.8': + resolution: {integrity: sha512-Z+FF5kgLHfQWIZ1KPdeInToXLzbY0sMAashjd/igKeP1Lz0qKXVAK+rpn6ASJi85Fn8wTftCGCyQUkRVn0bTDg==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.11.8': + resolution: {integrity: sha512-j6B6N0hChCeAISS6xp/hh6zR5CSCr037BAjCxNLsT8TGe5D+gYZ57heswUWXRH8eMKiRDGiLCYpPB2pkTqxCSw==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.11.8': + resolution: {integrity: sha512-UAL+EULxrc0J73flwYHfu29mO8CONpDJiQv1QPDXsyCvDUcEhqAqUROVTgC+wtJCFFqMQdyr4stAA5/s0KSOmA==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@swc/types@0.1.19': + resolution: {integrity: sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/jasmine@5.1.7': + resolution: {integrity: sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==} + + '@types/node@22.13.10': + resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + + '@vitest/coverage-v8@3.0.8': + resolution: {integrity: sha512-y7SAKsQirsEJ2F8bulBck4DoluhI2EEgTimHd6EEUgJBGKy9tC25cpywh1MH4FvDGoG2Unt7+asVd1kj4qOSAw==} + peerDependencies: + '@vitest/browser': 3.0.8 + vitest: 3.0.8 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@3.0.8': + resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==} + + '@vitest/mocker@3.0.8': + resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@3.0.8': + resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==} + + '@vitest/runner@3.0.8': + resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==} + + '@vitest/snapshot@3.0.8': + resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==} + + '@vitest/spy@3.0.8': + resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==} + + '@vitest/utils@3.0.8': + resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + caniuse-lite@1.0.30001703: + resolution: {integrity: sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==} + + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} + engines: {node: '>=12'} + + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + core-js@3.41.0: + resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} + engines: {node: '>=6'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + esbuild@0.25.1: + resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.2.0: + resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} + engines: {node: '>=12.0.0'} + + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.1: + resolution: {integrity: sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==} + engines: {node: 20 || >=22} + hasBin: true + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + happy-dom@17.4.3: + resolution: {integrity: sha512-8mDGIKxi2hAg0DkEYjBHPi5QykWiqdNNQQWrwLXLfro1eAZk8+lSnzbUrnU25bamG9PjEQGoFrA32ezQNJQdww==} + engines: {node: '>=18.0.0'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-rslog@0.0.6: + resolution: {integrity: sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==} + engines: {node: '>=14.17.6'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.0: + resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + engines: {node: 20 || >=22} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loupe@3.1.3: + resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mnemonist@0.40.3: + resolution: {integrity: sha512-Vjyr90sJ23CKKH/qPAgUKicw/v6pRoamxIEDFOF8uSgFME7DqPRpHgRTejWVjkdGg5dXj0/NyxZHZ9bcjH+2uQ==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.9: + resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + obliterator@2.0.5: + resolution: {integrity: sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + rimraf@6.0.1: + resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} + engines: {node: 20 || >=22} + hasBin: true + + rollup@4.35.0: + resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rsbuild-plugin-dts@0.5.3: + resolution: {integrity: sha512-NLy2oKyStcM89CwSdgQUu10BlNTpZieshGj7p7w/sge9VM7aADp8mUqo86bDKX4ITMMACLTO6Q/VQmp9B/1tMg==} + engines: {node: '>=16.7.0'} + peerDependencies: + '@microsoft/api-extractor': ^7 + '@rsbuild/core': 1.x + typescript: ^5 + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + typescript: + optional: true + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.8.1: + resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + engines: {node: '>=14.0.0'} + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfck@3.1.5: + resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.37.0: + resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==} + engines: {node: '>=16'} + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + ultracite@4.1.21: + resolution: {integrity: sha512-t1AMqC4V4FHKVObPNcQZYdeIStaDaEA3/GEh8k9aEaKn5f+7JJArS2ZkPKmMfv8rdqBQnstq+TMk3I+/hA07sA==} + hasBin: true + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unplugin-swc@1.5.1: + resolution: {integrity: sha512-/ZLrPNjChhGx3Z95pxJ4tQgfI6rWqukgYHKflrNB4zAV1izOQuDhkTn55JWeivpBxDCoK7M/TStb2aS/14PS/g==} + peerDependencies: + '@swc/core': ^1.2.108 + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + vite-node@3.0.8: + resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + + vite-tsconfig-paths@5.1.4: + resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@6.2.1: + resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@3.0.8: + resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 3.0.8 + '@vitest/ui': 3.0.8 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@ast-grep/napi-darwin-arm64@0.35.0': + optional: true + + '@ast-grep/napi-darwin-x64@0.35.0': + optional: true + + '@ast-grep/napi-linux-arm64-gnu@0.35.0': + optional: true + + '@ast-grep/napi-linux-arm64-musl@0.35.0': + optional: true + + '@ast-grep/napi-linux-x64-gnu@0.35.0': + optional: true + + '@ast-grep/napi-linux-x64-musl@0.35.0': + optional: true + + '@ast-grep/napi-win32-arm64-msvc@0.35.0': + optional: true + + '@ast-grep/napi-win32-ia32-msvc@0.35.0': + optional: true + + '@ast-grep/napi-win32-x64-msvc@0.35.0': + optional: true + + '@ast-grep/napi@0.35.0': + optionalDependencies: + '@ast-grep/napi-darwin-arm64': 0.35.0 + '@ast-grep/napi-darwin-x64': 0.35.0 + '@ast-grep/napi-linux-arm64-gnu': 0.35.0 + '@ast-grep/napi-linux-arm64-musl': 0.35.0 + '@ast-grep/napi-linux-x64-gnu': 0.35.0 + '@ast-grep/napi-linux-x64-musl': 0.35.0 + '@ast-grep/napi-win32-arm64-msvc': 0.35.0 + '@ast-grep/napi-win32-ia32-msvc': 0.35.0 + '@ast-grep/napi-win32-x64-msvc': 0.35.0 + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/parser@7.26.9': + dependencies: + '@babel/types': 7.26.9 + + '@babel/types@7.26.9': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@1.0.2': {} + + '@biomejs/biome@1.9.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.9.4 + '@biomejs/cli-darwin-x64': 1.9.4 + '@biomejs/cli-linux-arm64': 1.9.4 + '@biomejs/cli-linux-arm64-musl': 1.9.4 + '@biomejs/cli-linux-x64': 1.9.4 + '@biomejs/cli-linux-x64-musl': 1.9.4 + '@biomejs/cli-win32-arm64': 1.9.4 + '@biomejs/cli-win32-x64': 1.9.4 + + '@biomejs/cli-darwin-arm64@1.9.4': + optional: true + + '@biomejs/cli-darwin-x64@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-arm64@1.9.4': + optional: true + + '@biomejs/cli-linux-x64-musl@1.9.4': + optional: true + + '@biomejs/cli-linux-x64@1.9.4': + optional: true + + '@biomejs/cli-win32-arm64@1.9.4': + optional: true + + '@biomejs/cli-win32-x64@1.9.4': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@esbuild/aix-ppc64@0.25.1': + optional: true + + '@esbuild/android-arm64@0.25.1': + optional: true + + '@esbuild/android-arm@0.25.1': + optional: true + + '@esbuild/android-x64@0.25.1': + optional: true + + '@esbuild/darwin-arm64@0.25.1': + optional: true + + '@esbuild/darwin-x64@0.25.1': + optional: true + + '@esbuild/freebsd-arm64@0.25.1': + optional: true + + '@esbuild/freebsd-x64@0.25.1': + optional: true + + '@esbuild/linux-arm64@0.25.1': + optional: true + + '@esbuild/linux-arm@0.25.1': + optional: true + + '@esbuild/linux-ia32@0.25.1': + optional: true + + '@esbuild/linux-loong64@0.25.1': + optional: true + + '@esbuild/linux-mips64el@0.25.1': + optional: true + + '@esbuild/linux-ppc64@0.25.1': + optional: true + + '@esbuild/linux-riscv64@0.25.1': + optional: true + + '@esbuild/linux-s390x@0.25.1': + optional: true + + '@esbuild/linux-x64@0.25.1': + optional: true + + '@esbuild/netbsd-arm64@0.25.1': + optional: true + + '@esbuild/netbsd-x64@0.25.1': + optional: true + + '@esbuild/openbsd-arm64@0.25.1': + optional: true + + '@esbuild/openbsd-x64@0.25.1': + optional: true + + '@esbuild/sunos-x64@0.25.1': + optional: true + + '@esbuild/win32-arm64@0.25.1': + optional: true + + '@esbuild/win32-ia32@0.25.1': + optional: true + + '@esbuild/win32-x64@0.25.1': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@module-federation/error-codes@0.8.4': {} + + '@module-federation/runtime-tools@0.8.4': + dependencies: + '@module-federation/runtime': 0.8.4 + '@module-federation/webpack-bundler-runtime': 0.8.4 + + '@module-federation/runtime@0.8.4': + dependencies: + '@module-federation/error-codes': 0.8.4 + '@module-federation/sdk': 0.8.4 + + '@module-federation/sdk@0.8.4': + dependencies: + isomorphic-rslog: 0.0.6 + + '@module-federation/webpack-bundler-runtime@0.8.4': + dependencies: + '@module-federation/runtime': 0.8.4 + '@module-federation/sdk': 0.8.4 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/pluginutils@5.1.4(rollup@4.35.0)': + dependencies: + '@types/estree': 1.0.6 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.35.0 + + '@rollup/rollup-android-arm-eabi@4.35.0': + optional: true + + '@rollup/rollup-android-arm64@4.35.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.35.0': + optional: true + + '@rollup/rollup-darwin-x64@4.35.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.35.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.35.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.35.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.35.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.35.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.35.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.35.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.35.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.35.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.35.0': + optional: true + + '@rsbuild/core@1.2.16': + dependencies: + '@rspack/core': 1.2.7(@swc/helpers@0.5.15) + '@rspack/lite-tapable': 1.0.1 + '@swc/helpers': 0.5.15 + core-js: 3.41.0 + jiti: 2.4.2 + transitivePeerDependencies: + - '@rspack/tracing' + + '@rslib/core@0.5.3(typescript@5.8.2)': + dependencies: + '@rsbuild/core': 1.2.16 + rsbuild-plugin-dts: 0.5.3(@rsbuild/core@1.2.16)(typescript@5.8.2) + tinyglobby: 0.2.12 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - '@rspack/tracing' + + '@rspack/binding-darwin-arm64@1.2.7': + optional: true + + '@rspack/binding-darwin-x64@1.2.7': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.2.7': + optional: true + + '@rspack/binding-linux-arm64-musl@1.2.7': + optional: true + + '@rspack/binding-linux-x64-gnu@1.2.7': + optional: true + + '@rspack/binding-linux-x64-musl@1.2.7': + optional: true + + '@rspack/binding-win32-arm64-msvc@1.2.7': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.2.7': + optional: true + + '@rspack/binding-win32-x64-msvc@1.2.7': + optional: true + + '@rspack/binding@1.2.7': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.2.7 + '@rspack/binding-darwin-x64': 1.2.7 + '@rspack/binding-linux-arm64-gnu': 1.2.7 + '@rspack/binding-linux-arm64-musl': 1.2.7 + '@rspack/binding-linux-x64-gnu': 1.2.7 + '@rspack/binding-linux-x64-musl': 1.2.7 + '@rspack/binding-win32-arm64-msvc': 1.2.7 + '@rspack/binding-win32-ia32-msvc': 1.2.7 + '@rspack/binding-win32-x64-msvc': 1.2.7 + + '@rspack/core@1.2.7(@swc/helpers@0.5.15)': + dependencies: + '@module-federation/runtime-tools': 0.8.4 + '@rspack/binding': 1.2.7 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001703 + optionalDependencies: + '@swc/helpers': 0.5.15 + + '@rspack/lite-tapable@1.0.1': {} + + '@swc/core-darwin-arm64@1.11.8': + optional: true + + '@swc/core-darwin-x64@1.11.8': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.11.8': + optional: true + + '@swc/core-linux-arm64-gnu@1.11.8': + optional: true + + '@swc/core-linux-arm64-musl@1.11.8': + optional: true + + '@swc/core-linux-x64-gnu@1.11.8': + optional: true + + '@swc/core-linux-x64-musl@1.11.8': + optional: true + + '@swc/core-win32-arm64-msvc@1.11.8': + optional: true + + '@swc/core-win32-ia32-msvc@1.11.8': + optional: true + + '@swc/core-win32-x64-msvc@1.11.8': + optional: true + + '@swc/core@1.11.8(@swc/helpers@0.5.15)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.19 + optionalDependencies: + '@swc/core-darwin-arm64': 1.11.8 + '@swc/core-darwin-x64': 1.11.8 + '@swc/core-linux-arm-gnueabihf': 1.11.8 + '@swc/core-linux-arm64-gnu': 1.11.8 + '@swc/core-linux-arm64-musl': 1.11.8 + '@swc/core-linux-x64-gnu': 1.11.8 + '@swc/core-linux-x64-musl': 1.11.8 + '@swc/core-win32-arm64-msvc': 1.11.8 + '@swc/core-win32-ia32-msvc': 1.11.8 + '@swc/core-win32-x64-msvc': 1.11.8 + '@swc/helpers': 0.5.15 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.19': + dependencies: + '@swc/counter': 0.1.3 + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/estree@1.0.6': {} + + '@types/jasmine@5.1.7': {} + + '@types/node@22.13.10': + dependencies: + undici-types: 6.20.0 + + '@vitest/coverage-v8@3.0.8(vitest@3.0.8(@types/node@22.13.10)(happy-dom@17.4.3)(jiti@2.4.2))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.8.1 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.0.8(@types/node@22.13.10)(happy-dom@17.4.3)(jiti@2.4.2) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.0.8': + dependencies: + '@vitest/spy': 3.0.8 + '@vitest/utils': 3.0.8 + chai: 5.2.0 + tinyrainbow: 2.0.0 + + '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2))': + dependencies: + '@vitest/spy': 3.0.8 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2) + + '@vitest/pretty-format@3.0.8': + dependencies: + tinyrainbow: 2.0.0 + + '@vitest/runner@3.0.8': + dependencies: + '@vitest/utils': 3.0.8 + pathe: 2.0.3 + + '@vitest/snapshot@3.0.8': + dependencies: + '@vitest/pretty-format': 3.0.8 + magic-string: 0.30.17 + pathe: 2.0.3 + + '@vitest/spy@3.0.8': + dependencies: + tinyspy: 3.0.2 + + '@vitest/utils@3.0.8': + dependencies: + '@vitest/pretty-format': 3.0.8 + loupe: 3.1.3 + tinyrainbow: 2.0.0 + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + arg@4.1.3: {} + + assertion-error@2.0.1: {} + + balanced-match@1.0.2: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + cac@6.7.14: {} + + caniuse-lite@1.0.30001703: {} + + chai@5.2.0: + dependencies: + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.3 + pathval: 2.0.0 + + check-error@2.1.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + commander@12.1.0: {} + + core-js@3.41.0: {} + + create-require@1.1.1: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.6 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-eql@5.0.2: {} + + diff@4.0.2: {} + + eastasianwidth@0.2.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + es-module-lexer@1.6.0: {} + + esbuild@0.25.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.1 + '@esbuild/android-arm': 0.25.1 + '@esbuild/android-arm64': 0.25.1 + '@esbuild/android-x64': 0.25.1 + '@esbuild/darwin-arm64': 0.25.1 + '@esbuild/darwin-x64': 0.25.1 + '@esbuild/freebsd-arm64': 0.25.1 + '@esbuild/freebsd-x64': 0.25.1 + '@esbuild/linux-arm': 0.25.1 + '@esbuild/linux-arm64': 0.25.1 + '@esbuild/linux-ia32': 0.25.1 + '@esbuild/linux-loong64': 0.25.1 + '@esbuild/linux-mips64el': 0.25.1 + '@esbuild/linux-ppc64': 0.25.1 + '@esbuild/linux-riscv64': 0.25.1 + '@esbuild/linux-s390x': 0.25.1 + '@esbuild/linux-x64': 0.25.1 + '@esbuild/netbsd-arm64': 0.25.1 + '@esbuild/netbsd-x64': 0.25.1 + '@esbuild/openbsd-arm64': 0.25.1 + '@esbuild/openbsd-x64': 0.25.1 + '@esbuild/sunos-x64': 0.25.1 + '@esbuild/win32-arm64': 0.25.1 + '@esbuild/win32-ia32': 0.25.1 + '@esbuild/win32-x64': 0.25.1 + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + expect-type@1.2.0: {} + + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + fsevents@2.3.3: + optional: true + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.1: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.0 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + globrex@0.1.2: {} + + happy-dom@17.4.3: + dependencies: + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + + has-flag@4.0.0: {} + + html-escaper@2.0.2: {} + + is-fullwidth-code-point@3.0.0: {} + + isexe@2.0.0: {} + + isomorphic-rslog@0.0.6: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.0: + dependencies: + '@isaacs/cliui': 8.0.2 + + jiti@2.4.2: {} + + json5@2.2.3: {} + + load-tsconfig@0.2.5: {} + + loupe@3.1.3: {} + + lru-cache@10.4.3: {} + + lru-cache@11.0.2: {} + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.26.9 + '@babel/types': 7.26.9 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.7.1 + + make-error@1.3.6: {} + + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mnemonist@0.40.3: + dependencies: + obliterator: 2.0.5 + + ms@2.1.3: {} + + nanoid@3.3.9: {} + + obliterator@2.0.5: {} + + package-json-from-dist@1.0.1: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 + + pathe@2.0.3: {} + + pathval@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.2: {} + + postcss@8.5.3: + dependencies: + nanoid: 3.3.9 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + rimraf@6.0.1: + dependencies: + glob: 11.0.1 + package-json-from-dist: 1.0.1 + + rollup@4.35.0: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.35.0 + '@rollup/rollup-android-arm64': 4.35.0 + '@rollup/rollup-darwin-arm64': 4.35.0 + '@rollup/rollup-darwin-x64': 4.35.0 + '@rollup/rollup-freebsd-arm64': 4.35.0 + '@rollup/rollup-freebsd-x64': 4.35.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.35.0 + '@rollup/rollup-linux-arm-musleabihf': 4.35.0 + '@rollup/rollup-linux-arm64-gnu': 4.35.0 + '@rollup/rollup-linux-arm64-musl': 4.35.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.35.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0 + '@rollup/rollup-linux-riscv64-gnu': 4.35.0 + '@rollup/rollup-linux-s390x-gnu': 4.35.0 + '@rollup/rollup-linux-x64-gnu': 4.35.0 + '@rollup/rollup-linux-x64-musl': 4.35.0 + '@rollup/rollup-win32-arm64-msvc': 4.35.0 + '@rollup/rollup-win32-ia32-msvc': 4.35.0 + '@rollup/rollup-win32-x64-msvc': 4.35.0 + fsevents: 2.3.3 + + rsbuild-plugin-dts@0.5.3(@rsbuild/core@1.2.16)(typescript@5.8.2): + dependencies: + '@ast-grep/napi': 0.35.0 + '@rsbuild/core': 1.2.16 + magic-string: 0.30.17 + picocolors: 1.1.1 + tinyglobby: 0.2.12 + tsconfig-paths: 4.2.0 + optionalDependencies: + typescript: 5.8.2 + + semver@7.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + siginfo@2.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + std-env@3.8.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.5 + minimatch: 9.0.5 + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + + tinypool@1.0.2: {} + + tinyrainbow@2.0.0: {} + + tinyspy@3.0.2: {} + + ts-node@10.9.2(@swc/core@1.11.8(@swc/helpers@0.5.15))(@types/node@22.13.10)(typescript@5.8.2): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.13.10 + acorn: 8.14.1 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.8.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.11.8(@swc/helpers@0.5.15) + + tsconfck@3.1.5(typescript@5.8.2): + optionalDependencies: + typescript: 5.8.2 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + type-fest@4.37.0: {} + + typescript@5.8.2: {} + + ultracite@4.1.21: + dependencies: + commander: 12.1.0 + + undici-types@6.20.0: {} + + unplugin-swc@1.5.1(@swc/core@1.11.8(@swc/helpers@0.5.15))(rollup@4.35.0): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.35.0) + '@swc/core': 1.11.8(@swc/helpers@0.5.15) + load-tsconfig: 0.2.5 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + + unplugin@1.16.1: + dependencies: + acorn: 8.14.1 + webpack-virtual-modules: 0.6.2 + + v8-compile-cache-lib@3.0.1: {} + + vite-node@3.0.8(@types/node@22.13.10)(jiti@2.4.2): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.3 + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)): + dependencies: + debug: 4.4.0 + globrex: 0.1.2 + tsconfck: 3.1.5(typescript@5.8.2) + optionalDependencies: + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2) + transitivePeerDependencies: + - supports-color + - typescript + + vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2): + dependencies: + esbuild: 0.25.1 + postcss: 8.5.3 + rollup: 4.35.0 + optionalDependencies: + '@types/node': 22.13.10 + fsevents: 2.3.3 + jiti: 2.4.2 + + vitest@3.0.8(@types/node@22.13.10)(happy-dom@17.4.3)(jiti@2.4.2): + dependencies: + '@vitest/expect': 3.0.8 + '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.10)(jiti@2.4.2)) + '@vitest/pretty-format': 3.0.8 + '@vitest/runner': 3.0.8 + '@vitest/snapshot': 3.0.8 + '@vitest/spy': 3.0.8 + '@vitest/utils': 3.0.8 + chai: 5.2.0 + debug: 4.4.0 + expect-type: 1.2.0 + magic-string: 0.30.17 + pathe: 2.0.3 + std-env: 3.8.1 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.2.1(@types/node@22.13.10)(jiti@2.4.2) + vite-node: 3.0.8(@types/node@22.13.10)(jiti@2.4.2) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.13.10 + happy-dom: 17.4.3 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + webidl-conversions@7.0.0: {} + + webpack-virtual-modules@0.6.2: {} + + whatwg-mimetype@3.0.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + yn@3.1.1: {} diff --git a/rslib.config.ts b/rslib.config.ts new file mode 100644 index 0000000..dfeef41 --- /dev/null +++ b/rslib.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + source: { + tsconfigPath: './tsconfig.lib.json', + }, + lib: [ + { + format: 'esm', + syntax: 'es2021', + bundle: false, + dts: { + bundle: false, + build: false, + distPath: './dist', + }, + source: { + entry: { + index: ['src/**/*.ts'], + }, + }, + }, + { + format: 'cjs', + syntax: 'es2021', + dts: false, + bundle: true, + source: { + entry: { + index: './src/index.ts', + }, + }, + }, + ], + output: { + target: 'web', + }, +}); diff --git a/src/adapters/index.ts b/src/adapters/index.ts new file mode 100644 index 0000000..8779e96 --- /dev/null +++ b/src/adapters/index.ts @@ -0,0 +1,12 @@ +import type { Promisable } from 'type-fest'; + +export type FileDataViewController = { + getOffset(): number; + seek(offset: number): Promisable; + read( + offset: number, + length?: number, + exactLength?: boolean + ): Promise; + peek(offset: number): Promise; +}; diff --git a/src/decode-utils.ts b/src/decode-utils.ts new file mode 100644 index 0000000..94a2479 --- /dev/null +++ b/src/decode-utils.ts @@ -0,0 +1,123 @@ +import { type EbmlTagIdType, isEbmlMasterTagId } from './models/enums'; +import type { EbmlTagTrait } from './models/tag-trait'; +import type { FileDataViewController } from './adapters'; +import { + checkVintSafeSize, + dataViewSlice, + readUnsigned, + readVint, + readVintLength, + type SafeSizeVint, +} from './tools'; +import { EbmlTagPosition } from './models/enums'; +import { createEbmlTag } from './factory'; +import { UnreachableOrLogicError } from './errors'; + +export async function decodeEbmlTagHeader( + controller: FileDataViewController +): Promise<{ + sizeVint: SafeSizeVint; + tagVint: { length: number }; + tagId: EbmlTagIdType; +}> { + const offset = controller.getOffset(); + + let view = await controller.read(offset, 1); + + const tagVintLength = readVintLength(view); + + view = + tagVintLength > view.byteLength + ? await controller.read(offset, tagVintLength) + : view; + + const tagIdView = dataViewSlice(view, 0, tagVintLength); + + view = + tagVintLength + 1 > view.byteLength + ? await controller.read(offset, tagVintLength + 1) + : view; + + const sizeVintLength = readVintLength( + dataViewSlice(view, tagVintLength, tagVintLength + 1) + ); + + view = + tagVintLength + sizeVintLength > view.byteLength + ? await controller.read(offset, tagVintLength + sizeVintLength) + : view; + + const sizeVint = readVint( + dataViewSlice(view, tagVintLength, tagVintLength + sizeVintLength) + )!; + + if (!sizeVint) { + throw new UnreachableOrLogicError( + 'size vint dataView length is invalid, check code logic!' + ); + } + + const tagId = readUnsigned(tagIdView); + + const safeSizeVint = checkVintSafeSize(sizeVint, tagId); + + return { + sizeVint: safeSizeVint, + tagVint: { + length: tagVintLength, + }, + tagId, + }; +} + +export async function* decodeEbmlContent( + controller: FileDataViewController +): AsyncGenerator { + while (true) { + const offset = controller.getOffset(); + + const peeked = await controller.peek(offset); + + if (!peeked) { + break; + } + + const vints = await decodeEbmlTagHeader(controller); + + const { tagId, tagVint, sizeVint } = vints; + + const headerLength = tagVint.length + sizeVint.length; + const contentLength = sizeVint.value; + + const isMaster = isEbmlMasterTagId(tagId); + + if (isMaster) { + const tag: EbmlTagTrait = createEbmlTag(tagId, { + headerLength, + contentLength, + startOffset: offset, + position: EbmlTagPosition.Start, + parent: undefined, + }); + yield tag; + } + + await controller.seek(offset + headerLength); + + const tag: EbmlTagTrait = createEbmlTag(tagId, { + headerLength, + contentLength, + startOffset: offset, + position: isMaster ? EbmlTagPosition.End : EbmlTagPosition.Content, + parent: undefined, + }); + + for await (const item of tag.decodeContent(controller)) { + yield item; + } + + tag.endOffset = controller.getOffset(); + + yield tag; + } +} diff --git a/src/decoder.ts b/src/decoder.ts new file mode 100644 index 0000000..a81b922 --- /dev/null +++ b/src/decoder.ts @@ -0,0 +1,227 @@ +import { Queue } from 'mnemonist'; +import type { FileDataViewController } from './adapters'; +import type { EbmlTagTrait } from './models/tag-trait'; +import { decodeEbmlContent } from './decode-utils'; +import { StreamFlushReason, UnreachableOrLogicError } from './errors'; +import { dataViewSlice } from './tools'; + +export class EbmlDecodeStreamTransformer + implements Transformer, FileDataViewController +{ + private _offset = 0; + private _buffer: Uint8Array = new Uint8Array(0); + private _requests: Queue< + [number, number, (view: DataView) => void, (err: Error) => void] + > = new Queue(); + private _tickIdleCallback: VoidFunction | undefined; + private _currentTask: Promise | undefined; + private _writeBuffer = new Queue(); + + public getBuffer(): Uint8Array { + return this._buffer; + } + + public getOffset(): number { + return this._offset; + } + + public seek(nextOffset: number): number { + const oldOffset = this._offset; + + if (this._requests.size > 0) { + throw new UnreachableOrLogicError( + 'sequential transformer should not seek before all read requests done' + ); + } + if (nextOffset < oldOffset) { + throw new UnreachableOrLogicError( + 'sequential transformer should not seek to previous offset' + ); + } + + this._buffer = this._buffer.slice(nextOffset - oldOffset); + this._offset = nextOffset; + + return nextOffset; + } + + public async read( + reqStart: number, + reqLength = 0, + exactLength = false + ): Promise { + const bufferStart = this._offset; + const bufferEnd = bufferStart + this._buffer.byteLength; + const reqEnd = reqStart + reqLength; + + if (reqStart < bufferStart) { + throw new UnreachableOrLogicError( + 'sequential transformer should not read before current offset' + ); + } + let view: DataView; + if (bufferEnd >= reqEnd) { + view = new DataView(this._buffer.buffer, reqStart - bufferStart); + } else { + view = await new Promise((resolve, reject) => { + this._requests.enqueue([reqStart, reqEnd, resolve, reject]); + this.notifyIdle(); + }); + } + + view = exactLength ? dataViewSlice(view, 0, reqLength) : view; + + return view; + } + + public async peek(offset: number): Promise { + try { + return await this.read(offset, 1); + } catch (e) { + if (e instanceof StreamFlushReason) { + return null; + } + throw e; + } + } + + private handleRequests() { + const bufferStart = this._offset; + const bufferEnd = bufferStart + this._buffer.byteLength; + + let handleCounts = this._requests.size; + while (handleCounts > 0) { + const req = this._requests.dequeue(); + if (!req) { + break; + } + const [reqStart, reqEnd, resolve, _] = req; + if (reqStart < bufferStart) { + throw new UnreachableOrLogicError( + 'sequential transformer should not read before current offset' + ); + } + if (bufferEnd >= reqEnd) { + resolve(new DataView(this._buffer.buffer, reqStart - bufferStart)); + } else { + this.notifyIdle(); + this._requests.enqueue(req); + } + handleCounts--; + } + } + + private cancelRequests() { + while (true) { + const req = this._requests.dequeue(); + if (!req) { + break; + } + const [_reqStart, _reqEnd, _resolve, reject] = req; + reject(new StreamFlushReason()); + } + } + + notifyIdle() { + if (this._tickIdleCallback) { + this._tickIdleCallback(); + } + } + + tryEnqueueToBuffer(item: EbmlTagTrait) { + this._writeBuffer.enqueue(item); + } + + waitBufferRelease( + ctrl: TransformStreamDefaultController, + isFlush: boolean + ) { + while (this._writeBuffer.size) { + if (ctrl.desiredSize! <= 0 && !isFlush) { + break; + } + ctrl.enqueue(this._writeBuffer.dequeue()); + } + } + + async tick( + ctrl: TransformStreamDefaultController, + isFlush: boolean + ) { + const waitIdle = new Promise((resolve) => { + this._tickIdleCallback = () => { + resolve(); + this._tickIdleCallback = undefined; + }; + }); + + if (isFlush) { + this.cancelRequests(); + } else { + this.handleRequests(); + } + + if (!this._currentTask && !isFlush) { + const decode = async () => { + try { + for await (const tag of decodeEbmlContent(this)) { + this.tryEnqueueToBuffer(tag); + } + this._currentTask = undefined; + } catch (err) { + if (!(err instanceof StreamFlushReason)) { + ctrl.error(err); + } + } + }; + this._currentTask = decode(); + } + + await Promise.race([this._currentTask, waitIdle]); + this.waitBufferRelease(ctrl, isFlush); + } + + async start(ctrl: TransformStreamDefaultController) { + this._offset = 0; + this._buffer = new Uint8Array(0); + this._requests.clear(); + this._tickIdleCallback = undefined; + this._currentTask = undefined; + await this.tick(ctrl, false); + } + + async transform( + chunk: ArrayBuffer, + ctrl: TransformStreamDefaultController + ): Promise { + if (chunk.byteLength === 0) { + return; + } + const newBuffer = new Uint8Array( + this._buffer.byteLength + chunk.byteLength + ); + + newBuffer.set(this._buffer, 0); + newBuffer.set(new Uint8Array(chunk), this._buffer.byteLength); + this._buffer = newBuffer; + + await this.tick(ctrl, false); + } + + async flush(ctrl: TransformStreamDefaultController) { + await this.tick(ctrl, true); + } +} + +export class EbmlStreamDecoder extends TransformStream< + ArrayBuffer, + EbmlTagTrait +> { + public readonly transformer: EbmlDecodeStreamTransformer; + + constructor() { + const transformer = new EbmlDecodeStreamTransformer(); + super(transformer); + this.transformer = transformer; + } +} diff --git a/src/encoder.ts b/src/encoder.ts new file mode 100644 index 0000000..424073a --- /dev/null +++ b/src/encoder.ts @@ -0,0 +1,93 @@ +import { Queue, Stack } from 'mnemonist'; +import { EbmlTagTrait } from './models/tag-trait'; +import { EbmlTagPosition } from './models/enums'; +import { EbmlMasterTag } from './models/tag-master'; +import { EbmlTreeMasterNotMatchError, UnreachableOrLogicError } from './errors'; + +export class EbmlEncodeStreamTransformer + implements Transformer +{ + stack = new Stack<[EbmlMasterTag, ArrayBuffer[]]>(); + _writeBuffer = new Queue(); + _writeBufferTask: Promise | undefined; + closed = false; + + tryEnqueueToBuffer(...frag: ArrayBuffer[]) { + const top = this.stack.peek(); + if (top) { + top[1].push(...frag); + } else { + for (const f of frag) { + this._writeBuffer.enqueue(f); + } + } + } + + waitBufferRelease( + ctrl: TransformStreamDefaultController, + isFlush: boolean + ) { + while (this._writeBuffer.size) { + if (ctrl.desiredSize! <= 0 && !isFlush) { + break; + } + ctrl.enqueue(this._writeBuffer.dequeue()); + } + } + + // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: + async transform( + tag: EbmlTagTrait, + ctrl: TransformStreamDefaultController + ) { + if (!(tag instanceof EbmlTagTrait)) { + throw new UnreachableOrLogicError('should only accept embl tag but not'); + } + + if (tag instanceof EbmlMasterTag) { + if (tag.contentLength === Number.POSITIVE_INFINITY) { + if (tag.position === EbmlTagPosition.Start) { + this.tryEnqueueToBuffer(...tag.encodeHeader()); + } + } else { + // biome-ignore lint/style/useCollapsedElseIf: + if (tag.position === EbmlTagPosition.Start) { + this.stack.push([tag, []]); + } else { + const pop = this.stack.pop(); + if (!pop) { + throw new EbmlTreeMasterNotMatchError(tag); + } + const [startTag, fragments] = pop; + const size = fragments.reduce( + (acc, curr) => acc + curr.byteLength, + 0 + ); + startTag.contentLength = size; + this.tryEnqueueToBuffer(...startTag.encodeHeader()); + this.tryEnqueueToBuffer(...fragments); + } + } + } else { + this.tryEnqueueToBuffer(...tag.encode()); + } + this.waitBufferRelease(ctrl, false); + } + + flush(ctrl: TransformStreamDefaultController) { + this.waitBufferRelease(ctrl, true); + } +} + +export class EbmlStreamEncoder extends TransformStream< + EbmlTagTrait, + ArrayBuffer +> { + public readonly transformer: EbmlEncodeStreamTransformer; + + constructor() { + const transformer = new EbmlEncodeStreamTransformer(); + super(transformer); + this.transformer = transformer; + } +} diff --git a/src/errors.ts b/src/errors.ts new file mode 100644 index 0000000..b5c6087 --- /dev/null +++ b/src/errors.ts @@ -0,0 +1,114 @@ +import type { EbmlElementType, EbmlTagIdType } from './models/enums'; +import type { EbmlTagTrait } from './models/tag-trait'; + +export class ElementIdVintDataAllZerosError extends Error { + constructor(value: number | bigint) { + super( + `RFC8794 Element ID VINT_DATA can not be all zeros, but got ${value.toString(16)}` + ); + } +} + +export class ElementIdVintDataAllOnesError extends Error { + constructor(value: number | bigint) { + super( + `RFC8794 Element ID VINT_DATA can not be all ones, but got ${value.toString(16)}` + ); + } +} + +export class ElementIdVintDataNotShortestError extends Error { + constructor(value: number | bigint) { + super( + `RFC8794 Element ID VINT_DATA should be shortest, but ${value.toString(16)} is not` + ); + } +} + +export class VintOutOfRangeError extends Error { + constructor(value: number | bigint) { + super( + `RFC8794 VINT_DATA out of range 0 ~ 2^56-1, but got ${value.toString(16)}` + ); + } +} + +export class VintLengthOutOfRangeError extends Error { + constructor(length: number) { + super( + `RFC8794 Vint length out of range, valid vint range is 1 ~ 8 octet, but got ${length}` + ); + } +} + +export class UnsupportLengthForElementTypeError extends Error { + constructor(type: EbmlElementType, expected: string, found: string | number) { + super( + `RFC8794 type ${type} length should be ${expected}, but found ${found}` + ); + } +} + +export class OutOfRangeForElementTypeError extends Error { + constructor( + type: EbmlElementType, + expected: string, + found: string | number | bigint + ) { + super( + `RFC8794 type ${type} value range should be ${expected}, but found ${found}` + ); + } +} + +export class InconsistentWellKnownEbmlTagTypeError extends Error { + constructor(id: EbmlTagIdType, type: EbmlElementType) { + super( + `Trying to create tag of well-known type "${id.toString(16)}" using content type "${type}" (which is incorrect). Either pass the correct type or ignore the type parameter to EbmlTag.create()` + ); + } +} + +export class InconsistentOffsetOnDecodingContentError extends Error { + constructor(tag: EbmlTagTrait, endOffset: number) { + super( + `Inconsistent offset on decoding content, startOffset(${tag.startOffset + tag.headerLength}) + contentLength(${tag.contentLength}) != endOffset(${endOffset}) of tag(${JSON.stringify(tag.toDebugRecord())})` + ); + } +} + +export class SizeUnitOutOfSafeIntegerRangeError extends Error { + constructor(size: number | bigint) { + super( + `Size unit ${size.toString(16)} is a valid vint, but out of ecmascript safe integer range` + ); + } +} + +export class UnreachableOrLogicError extends Error { + constructor(detail: string) { + super(`Unreachable or Logic Error: ${detail}`); + } +} + +export class AbortReason extends Error { + isAbortReason = true; + + constructor(reason: string) { + super(`Aborted: ${reason}`); + } +} + +export class StreamFlushReason extends AbortReason { + constructor() { + super('stream flushed'); + } +} + +export class EbmlTreeMasterNotMatchError extends Error { + constructor(tag: EbmlTagTrait) { + super( + `start and end of master tag does not match in ebml tree at ${JSON.stringify(tag)}` + ); + } +} diff --git a/src/factory.ts b/src/factory.ts new file mode 100644 index 0000000..efba278 --- /dev/null +++ b/src/factory.ts @@ -0,0 +1,180 @@ +import { InconsistentWellKnownEbmlTagTypeError } from './errors'; +import { + type EbmlMasterTagIdType, + type EbmlDataTagIdType, + type EbmlBlockTagIdType, + type EbmlSimpleBlockTagIdType, + EbmlElementType, + EbmlTagIdEnum, + isEbmlBlockTagId, + isEbmlSimpleBlockTagId, + isEbmlMasterTagId, + isEbmlUintDataTagId, + isEbmlIntDataTagId, + isEbmlFloatDataTagId, + isEbmlStringDataTagId, + isEbmlUtf8DataTagId, + isEbmlDateDataTagId, + isEbmlBinaryDataTagId, +} from './models/enums'; +import { + type CreateEbmlBlockTagOptions, + EbmlBlockTag, +} from './models/tag-block'; +import { type CreateEbmlDataTagOptions, EbmlDataTag } from './models/tag-data'; +import { + type CreateEbmlMasterTagOptions, + EbmlMasterTag, +} from './models/tag-master'; +import { + type CreateEbmlSimpleBlockTagOptions, + EbmlSimpleBlockTag, +} from './models/tag-simple-block'; +import type { CreateEbmlTagOptions, EbmlTagTrait } from './models/tag-trait'; + +export function createEbmlTag( + id: EbmlMasterTagIdType, + options: Omit +): EbmlMasterTag; + +export function createEbmlTag( + id: EbmlDataTagIdType, + options: Omit +): EbmlDataTag; + +export function createEbmlTag( + id: EbmlBlockTagIdType, + options: Omit +): EbmlBlockTag; + +export function createEbmlTag( + id: EbmlSimpleBlockTagIdType, + options: Omit +): EbmlSimpleBlockTag; + +export function createEbmlTag( + id: CreateEbmlTagOptions['id'], + options: Omit +): EbmlTagTrait; + +// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: +export function createEbmlTag(arg1: unknown, arg2: unknown): EbmlTagTrait { + const id = arg1 as EbmlTagIdEnum; + const options = arg2 as Omit; + let type: EbmlElementType | undefined = options.type; + if (EbmlTagIdEnum[id] !== undefined) { + let foundType: EbmlElementType | undefined; + if (isEbmlBlockTagId(id)) { + return new EbmlBlockTag({ ...options, id }); + } + if (isEbmlSimpleBlockTagId(id)) { + return new EbmlSimpleBlockTag({ ...options }); + } + if (isEbmlMasterTagId(id)) { + foundType = EbmlElementType.Master; + } else if (isEbmlUintDataTagId(id)) { + foundType = EbmlElementType.UnsignedInt; + } else if (isEbmlIntDataTagId(id)) { + foundType = EbmlElementType.Integer; + } else if (isEbmlFloatDataTagId(id)) { + foundType = EbmlElementType.Float; + } else if (isEbmlStringDataTagId(id)) { + foundType = EbmlElementType.String; + } else if (isEbmlUtf8DataTagId(id)) { + foundType = EbmlElementType.UTF8; + } else if (isEbmlDateDataTagId(id)) { + foundType = EbmlElementType.Date; + } else if (isEbmlBinaryDataTagId(id)) { + foundType = EbmlElementType.Binary; + } + + if (type === undefined) { + type = foundType; + } + if (type !== foundType) { + throw new InconsistentWellKnownEbmlTagTypeError(id, type!); + } + } + + if (type === EbmlElementType.Master) { + return new EbmlMasterTag({ + ...options, + id: id as EbmlMasterTagIdType, + }); + } + return new EbmlDataTag({ + ...options, + id, + type, + }); +} + +export type EncodeUselessCreateOptionsType = + | 'contentLength' + | 'headerLength' + | 'startOffset'; + +export function createEbmlTagForManuallyBuild( + id: EbmlMasterTagIdType, + options: Omit< + CreateEbmlMasterTagOptions, + 'id' | EncodeUselessCreateOptionsType + > & + Partial> +): EbmlMasterTag; + +export function createEbmlTagForManuallyBuild( + id: EbmlDataTagIdType, + options: Omit< + CreateEbmlDataTagOptions, + 'id' | EncodeUselessCreateOptionsType + > & + Partial> +): EbmlDataTag; + +export function createEbmlTagForManuallyBuild( + id: EbmlBlockTagIdType, + options: Omit< + CreateEbmlBlockTagOptions, + 'id' | EncodeUselessCreateOptionsType + > & + Partial> +): EbmlBlockTag; + +export function createEbmlTagForManuallyBuild( + id: EbmlSimpleBlockTagIdType, + options: Omit< + CreateEbmlSimpleBlockTagOptions, + 'id' | EncodeUselessCreateOptionsType + > & + Partial> +): EbmlSimpleBlockTag; + +export function createEbmlTagForManuallyBuild( + id: CreateEbmlTagOptions['id'], + options: Omit & + Partial> +): EbmlTagTrait; + +export function createEbmlTagForManuallyBuild( + arg1: unknown, + arg2: unknown +): EbmlTagTrait { + const id = arg1 as CreateEbmlTagOptions['id']; + const options = arg2 as Omit< + CreateEbmlTagOptions, + 'id' | EncodeUselessCreateOptionsType + > & + Partial>; + return createEbmlTag( + id, + Object.assign( + { + contentLength: Number.NaN, + headerLength: Number.NaN, + startOffset: Number.NaN, + }, + options + ) as Omit + ); +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..d9ec27a --- /dev/null +++ b/src/index.ts @@ -0,0 +1,47 @@ +export { EbmlBlockTag } from './models/tag-block'; +export { EbmlDataTag } from './models/tag-data'; +export { EbmlMasterTag } from './models/tag-master'; +export { EbmlSimpleBlockTag } from './models/tag-simple-block'; +export { EbmlTagTrait } from './models/tag-trait'; +export { + createEbmlTag, + createEbmlTagForManuallyBuild, +} from './factory'; +export { + decodeEbmlTagHeader, + decodeEbmlContent, +} from './decode-utils'; +export { EbmlStreamDecoder, EbmlDecodeStreamTransformer } from './decoder'; +export { + EbmlStreamEncoder, + EbmlEncodeStreamTransformer, +} from './encoder'; +export { + EbmlBlockLacing, + EbmlTagIdEnum, + type EbmlElementType, + type EbmlBinaryDataTagIdType, + type EbmlMasterTagIdType, + type EbmlBlockTagIdType, + type EbmlDataTagIdType, + type EbmlDateDataTagIdType, + type EbmlFloatDataTagIdType, + type EbmlIntDataTagIdType, + type EbmlSimpleBlockTagIdType, + type EbmlStringDataTagIdType, + type EbmlUintDataTagIdType, + type EbmlUtf8DataTagIdType, + type EbmlTagIdType, + EbmlTagPosition, + isEbmlBinaryDataTagId, + isEbmlBlockTagId, + isEbmlDateDataTagId, + isEbmlFloatDataTagId, + isEbmlIntDataTagId, + isEbmlMasterTagId, + isEbmlSimpleBlockTagId, + isEbmlStringDataTagId, + isEbmlUintDataTagId, + isEbmlUtf8DataTagId, + isUnknownDataTagId, +} from './models/enums'; diff --git a/src/models/enums.ts b/src/models/enums.ts new file mode 100644 index 0000000..5d9c5bb --- /dev/null +++ b/src/models/enums.ts @@ -0,0 +1,995 @@ +export enum EbmlElementType { + Master = 'm', + UnsignedInt = 'u', + Integer = 'i', + String = 's', + UTF8 = '8', + Binary = 'b', + Float = 'f', + Date = 'd', +} + +export enum EbmlTagPosition { + Start = 1, + Content = 2, + End = 3, +} + +export enum EbmlTagIdEnum { + ChapterDisplay = 0x80, + TrackType = 0x83, + ChapString = 0x85, + CodecID = 0x86, + FlagDefault = 0x88, + ChapterTrackNumber = 0x89, + ChapterTimeStart = 0x91, + ChapterTimeEnd = 0x92, + CueRefTime = 0x96, + CueRefCluster = 0x97, + ChapterFlagHidden = 0x98, + ContentCompAlgo = 0x4254, + ContentCompSettings = 0x4255, + DocType = 0x4282, + DocTypeReadVersion = 0x4285, + EBMLVersion = 0x4286, + DocTypeVersion = 0x4287, + SegmentFamily = 0x4444, + DateUTC = 0x4461, + TagDefault = 0x4484, + TagBinary = 0x4485, + TagString = 0x4487, + Duration = 0x4489, + ChapterFlagEnabled = 0x4598, + FileMimeType = 0x4660, + FileUsedStartTime = 0x4661, + FileUsedEndTime = 0x4662, + FileReferral = 0x4675, + ContentEncodingOrder = 0x5031, + ContentEncodingScope = 0x5032, + ContentEncodingType = 0x5033, + ContentCompression = 0x5034, + ContentEncryption = 0x5035, + CueBlockNumber = 0x5378, + ChapterStringUID = 0x5654, + WritingApp = 0x5741, + SilentTracks = 0x5854, + ContentEncoding = 0x6240, + BitDepth = 0x6264, + SignedElement = 0x6532, + TrackTranslate = 0x6624, + ChapProcessCommand = 0x6911, + ChapProcessTime = 0x6922, + ChapterTranslate = 0x6924, + ChapProcessData = 0x6933, + ChapProcess = 0x6944, + ChapProcessCodecID = 0x6955, + Tag = 0x7373, + SegmentFilename = 0x7384, + AttachmentLink = 0x7446, + CodecName = 0x258688, + Segment = 0x18538067, + TagLanguage = 0x447a, + TagName = 0x45a3, + SimpleTag = 0x67c8, + TagAttachmentUID = 0x63c6, + TagChapterUID = 0x63c4, + TagEditionUID = 0x63c9, + TagTrackUID = 0x63c5, + TargetType = 0x63ca, + TargetTypeValue = 0x68ca, + Targets = 0x63c0, + Tags = 0x1254c367, + ChapProcessPrivate = 0x450d, + ChapCountry = 0x437e, + ChapLanguage = 0x437c, + ChapterTrack = 0x8f, + ChapterPhysicalEquiv = 0x63c3, + ChapterSegmentEditionUID = 0x6ebc, + ChapterSegmentUID = 0x6e67, + ChapterUID = 0x73c4, + ChapterAtom = 0xb6, + EditionFlagOrdered = 0x45dd, + EditionFlagDefault = 0x45db, + EditionFlagHidden = 0x45bd, + EditionUID = 0x45bc, + EditionEntry = 0x45b9, + Chapters = 0x1043a770, + FileUID = 0x46ae, + FileData = 0x465c, + FileName = 0x466e, + FileDescription = 0x467e, + AttachedFile = 0x61a7, + Attachments = 0x1941a469, + CueRefCodecState = 0xeb, + CueRefNumber = 0x535f, + CueReference = 0xdb, + CueCodecState = 0xea, + CueDuration = 0xb2, + CueRelativePosition = 0xf0, + CueClusterPosition = 0xf1, + CueTrack = 0xf7, + CueTrackPositions = 0xb7, + CueTime = 0xb3, + CuePoint = 0xbb, + Cues = 0x1c53bb6b, + AESSettingsCipherMode = 0x47e8, + ContentEncAESSettings = 0x47e7, + ContentSigHashAlgo = 0x47e6, + ContentSigAlgo = 0x47e5, + ContentSigKeyID = 0x47e4, + ContentSignature = 0x47e3, + ContentEncKeyID = 0x47e2, + ContentEncAlgo = 0x47e1, + ContentEncodings = 0x6d80, + TrickMasterTrackSegmentUID = 0xc4, + TrickMasterTrackUID = 0xc7, + TrickTrackFlag = 0xc6, + TrickTrackSegmentUID = 0xc1, + TrickTrackUID = 0xc0, + TrackJoinUID = 0xed, + TrackJoinBlocks = 0xe9, + TrackPlaneType = 0xe6, + TrackPlaneUID = 0xe5, + TrackPlane = 0xe4, + TrackCombinePlanes = 0xe3, + TrackOperation = 0xe2, + ChannelPositions = 0x7d7b, + Channels = 0x9f, + OutputSamplingFrequency = 0x78b5, + SamplingFrequency = 0xb5, + Audio = 0xe1, + FrameRate = 0x2383e3, + GammaValue = 0x2fb523, + ColourSpace = 0x2eb524, + AspectRatioType = 0x54b3, + DisplayUnit = 0x54b2, + DisplayHeight = 0x54ba, + DisplayWidth = 0x54b0, + PixelCropRight = 0x54dd, + PixelCropLeft = 0x54cc, + PixelCropTop = 0x54bb, + PixelCropBottom = 0x54aa, + PixelHeight = 0xba, + PixelWidth = 0xb0, + OldStereoMode = 0x53b9, + AlphaMode = 0x53c0, + StereoMode = 0x53b8, + FlagInterlaced = 0x9a, + Video = 0xe0, + TrackTranslateTrackID = 0x66a5, + TrackTranslateCodec = 0x66bf, + TrackTranslateEditionUID = 0x66fc, + SeekPreRoll = 0x56bb, + CodecDelay = 0x56aa, + TrackOverlay = 0x6fab, + CodecDecodeAll = 0xaa, + CodecDownloadURL = 0x26b240, + CodecInfoURL = 0x3b4040, + CodecSettings = 0x3a9697, + CodecPrivate = 0x63a2, + Language = 0x22b59c, + Name = 0x536e, + MaxBlockAdditionID = 0x55ee, + TrackOffset = 0x537f, + TrackTimecodeScale = 0x23314f, + DefaultDecodedFieldDuration = 0x234e7a, + DefaultDuration = 0x23e383, + MaxCache = 0x6df8, + MinCache = 0x6de7, + FlagLacing = 0x9c, + FlagForced = 0x55aa, + FlagEnabled = 0xb9, + TrackUID = 0x73c5, + TrackNumber = 0xd7, + TrackEntry = 0xae, + Tracks = 0x1654ae6b, + EncryptedBlock = 0xaf, + ReferenceTimeCode = 0xca, + ReferenceOffset = 0xc9, + ReferenceFrame = 0xc8, + SliceDuration = 0xcf, + Delay = 0xce, + BlockAdditionID = 0xcb, + FrameNumber = 0xcd, + LaceNumber = 0xcc, + TimeSlice = 0xe8, + Slices = 0x8e, + DiscardPadding = 0x75a2, + CodecState = 0xa4, + ReferenceVirtual = 0xfd, + ReferenceBlock = 0xfb, + ReferencePriority = 0xfa, + BlockDuration = 0x9b, + BlockAdditional = 0xa5, + BlockAddID = 0xee, + BlockMore = 0xa6, + BlockAdditions = 0x75a1, + BlockVirtual = 0xa2, + Block = 0xa1, + BlockGroup = 0xa0, + SimpleBlock = 0xa3, + PrevSize = 0xab, + Position = 0xa7, + SilentTrackNumber = 0x58d7, + Timecode = 0xe7, + Cluster = 0x1f43b675, + MuxingApp = 0x4d80, + Title = 0x7ba9, + TimecodeScaleDenominator = 0x2ad7b2, + TimecodeScale = 0x2ad7b1, + ChapterTranslateID = 0x69a5, + ChapterTranslateCodec = 0x69bf, + ChapterTranslateEditionUID = 0x69fc, + NextFilename = 0x3e83bb, + NextUID = 0x3eb923, + PrevFilename = 0x3c83ab, + PrevUID = 0x3cb923, + SegmentUID = 0x73a4, + Info = 0x1549a966, + SeekPosition = 0x53ac, + SeekID = 0x53ab, + Seek = 0x4dbb, + SeekHead = 0x114d9b74, + SignatureElementList = 0x7e7b, + SignatureElements = 0x7e5b, + Signature = 0x7eb5, + SignaturePublicKey = 0x7ea5, + SignatureHash = 0x7e9a, + SignatureAlgo = 0x7e8a, + SignatureSlot = 0x1b538667, + CRC32 = 0xbf, + Void = 0xec, + EBMLMaxSizeLength = 0x42f3, + EBMLMaxIDLength = 0x42f2, + EBMLReadVersion = 0x42f7, + EBML = 0x1a45dfa3, +} + +export type EbmlTagIdType = EbmlTagIdEnum | number | bigint; + +export type EbmlMasterTagIdType = + | EbmlTagIdEnum.ChapterDisplay + | EbmlTagIdEnum.ContentCompression + | EbmlTagIdEnum.ContentEncryption + | EbmlTagIdEnum.SilentTracks + | EbmlTagIdEnum.ContentEncoding + | EbmlTagIdEnum.TrackTranslate + | EbmlTagIdEnum.ChapProcessCommand + | EbmlTagIdEnum.ChapterTranslate + | EbmlTagIdEnum.ChapProcess + | EbmlTagIdEnum.Tag + | EbmlTagIdEnum.Segment + | EbmlTagIdEnum.SimpleTag + | EbmlTagIdEnum.Targets + | EbmlTagIdEnum.Tags + | EbmlTagIdEnum.ChapterTrack + | EbmlTagIdEnum.ChapterAtom + | EbmlTagIdEnum.EditionEntry + | EbmlTagIdEnum.Chapters + | EbmlTagIdEnum.AttachedFile + | EbmlTagIdEnum.Attachments + | EbmlTagIdEnum.CueReference + | EbmlTagIdEnum.CueTrackPositions + | EbmlTagIdEnum.CuePoint + | EbmlTagIdEnum.Cues + | EbmlTagIdEnum.ContentEncAESSettings + | EbmlTagIdEnum.ContentEncodings + | EbmlTagIdEnum.TrackJoinBlocks + | EbmlTagIdEnum.TrackPlane + | EbmlTagIdEnum.TrackCombinePlanes + | EbmlTagIdEnum.TrackOperation + | EbmlTagIdEnum.Audio + | EbmlTagIdEnum.Video + | EbmlTagIdEnum.TrackEntry + | EbmlTagIdEnum.Tracks + | EbmlTagIdEnum.ReferenceFrame + | EbmlTagIdEnum.TimeSlice + | EbmlTagIdEnum.Slices + | EbmlTagIdEnum.BlockMore + | EbmlTagIdEnum.BlockAdditions + | EbmlTagIdEnum.BlockGroup + | EbmlTagIdEnum.Cluster + | EbmlTagIdEnum.Info + | EbmlTagIdEnum.Seek + | EbmlTagIdEnum.SeekHead + | EbmlTagIdEnum.SignatureElementList + | EbmlTagIdEnum.SignatureElements + | EbmlTagIdEnum.SignatureSlot + | EbmlTagIdEnum.EBML; + +export type EbmlDataTagIdType = + | EbmlTagIdEnum.TrackType + | EbmlTagIdEnum.FlagDefault + | EbmlTagIdEnum.ChapterTrackNumber + | EbmlTagIdEnum.ChapterTimeStart + | EbmlTagIdEnum.ChapterTimeEnd + | EbmlTagIdEnum.CueRefTime + | EbmlTagIdEnum.CueRefCluster + | EbmlTagIdEnum.ChapterFlagHidden + | EbmlTagIdEnum.ContentCompAlgo + | EbmlTagIdEnum.DocTypeReadVersion + | EbmlTagIdEnum.EBMLVersion + | EbmlTagIdEnum.DocTypeVersion + | EbmlTagIdEnum.TagDefault + | EbmlTagIdEnum.ChapterFlagEnabled + | EbmlTagIdEnum.FileUsedStartTime + | EbmlTagIdEnum.FileUsedEndTime + | EbmlTagIdEnum.ContentEncodingOrder + | EbmlTagIdEnum.ContentEncodingScope + | EbmlTagIdEnum.ContentEncodingType + | EbmlTagIdEnum.CueBlockNumber + | EbmlTagIdEnum.BitDepth + | EbmlTagIdEnum.ChapProcessTime + | EbmlTagIdEnum.ChapProcessCodecID + | EbmlTagIdEnum.AttachmentLink + | EbmlTagIdEnum.TagAttachmentUID + | EbmlTagIdEnum.TagChapterUID + | EbmlTagIdEnum.TagEditionUID + | EbmlTagIdEnum.TagTrackUID + | EbmlTagIdEnum.TargetTypeValue + | EbmlTagIdEnum.ChapterPhysicalEquiv + | EbmlTagIdEnum.ChapterSegmentEditionUID + | EbmlTagIdEnum.ChapterUID + | EbmlTagIdEnum.EditionFlagOrdered + | EbmlTagIdEnum.EditionFlagDefault + | EbmlTagIdEnum.EditionFlagHidden + | EbmlTagIdEnum.EditionUID + | EbmlTagIdEnum.FileUID + | EbmlTagIdEnum.CueRefCodecState + | EbmlTagIdEnum.CueRefNumber + | EbmlTagIdEnum.CueCodecState + | EbmlTagIdEnum.CueDuration + | EbmlTagIdEnum.CueRelativePosition + | EbmlTagIdEnum.CueClusterPosition + | EbmlTagIdEnum.CueTrack + | EbmlTagIdEnum.CueTime + | EbmlTagIdEnum.AESSettingsCipherMode + | EbmlTagIdEnum.ContentSigHashAlgo + | EbmlTagIdEnum.ContentSigAlgo + | EbmlTagIdEnum.ContentEncAlgo + | EbmlTagIdEnum.TrickMasterTrackUID + | EbmlTagIdEnum.TrickTrackFlag + | EbmlTagIdEnum.TrickTrackUID + | EbmlTagIdEnum.TrackJoinUID + | EbmlTagIdEnum.TrackPlaneType + | EbmlTagIdEnum.TrackPlaneUID + | EbmlTagIdEnum.Channels + | EbmlTagIdEnum.AspectRatioType + | EbmlTagIdEnum.DisplayUnit + | EbmlTagIdEnum.DisplayHeight + | EbmlTagIdEnum.DisplayWidth + | EbmlTagIdEnum.PixelCropRight + | EbmlTagIdEnum.PixelCropLeft + | EbmlTagIdEnum.PixelCropTop + | EbmlTagIdEnum.PixelCropBottom + | EbmlTagIdEnum.PixelHeight + | EbmlTagIdEnum.PixelWidth + | EbmlTagIdEnum.OldStereoMode + | EbmlTagIdEnum.AlphaMode + | EbmlTagIdEnum.StereoMode + | EbmlTagIdEnum.FlagInterlaced + | EbmlTagIdEnum.TrackTranslateCodec + | EbmlTagIdEnum.TrackTranslateEditionUID + | EbmlTagIdEnum.SeekPreRoll + | EbmlTagIdEnum.CodecDelay + | EbmlTagIdEnum.TrackOverlay + | EbmlTagIdEnum.CodecDecodeAll + | EbmlTagIdEnum.MaxBlockAdditionID + | EbmlTagIdEnum.DefaultDecodedFieldDuration + | EbmlTagIdEnum.DefaultDuration + | EbmlTagIdEnum.MaxCache + | EbmlTagIdEnum.MinCache + | EbmlTagIdEnum.FlagLacing + | EbmlTagIdEnum.FlagForced + | EbmlTagIdEnum.FlagEnabled + | EbmlTagIdEnum.TrackUID + | EbmlTagIdEnum.TrackNumber + | EbmlTagIdEnum.ReferenceTimeCode + | EbmlTagIdEnum.ReferenceOffset + | EbmlTagIdEnum.SliceDuration + | EbmlTagIdEnum.Delay + | EbmlTagIdEnum.BlockAdditionID + | EbmlTagIdEnum.FrameNumber + | EbmlTagIdEnum.LaceNumber + | EbmlTagIdEnum.ReferencePriority + | EbmlTagIdEnum.BlockDuration + | EbmlTagIdEnum.BlockAddID + | EbmlTagIdEnum.PrevSize + | EbmlTagIdEnum.Position + | EbmlTagIdEnum.SilentTrackNumber + | EbmlTagIdEnum.Timecode + | EbmlTagIdEnum.TimecodeScaleDenominator + | EbmlTagIdEnum.TimecodeScale + | EbmlTagIdEnum.ChapterTranslateCodec + | EbmlTagIdEnum.ChapterTranslateEditionUID + | EbmlTagIdEnum.SeekPosition + | EbmlTagIdEnum.SignatureHash + | EbmlTagIdEnum.SignatureAlgo + | EbmlTagIdEnum.EBMLMaxSizeLength + | EbmlTagIdEnum.EBMLMaxIDLength + | EbmlTagIdEnum.EBMLReadVersion + | EbmlTagIdEnum.TrackOffset + | EbmlTagIdEnum.DiscardPadding + | EbmlTagIdEnum.ReferenceVirtual + | EbmlTagIdEnum.ReferenceBlock + | EbmlTagIdEnum.CodecID + | EbmlTagIdEnum.DocType + | EbmlTagIdEnum.FileMimeType + | EbmlTagIdEnum.TagLanguage + | EbmlTagIdEnum.TargetType + | EbmlTagIdEnum.ChapCountry + | EbmlTagIdEnum.ChapLanguage + | EbmlTagIdEnum.CodecDownloadURL + | EbmlTagIdEnum.CodecInfoURL + | EbmlTagIdEnum.Language + | EbmlTagIdEnum.ChapString + | EbmlTagIdEnum.TagString + | EbmlTagIdEnum.ChapterStringUID + | EbmlTagIdEnum.WritingApp + | EbmlTagIdEnum.SegmentFilename + | EbmlTagIdEnum.CodecName + | EbmlTagIdEnum.TagName + | EbmlTagIdEnum.FileName + | EbmlTagIdEnum.FileDescription + | EbmlTagIdEnum.CodecSettings + | EbmlTagIdEnum.Name + | EbmlTagIdEnum.MuxingApp + | EbmlTagIdEnum.Title + | EbmlTagIdEnum.NextFilename + | EbmlTagIdEnum.PrevFilename + | EbmlTagIdEnum.ContentCompSettings + | EbmlTagIdEnum.SegmentFamily + | EbmlTagIdEnum.TagBinary + | EbmlTagIdEnum.FileReferral + | EbmlTagIdEnum.SignedElement + | EbmlTagIdEnum.ChapProcessData + | EbmlTagIdEnum.ChapProcessPrivate + | EbmlTagIdEnum.ChapterSegmentUID + | EbmlTagIdEnum.FileData + | EbmlTagIdEnum.ContentSigKeyID + | EbmlTagIdEnum.ContentSignature + | EbmlTagIdEnum.ContentEncKeyID + | EbmlTagIdEnum.TrickMasterTrackSegmentUID + | EbmlTagIdEnum.TrickTrackSegmentUID + | EbmlTagIdEnum.ChannelPositions + | EbmlTagIdEnum.ColourSpace + | EbmlTagIdEnum.TrackTranslateTrackID + | EbmlTagIdEnum.CodecPrivate + | EbmlTagIdEnum.EncryptedBlock + | EbmlTagIdEnum.CodecState + | EbmlTagIdEnum.BlockAdditional + | EbmlTagIdEnum.BlockVirtual + | EbmlTagIdEnum.ChapterTranslateID + | EbmlTagIdEnum.NextUID + | EbmlTagIdEnum.PrevUID + | EbmlTagIdEnum.SegmentUID + | EbmlTagIdEnum.SeekID + | EbmlTagIdEnum.Signature + | EbmlTagIdEnum.SignaturePublicKey + | EbmlTagIdEnum.CRC32 + | EbmlTagIdEnum.Void + | EbmlTagIdEnum.Duration + | EbmlTagIdEnum.OutputSamplingFrequency + | EbmlTagIdEnum.SamplingFrequency + | EbmlTagIdEnum.FrameRate + | EbmlTagIdEnum.GammaValue + | EbmlTagIdEnum.TrackTimecodeScale + | EbmlTagIdEnum.DateUTC; + +export type EbmlBlockTagIdType = EbmlTagIdEnum.Block; + +export type EbmlSimpleBlockTagIdType = EbmlTagIdEnum.SimpleBlock; + +export type EbmlUintDataTagIdType = + | EbmlTagIdEnum.TrackType + | EbmlTagIdEnum.FlagDefault + | EbmlTagIdEnum.ChapterTrackNumber + | EbmlTagIdEnum.ChapterTimeStart + | EbmlTagIdEnum.ChapterTimeEnd + | EbmlTagIdEnum.CueRefTime + | EbmlTagIdEnum.CueRefCluster + | EbmlTagIdEnum.ChapterFlagHidden + | EbmlTagIdEnum.ContentCompAlgo + | EbmlTagIdEnum.DocTypeReadVersion + | EbmlTagIdEnum.EBMLVersion + | EbmlTagIdEnum.DocTypeVersion + | EbmlTagIdEnum.TagDefault + | EbmlTagIdEnum.ChapterFlagEnabled + | EbmlTagIdEnum.FileUsedStartTime + | EbmlTagIdEnum.FileUsedEndTime + | EbmlTagIdEnum.ContentEncodingOrder + | EbmlTagIdEnum.ContentEncodingScope + | EbmlTagIdEnum.ContentEncodingType + | EbmlTagIdEnum.CueBlockNumber + | EbmlTagIdEnum.BitDepth + | EbmlTagIdEnum.ChapProcessTime + | EbmlTagIdEnum.ChapProcessCodecID + | EbmlTagIdEnum.AttachmentLink + | EbmlTagIdEnum.TagAttachmentUID + | EbmlTagIdEnum.TagChapterUID + | EbmlTagIdEnum.TagEditionUID + | EbmlTagIdEnum.TagTrackUID + | EbmlTagIdEnum.TargetTypeValue + | EbmlTagIdEnum.ChapterPhysicalEquiv + | EbmlTagIdEnum.ChapterSegmentEditionUID + | EbmlTagIdEnum.ChapterUID + | EbmlTagIdEnum.EditionFlagOrdered + | EbmlTagIdEnum.EditionFlagDefault + | EbmlTagIdEnum.EditionFlagHidden + | EbmlTagIdEnum.EditionUID + | EbmlTagIdEnum.FileUID + | EbmlTagIdEnum.CueRefCodecState + | EbmlTagIdEnum.CueRefNumber + | EbmlTagIdEnum.CueCodecState + | EbmlTagIdEnum.CueDuration + | EbmlTagIdEnum.CueRelativePosition + | EbmlTagIdEnum.CueClusterPosition + | EbmlTagIdEnum.CueTrack + | EbmlTagIdEnum.CueTime + | EbmlTagIdEnum.AESSettingsCipherMode + | EbmlTagIdEnum.ContentSigHashAlgo + | EbmlTagIdEnum.ContentSigAlgo + | EbmlTagIdEnum.ContentEncAlgo + | EbmlTagIdEnum.TrickMasterTrackUID + | EbmlTagIdEnum.TrickTrackFlag + | EbmlTagIdEnum.TrickTrackUID + | EbmlTagIdEnum.TrackJoinUID + | EbmlTagIdEnum.TrackPlaneType + | EbmlTagIdEnum.TrackPlaneUID + | EbmlTagIdEnum.Channels + | EbmlTagIdEnum.AspectRatioType + | EbmlTagIdEnum.DisplayUnit + | EbmlTagIdEnum.DisplayHeight + | EbmlTagIdEnum.DisplayWidth + | EbmlTagIdEnum.PixelCropRight + | EbmlTagIdEnum.PixelCropLeft + | EbmlTagIdEnum.PixelCropTop + | EbmlTagIdEnum.PixelCropBottom + | EbmlTagIdEnum.PixelHeight + | EbmlTagIdEnum.PixelWidth + | EbmlTagIdEnum.OldStereoMode + | EbmlTagIdEnum.AlphaMode + | EbmlTagIdEnum.StereoMode + | EbmlTagIdEnum.FlagInterlaced + | EbmlTagIdEnum.TrackTranslateCodec + | EbmlTagIdEnum.TrackTranslateEditionUID + | EbmlTagIdEnum.SeekPreRoll + | EbmlTagIdEnum.CodecDelay + | EbmlTagIdEnum.TrackOverlay + | EbmlTagIdEnum.CodecDecodeAll + | EbmlTagIdEnum.MaxBlockAdditionID + | EbmlTagIdEnum.DefaultDecodedFieldDuration + | EbmlTagIdEnum.DefaultDuration + | EbmlTagIdEnum.MaxCache + | EbmlTagIdEnum.MinCache + | EbmlTagIdEnum.FlagLacing + | EbmlTagIdEnum.FlagForced + | EbmlTagIdEnum.FlagEnabled + | EbmlTagIdEnum.TrackUID + | EbmlTagIdEnum.TrackNumber + | EbmlTagIdEnum.ReferenceTimeCode + | EbmlTagIdEnum.ReferenceOffset + | EbmlTagIdEnum.SliceDuration + | EbmlTagIdEnum.Delay + | EbmlTagIdEnum.BlockAdditionID + | EbmlTagIdEnum.FrameNumber + | EbmlTagIdEnum.LaceNumber + | EbmlTagIdEnum.ReferencePriority + | EbmlTagIdEnum.BlockDuration + | EbmlTagIdEnum.BlockAddID + | EbmlTagIdEnum.PrevSize + | EbmlTagIdEnum.Position + | EbmlTagIdEnum.SilentTrackNumber + | EbmlTagIdEnum.Timecode + | EbmlTagIdEnum.TimecodeScaleDenominator + | EbmlTagIdEnum.TimecodeScale + | EbmlTagIdEnum.ChapterTranslateCodec + | EbmlTagIdEnum.ChapterTranslateEditionUID + | EbmlTagIdEnum.SeekPosition + | EbmlTagIdEnum.SignatureHash + | EbmlTagIdEnum.SignatureAlgo + | EbmlTagIdEnum.EBMLMaxSizeLength + | EbmlTagIdEnum.EBMLMaxIDLength + | EbmlTagIdEnum.EBMLReadVersion; + +export type EbmlIntDataTagIdType = + | EbmlTagIdEnum.TrackOffset + | EbmlTagIdEnum.DiscardPadding + | EbmlTagIdEnum.ReferenceVirtual + | EbmlTagIdEnum.ReferenceBlock; + +export type EbmlStringDataTagIdType = + | EbmlTagIdEnum.CodecID + | EbmlTagIdEnum.DocType + | EbmlTagIdEnum.FileMimeType + | EbmlTagIdEnum.TagLanguage + | EbmlTagIdEnum.TargetType + | EbmlTagIdEnum.ChapCountry + | EbmlTagIdEnum.ChapLanguage + | EbmlTagIdEnum.CodecDownloadURL + | EbmlTagIdEnum.CodecInfoURL + | EbmlTagIdEnum.Language; + +export type EbmlUtf8DataTagIdType = + | EbmlTagIdEnum.ChapString + | EbmlTagIdEnum.TagString + | EbmlTagIdEnum.ChapterStringUID + | EbmlTagIdEnum.WritingApp + | EbmlTagIdEnum.SegmentFilename + | EbmlTagIdEnum.CodecName + | EbmlTagIdEnum.TagName + | EbmlTagIdEnum.FileName + | EbmlTagIdEnum.FileDescription + | EbmlTagIdEnum.CodecSettings + | EbmlTagIdEnum.Name + | EbmlTagIdEnum.MuxingApp + | EbmlTagIdEnum.Title + | EbmlTagIdEnum.NextFilename + | EbmlTagIdEnum.PrevFilename; + +export type EbmlFloatDataTagIdType = + | EbmlTagIdEnum.Duration + | EbmlTagIdEnum.OutputSamplingFrequency + | EbmlTagIdEnum.SamplingFrequency + | EbmlTagIdEnum.FrameRate + | EbmlTagIdEnum.GammaValue + | EbmlTagIdEnum.TrackTimecodeScale; + +export type EbmlDateDataTagIdType = EbmlTagIdEnum.DateUTC; + +export type EbmlBinaryDataTagIdType = + | EbmlTagIdEnum.ContentCompSettings + | EbmlTagIdEnum.SegmentFamily + | EbmlTagIdEnum.TagBinary + | EbmlTagIdEnum.FileReferral + | EbmlTagIdEnum.SignedElement + | EbmlTagIdEnum.ChapProcessData + | EbmlTagIdEnum.ChapProcessPrivate + | EbmlTagIdEnum.ChapterSegmentUID + | EbmlTagIdEnum.FileData + | EbmlTagIdEnum.ContentSigKeyID + | EbmlTagIdEnum.ContentSignature + | EbmlTagIdEnum.ContentEncKeyID + | EbmlTagIdEnum.TrickMasterTrackSegmentUID + | EbmlTagIdEnum.TrickTrackSegmentUID + | EbmlTagIdEnum.ChannelPositions + | EbmlTagIdEnum.ColourSpace + | EbmlTagIdEnum.TrackTranslateTrackID + | EbmlTagIdEnum.CodecPrivate + | EbmlTagIdEnum.EncryptedBlock + | EbmlTagIdEnum.CodecState + | EbmlTagIdEnum.BlockAdditional + | EbmlTagIdEnum.BlockVirtual + | EbmlTagIdEnum.ChapterTranslateID + | EbmlTagIdEnum.NextUID + | EbmlTagIdEnum.PrevUID + | EbmlTagIdEnum.SegmentUID + | EbmlTagIdEnum.SeekID + | EbmlTagIdEnum.Signature + | EbmlTagIdEnum.SignaturePublicKey + | EbmlTagIdEnum.CRC32 + | EbmlTagIdEnum.Void; + +export function isEbmlMasterTagId( + tagId: EbmlTagIdType +): tagId is EbmlMasterTagIdType { + switch (tagId) { + case EbmlTagIdEnum.ChapterDisplay: + case EbmlTagIdEnum.ContentCompression: + case EbmlTagIdEnum.ContentEncryption: + case EbmlTagIdEnum.SilentTracks: + case EbmlTagIdEnum.ContentEncoding: + case EbmlTagIdEnum.TrackTranslate: + case EbmlTagIdEnum.ChapProcessCommand: + case EbmlTagIdEnum.ChapterTranslate: + case EbmlTagIdEnum.ChapProcess: + case EbmlTagIdEnum.Tag: + case EbmlTagIdEnum.Segment: + case EbmlTagIdEnum.SimpleTag: + case EbmlTagIdEnum.Targets: + case EbmlTagIdEnum.Tags: + case EbmlTagIdEnum.ChapterTrack: + case EbmlTagIdEnum.ChapterAtom: + case EbmlTagIdEnum.EditionEntry: + case EbmlTagIdEnum.Chapters: + case EbmlTagIdEnum.AttachedFile: + case EbmlTagIdEnum.Attachments: + case EbmlTagIdEnum.CueReference: + case EbmlTagIdEnum.CueTrackPositions: + case EbmlTagIdEnum.CuePoint: + case EbmlTagIdEnum.Cues: + case EbmlTagIdEnum.ContentEncAESSettings: + case EbmlTagIdEnum.ContentEncodings: + case EbmlTagIdEnum.TrackJoinBlocks: + case EbmlTagIdEnum.TrackPlane: + case EbmlTagIdEnum.TrackCombinePlanes: + case EbmlTagIdEnum.TrackOperation: + case EbmlTagIdEnum.Audio: + case EbmlTagIdEnum.Video: + case EbmlTagIdEnum.TrackEntry: + case EbmlTagIdEnum.Tracks: + case EbmlTagIdEnum.ReferenceFrame: + case EbmlTagIdEnum.TimeSlice: + case EbmlTagIdEnum.Slices: + case EbmlTagIdEnum.BlockMore: + case EbmlTagIdEnum.BlockAdditions: + case EbmlTagIdEnum.BlockGroup: + case EbmlTagIdEnum.Cluster: + case EbmlTagIdEnum.Info: + case EbmlTagIdEnum.Seek: + case EbmlTagIdEnum.SeekHead: + case EbmlTagIdEnum.SignatureElementList: + case EbmlTagIdEnum.SignatureElements: + case EbmlTagIdEnum.SignatureSlot: + case EbmlTagIdEnum.EBML: + return true; + default: + return false; + } +} + +export function isEbmlBlockTagId( + tagId: EbmlTagIdType +): tagId is EbmlBlockTagIdType { + return tagId === EbmlTagIdEnum.Block; +} + +export function isEbmlSimpleBlockTagId( + tagId: EbmlTagIdType +): tagId is EbmlSimpleBlockTagIdType { + return tagId === EbmlTagIdEnum.SimpleBlock; +} + +export function isEbmlUintDataTagId( + tagId: EbmlTagIdType +): tagId is EbmlUintDataTagIdType { + switch (tagId) { + case EbmlTagIdEnum.TrackType: + case EbmlTagIdEnum.FlagDefault: + case EbmlTagIdEnum.ChapterTrackNumber: + case EbmlTagIdEnum.ChapterTimeStart: + case EbmlTagIdEnum.ChapterTimeEnd: + case EbmlTagIdEnum.CueRefTime: + case EbmlTagIdEnum.CueRefCluster: + case EbmlTagIdEnum.ChapterFlagHidden: + case EbmlTagIdEnum.ContentCompAlgo: + case EbmlTagIdEnum.DocTypeReadVersion: + case EbmlTagIdEnum.EBMLVersion: + case EbmlTagIdEnum.DocTypeVersion: + case EbmlTagIdEnum.TagDefault: + case EbmlTagIdEnum.ChapterFlagEnabled: + case EbmlTagIdEnum.FileUsedStartTime: + case EbmlTagIdEnum.FileUsedEndTime: + case EbmlTagIdEnum.ContentEncodingOrder: + case EbmlTagIdEnum.ContentEncodingScope: + case EbmlTagIdEnum.ContentEncodingType: + case EbmlTagIdEnum.CueBlockNumber: + case EbmlTagIdEnum.BitDepth: + case EbmlTagIdEnum.ChapProcessTime: + case EbmlTagIdEnum.ChapProcessCodecID: + case EbmlTagIdEnum.AttachmentLink: + case EbmlTagIdEnum.TagAttachmentUID: + case EbmlTagIdEnum.TagChapterUID: + case EbmlTagIdEnum.TagEditionUID: + case EbmlTagIdEnum.TagTrackUID: + case EbmlTagIdEnum.TargetTypeValue: + case EbmlTagIdEnum.ChapterPhysicalEquiv: + case EbmlTagIdEnum.ChapterSegmentEditionUID: + case EbmlTagIdEnum.ChapterUID: + case EbmlTagIdEnum.EditionFlagOrdered: + case EbmlTagIdEnum.EditionFlagDefault: + case EbmlTagIdEnum.EditionFlagHidden: + case EbmlTagIdEnum.EditionUID: + case EbmlTagIdEnum.FileUID: + case EbmlTagIdEnum.CueRefCodecState: + case EbmlTagIdEnum.CueRefNumber: + case EbmlTagIdEnum.CueCodecState: + case EbmlTagIdEnum.CueDuration: + case EbmlTagIdEnum.CueRelativePosition: + case EbmlTagIdEnum.CueClusterPosition: + case EbmlTagIdEnum.CueTrack: + case EbmlTagIdEnum.CueTime: + case EbmlTagIdEnum.AESSettingsCipherMode: + case EbmlTagIdEnum.ContentSigHashAlgo: + case EbmlTagIdEnum.ContentSigAlgo: + case EbmlTagIdEnum.ContentEncAlgo: + case EbmlTagIdEnum.TrickMasterTrackUID: + case EbmlTagIdEnum.TrickTrackFlag: + case EbmlTagIdEnum.TrickTrackUID: + case EbmlTagIdEnum.TrackJoinUID: + case EbmlTagIdEnum.TrackPlaneType: + case EbmlTagIdEnum.TrackPlaneUID: + case EbmlTagIdEnum.Channels: + case EbmlTagIdEnum.AspectRatioType: + case EbmlTagIdEnum.DisplayUnit: + case EbmlTagIdEnum.DisplayHeight: + case EbmlTagIdEnum.DisplayWidth: + case EbmlTagIdEnum.PixelCropRight: + case EbmlTagIdEnum.PixelCropLeft: + case EbmlTagIdEnum.PixelCropTop: + case EbmlTagIdEnum.PixelCropBottom: + case EbmlTagIdEnum.PixelHeight: + case EbmlTagIdEnum.PixelWidth: + case EbmlTagIdEnum.OldStereoMode: + case EbmlTagIdEnum.AlphaMode: + case EbmlTagIdEnum.StereoMode: + case EbmlTagIdEnum.FlagInterlaced: + case EbmlTagIdEnum.TrackTranslateCodec: + case EbmlTagIdEnum.TrackTranslateEditionUID: + case EbmlTagIdEnum.SeekPreRoll: + case EbmlTagIdEnum.CodecDelay: + case EbmlTagIdEnum.TrackOverlay: + case EbmlTagIdEnum.CodecDecodeAll: + case EbmlTagIdEnum.MaxBlockAdditionID: + case EbmlTagIdEnum.DefaultDecodedFieldDuration: + case EbmlTagIdEnum.DefaultDuration: + case EbmlTagIdEnum.MaxCache: + case EbmlTagIdEnum.MinCache: + case EbmlTagIdEnum.FlagLacing: + case EbmlTagIdEnum.FlagForced: + case EbmlTagIdEnum.FlagEnabled: + case EbmlTagIdEnum.TrackUID: + case EbmlTagIdEnum.TrackNumber: + case EbmlTagIdEnum.ReferenceTimeCode: + case EbmlTagIdEnum.ReferenceOffset: + case EbmlTagIdEnum.SliceDuration: + case EbmlTagIdEnum.Delay: + case EbmlTagIdEnum.BlockAdditionID: + case EbmlTagIdEnum.FrameNumber: + case EbmlTagIdEnum.LaceNumber: + case EbmlTagIdEnum.ReferencePriority: + case EbmlTagIdEnum.BlockDuration: + case EbmlTagIdEnum.BlockAddID: + case EbmlTagIdEnum.PrevSize: + case EbmlTagIdEnum.Position: + case EbmlTagIdEnum.SilentTrackNumber: + case EbmlTagIdEnum.Timecode: + case EbmlTagIdEnum.TimecodeScaleDenominator: + case EbmlTagIdEnum.TimecodeScale: + case EbmlTagIdEnum.ChapterTranslateCodec: + case EbmlTagIdEnum.ChapterTranslateEditionUID: + case EbmlTagIdEnum.SeekPosition: + case EbmlTagIdEnum.SignatureHash: + case EbmlTagIdEnum.SignatureAlgo: + case EbmlTagIdEnum.EBMLMaxSizeLength: + case EbmlTagIdEnum.EBMLMaxIDLength: + case EbmlTagIdEnum.EBMLReadVersion: + return true; + default: + return false; + } +} + +export function isEbmlIntDataTagId( + tagId: EbmlTagIdType +): tagId is EbmlIntDataTagIdType { + switch (tagId) { + case EbmlTagIdEnum.TrackOffset: + case EbmlTagIdEnum.DiscardPadding: + case EbmlTagIdEnum.ReferenceVirtual: + case EbmlTagIdEnum.ReferenceBlock: + return true; + default: + return false; + } +} + +export function isEbmlFloatDataTagId( + tagId: EbmlTagIdType +): tagId is EbmlFloatDataTagIdType { + switch (tagId) { + case EbmlTagIdEnum.Duration: + case EbmlTagIdEnum.OutputSamplingFrequency: + case EbmlTagIdEnum.SamplingFrequency: + case EbmlTagIdEnum.FrameRate: + case EbmlTagIdEnum.GammaValue: + case EbmlTagIdEnum.TrackTimecodeScale: + return true; + default: + return false; + } +} + +export function isEbmlStringDataTagId( + tagId: EbmlTagIdType +): tagId is EbmlStringDataTagIdType { + switch (tagId) { + case EbmlTagIdEnum.CodecID: + case EbmlTagIdEnum.DocType: + case EbmlTagIdEnum.FileMimeType: + case EbmlTagIdEnum.TagLanguage: + case EbmlTagIdEnum.TargetType: + case EbmlTagIdEnum.ChapCountry: + case EbmlTagIdEnum.ChapLanguage: + case EbmlTagIdEnum.CodecDownloadURL: + case EbmlTagIdEnum.CodecInfoURL: + case EbmlTagIdEnum.Language: + return true; + default: + return false; + } +} + +export function isEbmlUtf8DataTagId( + tagId: EbmlTagIdType +): tagId is EbmlUtf8DataTagIdType { + switch (tagId) { + case EbmlTagIdEnum.ChapString: + case EbmlTagIdEnum.TagString: + case EbmlTagIdEnum.ChapterStringUID: + case EbmlTagIdEnum.WritingApp: + case EbmlTagIdEnum.SegmentFilename: + case EbmlTagIdEnum.CodecName: + case EbmlTagIdEnum.TagName: + case EbmlTagIdEnum.FileName: + case EbmlTagIdEnum.FileDescription: + case EbmlTagIdEnum.CodecSettings: + case EbmlTagIdEnum.Name: + case EbmlTagIdEnum.MuxingApp: + case EbmlTagIdEnum.Title: + case EbmlTagIdEnum.NextFilename: + case EbmlTagIdEnum.PrevFilename: + return true; + default: + return false; + } +} + +export function isEbmlDateDataTagId( + tagId: EbmlTagIdType +): tagId is EbmlDateDataTagIdType { + return tagId === EbmlTagIdEnum.DateUTC; +} + +export function isEbmlBinaryDataTagId( + tagId: EbmlTagIdType +): tagId is EbmlBinaryDataTagIdType { + switch (tagId) { + case EbmlTagIdEnum.ContentCompSettings: + case EbmlTagIdEnum.SegmentFamily: + case EbmlTagIdEnum.TagBinary: + case EbmlTagIdEnum.FileReferral: + case EbmlTagIdEnum.SignedElement: + case EbmlTagIdEnum.ChapProcessData: + case EbmlTagIdEnum.ChapProcessPrivate: + case EbmlTagIdEnum.ChapterSegmentUID: + case EbmlTagIdEnum.FileData: + case EbmlTagIdEnum.ContentSigKeyID: + case EbmlTagIdEnum.ContentSignature: + case EbmlTagIdEnum.ContentEncKeyID: + case EbmlTagIdEnum.TrickMasterTrackSegmentUID: + case EbmlTagIdEnum.TrickTrackSegmentUID: + case EbmlTagIdEnum.ChannelPositions: + case EbmlTagIdEnum.ColourSpace: + case EbmlTagIdEnum.TrackTranslateTrackID: + case EbmlTagIdEnum.CodecPrivate: + case EbmlTagIdEnum.EncryptedBlock: + case EbmlTagIdEnum.CodecState: + case EbmlTagIdEnum.BlockAdditional: + case EbmlTagIdEnum.BlockVirtual: + case EbmlTagIdEnum.ChapterTranslateID: + case EbmlTagIdEnum.NextUID: + case EbmlTagIdEnum.PrevUID: + case EbmlTagIdEnum.SegmentUID: + case EbmlTagIdEnum.SeekID: + case EbmlTagIdEnum.Signature: + case EbmlTagIdEnum.SignaturePublicKey: + case EbmlTagIdEnum.CRC32: + case EbmlTagIdEnum.Void: + return true; + default: + return false; + } +} + +export function isUnknownDataTagId( + tagId: EbmlDataTagIdType +): tagId is Exclude { + return tagId in EbmlTagIdEnum; +} +export enum EbmlBlockLacing { + None = 1, + Xiph = 2, + EBML = 3, + FixedSize = 4, +} diff --git a/src/models/tag-block.ts b/src/models/tag-block.ts new file mode 100644 index 0000000..57f5bd7 --- /dev/null +++ b/src/models/tag-block.ts @@ -0,0 +1,123 @@ +import { type CreateEbmlDataTagOptions, EbmlDataTag } from './tag-data'; +import { EbmlBlockLacing } from './enums'; +import { + dataViewSlice, + dataViewSliceToBuf, + readSigned, + readVint, + writeSigned, + writeVint, +} from '../tools'; +import { + type EbmlBlockTagIdType, + type EbmlSimpleBlockTagIdType, + EbmlTagIdEnum, +} from './enums'; +import { EbmlElementType } from './enums'; +import type { FileDataViewController } from '../adapters'; + +export interface CreateEbmlBlockTagOptions + extends Omit { + id?: EbmlBlockTagIdType | EbmlSimpleBlockTagIdType; +} + +export class EbmlBlockTag extends EbmlDataTag { + payload = new Uint8Array(0); + track: number | bigint = 0; + value = 0; + + invisible: boolean | undefined; + lacing: EbmlBlockLacing | undefined; + + constructor(options: CreateEbmlBlockTagOptions) { + super({ + ...options, + id: options.id ?? EbmlTagIdEnum.Block, + type: EbmlElementType.Binary, + }); + } + + protected writeTrackBuffer(): Uint8Array { + return writeVint(this.track); + } + + protected writeValueBuffer(): Uint8Array { + return writeSigned(this.value, 2); + } + + protected writeFlagsBuffer(): Uint8Array { + let flags = 0x00; + if (this.invisible) { + flags |= 0x10; + } + + switch (this.lacing) { + case EbmlBlockLacing.None: + break; + case EbmlBlockLacing.Xiph: + flags |= 0x04; + break; + case EbmlBlockLacing.EBML: + flags |= 0x08; + break; + case EbmlBlockLacing.FixedSize: + flags |= 0x0c; + break; + default: + } + + return new Uint8Array([flags % 256]); + } + + *encodeContent(): Generator { + yield this.writeTrackBuffer(); + yield this.writeValueBuffer(); + yield this.writeFlagsBuffer(); + yield this.payload; + } + + // biome-ignore lint/correctness/useYield: + async *decodeContentImpl(controller: FileDataViewController) { + const offset = controller.getOffset(); + const view = await controller.read(offset, this.contentLength, true); + const track = readVint(view)!; + this.track = track.value; + this.value = Number( + readSigned(dataViewSlice(view, track.length, track.length + 2)) + ); + const flags: number = view.getUint8(track.length + 2); + this.invisible = Boolean(flags & 0x10); + switch (flags & 0x0c) { + case 0x00: + this.lacing = EbmlBlockLacing.None; + break; + + case 0x04: + this.lacing = EbmlBlockLacing.Xiph; + break; + + case 0x08: + this.lacing = EbmlBlockLacing.EBML; + break; + + case 0x0c: + this.lacing = EbmlBlockLacing.FixedSize; + break; + default: + } + this.payload = dataViewSliceToBuf(view, track.length + 3, undefined); + await controller.seek(offset + view.byteLength); + } + + override toDebugRecord() { + const s = super.toDebugRecord(); + return { + ...s, + payload: this.payload, + track: this.track, + value: this.value, + invisible: this.invisible, + lacing: EbmlBlockLacing[this.lacing!] || this.lacing, + }; + } +} diff --git a/src/models/tag-data.ts b/src/models/tag-data.ts new file mode 100644 index 0000000..d540091 --- /dev/null +++ b/src/models/tag-data.ts @@ -0,0 +1,92 @@ +import { type CreateEbmlTagOptions, EbmlTagTrait } from './tag-trait'; +import { EbmlElementType } from './enums'; +import { + dataViewSlice, + dataViewSliceToBuf, + readAscii, + readFloat, + readSigned, + readUnsigned, + readUtf8, + writeAscii, + writeFloat, + writeSigned, + writeUnsigned, + writeUtf8, +} from '../tools'; +import { EbmlTagPosition } from './enums'; +import type { FileDataViewController } from 'src/adapters'; + +export type CreateEbmlDataTagOptions = Omit; + +export class EbmlDataTag extends EbmlTagTrait { + data: number | string | bigint | null | Uint8Array | undefined; + + constructor(options: CreateEbmlDataTagOptions) { + super({ + ...options, + position: EbmlTagPosition.Content, + }); + } + + // biome-ignore lint/correctness/useYield: + override async *decodeContentImpl(controller: FileDataViewController) { + const offset = controller.getOffset(); + const view = await controller.read(offset, this.contentLength, true); + switch (this.type) { + case EbmlElementType.UnsignedInt: + this.data = readUnsigned(view); + break; + case EbmlElementType.Float: + this.data = readFloat(view); + break; + case EbmlElementType.Integer: + this.data = readSigned(view); + break; + case EbmlElementType.String: + this.data = readAscii(view); + break; + case EbmlElementType.UTF8: + this.data = readUtf8(view); + break; + default: + this.data = dataViewSliceToBuf(view, undefined, undefined); + break; + } + await controller.seek(offset + view.byteLength); + } + + *encodeContent(): Generator { + switch (this.type) { + case EbmlElementType.UnsignedInt: + yield writeUnsigned(this.data as any); + break; + case EbmlElementType.Float: + yield writeFloat(this.data as any); + break; + case EbmlElementType.Integer: + yield writeSigned(this.data as any); + break; + case EbmlElementType.String: + yield writeAscii(this.data as any); + break; + case EbmlElementType.UTF8: + yield writeUtf8(this.data as any); + break; + default: + yield this.data as Uint8Array; + break; + } + } + + override toDebugRecord() { + return { + ...super.toDebugRecord(), + data: this.data, + }; + } + + toJSON() { + return JSON.stringify(this.toDebugRecord(), null, 2); + } +} diff --git a/src/models/tag-master.ts b/src/models/tag-master.ts new file mode 100644 index 0000000..a27b0da --- /dev/null +++ b/src/models/tag-master.ts @@ -0,0 +1,93 @@ +import { type CreateEbmlTagOptions, EbmlTagTrait } from './tag-trait'; +import { EbmlElementType, EbmlTagPosition, isEbmlMasterTagId } from './enums'; +import { decodeEbmlTagHeader } from '../decode-utils'; +import { createEbmlTag } from 'src/factory'; +import type { EbmlMasterTagIdType } from './enums'; +import type { FileDataViewController } from '../adapters'; + +export interface CreateEbmlMasterTagOptions + extends Omit { + id: EbmlMasterTagIdType; +} + +export class EbmlMasterTag extends EbmlTagTrait { + private _children: EbmlTagTrait[] = []; + + get children(): EbmlTagTrait[] { + return this._children; + } + + set children(value: EbmlTagTrait[]) { + this._children = value; + } + + constructor(options: CreateEbmlMasterTagOptions) { + super({ + ...options, + id: options.id, + type: EbmlElementType.Master, + }); + } + + *encodeContent(): Generator { + for (const child of this.children) { + yield* child.encode(); + } + } + + async *decodeContentImpl(controller: FileDataViewController) { + while (true) { + const offset = controller.getOffset(); + + if (offset >= this.endOffset) { + break; + } + + const peeked = await controller.peek(offset); + + if (!peeked) { + break; + } + + const vints = await decodeEbmlTagHeader(controller); + + const { tagId, tagVint, sizeVint } = vints; + + const headerLength = tagVint.length + sizeVint.length; + const contentLength = sizeVint.value; + + const isMaster = isEbmlMasterTagId(tagId); + + if (isMaster) { + const tag: EbmlTagTrait = createEbmlTag(tagId, { + headerLength, + contentLength, + startOffset: offset, + position: EbmlTagPosition.Start, + parent: this, + }); + yield tag; + } + + await controller.seek(offset + headerLength); + + const tag: EbmlTagTrait = createEbmlTag(tagId, { + headerLength, + contentLength, + startOffset: offset, + position: isMaster ? EbmlTagPosition.End : EbmlTagPosition.Content, + parent: this, + }); + + for await (const item of tag.decodeContent(controller)) { + yield item; + } + + tag.endOffset = controller.getOffset(); + + this._children.push(tag); + + yield tag; + } + } +} diff --git a/src/models/tag-simple-block.ts b/src/models/tag-simple-block.ts new file mode 100644 index 0000000..df9c887 --- /dev/null +++ b/src/models/tag-simple-block.ts @@ -0,0 +1,54 @@ +import { readVint } from '../tools'; +import { type CreateEbmlBlockTagOptions, EbmlBlockTag } from './tag-block'; +import type { EbmlSimpleBlockTagIdType } from './enums'; +import type { FileDataViewController } from '../adapters'; + +export interface CreateEbmlSimpleBlockTagOptions + extends Omit { + id?: EbmlSimpleBlockTagIdType; +} + +export class EbmlSimpleBlockTag extends EbmlBlockTag { + discardable: boolean | undefined; + keyframe: boolean | undefined; + + // biome-ignore lint/complexity/noUselessConstructor: + constructor(options: CreateEbmlSimpleBlockTagOptions) { + super(options); + } + + *encodeContent(): Generator { + const flags = this.writeFlagsBuffer(); + + if (this.keyframe) { + flags[0] |= 0x80; + } + if (this.discardable) { + flags[0] |= 0x01; + } + + yield this.writeTrackBuffer(); + yield this.writeValueBuffer(); + yield flags; + yield this.payload; + } + + async *decodeContentImpl(controller: FileDataViewController) { + const offset = controller.getOffset(); + + const view = await controller.read(offset, this.contentLength, true); + + for await (const item of super.decodeContentImpl(controller)) { + yield item; + } + + const trackVint = readVint(view)!; + + const flags: number = view.getUint8(trackVint.length + 2); + this.keyframe = Boolean(flags & 0x80); + this.discardable = Boolean(flags & 0x01); + + // seeked by block tag + // await controller.seek(offset + this.contentLength); + } +} diff --git a/src/models/tag-trait.ts b/src/models/tag-trait.ts new file mode 100644 index 0000000..3888820 --- /dev/null +++ b/src/models/tag-trait.ts @@ -0,0 +1,202 @@ +import { EbmlTagPosition } from './enums'; +import { EbmlTagIdEnum, type EbmlTagIdType } from './enums'; +import type { EbmlElementType } from './enums'; +import { hexStringToBuf, UNKNOWN_SIZE_VINT_BUF, writeVint } from '../tools'; +import type { FileDataViewController } from '../adapters'; +import { InconsistentOffsetOnDecodingContentError } from '../errors'; + +export interface CreateEbmlTagOptions { + id: EbmlTagIdType; + type?: EbmlElementType; + position?: EbmlTagPosition; + headerLength: number; + contentLength: number; + startOffset: number; + endOffset?: number; + parent?: EbmlTagTrait; +} + +export abstract class EbmlTagTrait { + /** + * The id of the EBML tag. + * In most documentation this number is in hexadecimal format + */ + id: EbmlTagIdType; + /** + * The data type of the EBML tag + */ + type?: EbmlElementType; + /** + * The position of this EBML tag. + * Currently, one of "Start", "Content", or "End". + * "Start" and "End" only for Master type + */ + position: EbmlTagPosition; + /** + * Size vint length + tag vint length + */ + headerLength: number; + /** + * Start offset relative to context (stream or file) start + */ + startOffset: number; + /** + * Parent node + */ + parent?: EbmlTagTrait; + + /** + * Content length in ebml data + * Return Number.POSITIVE_INFINITY as "unknown" + */ + private _contentLength: number; + /** + * Caculated end offset when + */ + private _endOffset?: number; + + constructor(options: CreateEbmlTagOptions) { + this.id = options.id; + this.type = options.type; + this.position = options.position ?? EbmlTagPosition.Content; + this.parent = options.parent; + this.startOffset = options.startOffset; + this.headerLength = options.headerLength; + this._contentLength = options.contentLength; + this._endOffset = options.endOffset; + } + + public set contentLength(value: number) { + this._contentLength = value; + } + + /** + * After caculated or known, manually set endOffset + */ + public set endOffset(offset: number) { + this._endOffset = offset; + } + + /** + * End offset relative to context (stream or file) start + * Calcalate from self _contentLength and parent end offset + * Return Number.POSITIVE_INFINITY as "unknown" + */ + public get endOffset(): number { + if (this._endOffset) { + return this._endOffset; + } + if (this._contentLength === Number.POSITIVE_INFINITY) { + return this.parent?.endOffset ?? Number.POSITIVE_INFINITY; + } + return this.startOffset + this.headerLength + this._contentLength; + } + + /** + * Header length + Content Length + * Calcalate from self _contentLength and parent end offset + * Return Number.POSITIVE_INFINITY as "unknown" + */ + public get totalLength(): number { + return this.endOffset - this.startOffset; + } + + /** + * Content Length + * Calcalate from self _contentLength and parent end offset + * Return Number.POSITIVE_INFINITY as "unknown" + */ + public get contentLength(): number { + return this.totalLength - this.headerLength; + } + + protected abstract encodeContent(): Generator; + + /** + * Deep traversal and parse all descendants then yield as AsyncGenerator + * @param controller DataView controller, simulate async filesystem file + */ + protected abstract decodeContentImpl( + controller: FileDataViewController + ): AsyncGenerator; + + /** + * Wrap of abstract decode content impl function, add before and after lifecircle check + * @param controller DataView controller, simulate async filesystem file + * @returns Deep traversal async iterators of all descendants + */ + public async *decodeContent( + controller: FileDataViewController + ): AsyncGenerator { + if (this.contentLength === 0 || this.position === EbmlTagPosition.Start) { + return; + } + const startOffset = controller.getOffset(); + for await (const tag of this.decodeContentImpl(controller)) { + yield tag; + } + const endOffset = controller.getOffset(); + if ( + startOffset + this.contentLength !== endOffset && + this.contentLength !== Number.POSITIVE_INFINITY + ) { + throw new InconsistentOffsetOnDecodingContentError(this, endOffset); + } + } + + private getTagDeclaration(): Uint8Array { + let tagHex = this.id.toString(16); + if (tagHex.length % 2 !== 0) { + tagHex = `0${tagHex}`; + } + return hexStringToBuf(tagHex); + } + + public *encodeHeader(): Generator { + const tagEncoded = this.getTagDeclaration(); + yield tagEncoded; + if (this._contentLength === Number.POSITIVE_INFINITY) { + const mayBeSizeLength = this.headerLength - tagEncoded.byteLength; + if (mayBeSizeLength > 0 && mayBeSizeLength <= 8) { + yield UNKNOWN_SIZE_VINT_BUF[mayBeSizeLength]; + } else { + yield UNKNOWN_SIZE_VINT_BUF[2]; + } + } else { + yield writeVint(this._contentLength); + } + } + + public *encode(): Generator { + if (this._contentLength === Number.POSITIVE_INFINITY) { + yield* this.encodeHeader(); + for (const part of this.encodeContent()) { + yield part; + } + } else { + let size = 0; + const parts: Uint8Array[] = []; + for (const part of this.encodeContent()) { + parts.push(part); + size += part.byteLength; + } + this._contentLength = size; + yield* this.encodeHeader(); + for (const part of parts) { + yield part; + } + } + } + + public toDebugRecord(): Record { + return { + id: EbmlTagIdEnum[this.id as any] || this.id, + type: this.type, + position: EbmlTagPosition[this.position], + contentLength: this.contentLength, + headerLength: this.headerLength, + startOffset: this.startOffset, + endOffset: this.endOffset, + }; + } +} diff --git a/src/tools.ts b/src/tools.ts new file mode 100644 index 0000000..a8e2971 --- /dev/null +++ b/src/tools.ts @@ -0,0 +1,671 @@ +import { + VintOutOfRangeError, + VintLengthOutOfRangeError, + ElementIdVintDataAllOnesError, + ElementIdVintDataAllZerosError, + ElementIdVintDataNotShortestError, + UnsupportLengthForElementTypeError, + OutOfRangeForElementTypeError, + SizeUnitOutOfSafeIntegerRangeError, + UnreachableOrLogicError, +} from './errors'; +import { + EbmlElementType, + type EbmlTagIdType, + isEbmlMasterTagId, +} from './models/enums'; + +export const UTF8_DECODER = new TextDecoder('utf-8'); +export const ASCII_DECODER = new TextDecoder('ascii'); +export const UTF8_ENCODER = new TextEncoder(); +export const MAX_SAFE_INTEGER_BIGINT = BigInt(Number.MAX_SAFE_INTEGER); +export const VINT_WIDTH_MARKER_VALUE_TABLE = [ + 0, + 128, + 16384, + 2097152, + 268435456, + 34359738368, + 4398046511104, + 562949953421312, + 72057594037927936n, +] as [number, number, number, number, number, number, number, number, bigint]; + +export const ELEM_ID_VINT_DATA_UP_LIMIT = [ + 0, + 127, + 16383, + 2097151, + 268435455, + 34359738367, + 4398046511103, + 562949953421311, + 72057594037927935n, +] as [number, number, number, number, number, number, number, number, bigint]; +export const MAX_UINT_TABLE = [ + 0, + 255, + 65535, + 16777215, + 4294967295, + 1099511627775, + 281474976710655, + 72057594037927935n, + 18446744073709551615n, +]; +export const MIN_INT_TABLE = [ + 0, + -128, + -32768, + -8388608, + -2147483648, + -549755813888, + -140737488355328, + -36028797018963968n, + -9223372036854775808n, +]; +export const MAX_INT_TABLE = [ + 127, + 32767, + 8388607, + 2147483647, + 549755813887, + 140737488355327, + 36028797018963967n, + 9223372036854775807n, +]; +export const MAX_UINT32 = 4294967295; +export const MAX_UINT64 = 18446744073709551615n; +export const MIN_INT32 = -2147483648; +export const MAX_INT32 = 2147483647; +export const MIN_INT64 = -9223372036854775808n; +export const MAX_INT64 = 9223372036854775807n; +export const UNKNOWN_SIZE_VINT_BUF = [ + new Uint8Array(0), + new Uint8Array([0xff]), + new Uint8Array([0x7f, 0xff]), + new Uint8Array([0x3f, 0xff, 0xff]), + new Uint8Array([0x1f, 0xff, 0xff, 0xff]), + new Uint8Array([0x0f, 0xff, 0xff, 0xff, 0xff]), + new Uint8Array([0x07, 0xff, 0xff, 0xff, 0xff, 0xff]), + new Uint8Array([0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), + new Uint8Array([0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), +]; +export const UNKNOWN_SIZE_VINT_VALUE = [ + 0, + 127, + 16383, + 2097151, + 268435455, + 34359738367, + 4398046511103, + 562949953421311, + 72057594037927935n, +] as [number, number, number, number, number, number, number, number, bigint]; + +export interface Vint { + length: number; + value: number | bigint; +} + +export interface SafeSizeVint extends Vint { + length: number; + value: number; +} + +export function checkVintSafeSize( + vint: Vint, + tagId: EbmlTagIdType +): SafeSizeVint { + const n = vint.value; + if (typeof n === 'bigint') { + if (vint.length === 8 && UNKNOWN_SIZE_VINT_VALUE[8] === n) { + if (!isEbmlMasterTagId(tagId)) { + throw new UnreachableOrLogicError( + 'only master tag size can be unknown (vint_data be all ones)' + ); + } + return { + length: vint.length, + value: Number.POSITIVE_INFINITY, + }; + } + throw new SizeUnitOutOfSafeIntegerRangeError(vint.value); + } + if (n === 0) { + return vint as SafeSizeVint; + } + if (n === (UNKNOWN_SIZE_VINT_VALUE[vint.length] as number)) { + if (!isEbmlMasterTagId(tagId)) { + throw new UnreachableOrLogicError( + 'only master tag size can be unknown (vint_data be all ones)' + ); + } + return { + length: vint.length, + value: Number.POSITIVE_INFINITY, + }; + } + return vint as SafeSizeVint; +} + +export function readVintLength(view: DataView) { + if (view.byteLength < 1) { + throw new VintLengthOutOfRangeError(0); + } + const length = 8 - Math.floor(Math.log2(view.getUint8(0))); + + if (length > 8 || length < 0 || Number.isNaN(length)) { + throw new VintLengthOutOfRangeError(length); + } + + return length; +} + +export function readVint(view: DataView): Vint | null { + if (view.byteLength < 1) { + return null; + } + + const length = readVintLength(view); + + if (length > view.byteLength) { + return null; + } + + let value: number | bigint; + if (length === 8) { + value = view.getBigUint64(0, false) - VINT_WIDTH_MARKER_VALUE_TABLE[8]; + if (value <= MAX_SAFE_INTEGER_BIGINT) { + value = Number(value); + } + } else if (length === 4) { + value = view.getUint32(0, false) - VINT_WIDTH_MARKER_VALUE_TABLE[4]; + } else if (length === 2) { + value = view.getUint16(0, false) - VINT_WIDTH_MARKER_VALUE_TABLE[2]; + } else if (length === 1) { + value = view.getUint8(0) - VINT_WIDTH_MARKER_VALUE_TABLE[1]; + } else { + value = 0; + for (let i = 0; i < length; i++) { + value = value * 256 + view.getUint8(i); + } + value -= VINT_WIDTH_MARKER_VALUE_TABLE[length] as number; + } + + return { + length, + value, + }; +} + +export function readElementIdVint(view: DataView): Vint | null { + const vint = readVint(view); + if (!vint) { + return null; + } + const length = vint.length; + const value = vint.value; + if (value <= 0) { + throw new ElementIdVintDataAllZerosError(value); + } + if (value === ELEM_ID_VINT_DATA_UP_LIMIT[length]) { + throw new ElementIdVintDataAllOnesError(value); + } + if (value < ELEM_ID_VINT_DATA_UP_LIMIT[length - 1]) { + throw new ElementIdVintDataNotShortestError( + ((value as any) + VINT_WIDTH_MARKER_VALUE_TABLE[length]) as any + ); + } + return vint; +} + +export function writeVint( + value: number | bigint, + desiredLength?: number +): Uint8Array { + if (value < 0 || value >= VINT_WIDTH_MARKER_VALUE_TABLE[8]) { + throw new VintOutOfRangeError(value); + } + if (desiredLength! > 8 || desiredLength! < 1) { + throw new VintLengthOutOfRangeError(desiredLength!); + } + + let length = desiredLength; + + if (!length) { + length = 1; + while (value >= ELEM_ID_VINT_DATA_UP_LIMIT[length]) { + length++; + } + } + + if (length === 8) { + value = BigInt(value); + } else { + value = Number(value); + } + + if (typeof value === 'bigint') { + value = BigInt(value); + const buf = new Uint8Array(8); + new DataView(buf.buffer).setBigUint64( + 0, + value + VINT_WIDTH_MARKER_VALUE_TABLE[8], + false + ); + return buf; + } + + value += VINT_WIDTH_MARKER_VALUE_TABLE[length] as number; + + const buffer = new Uint8Array(length); + for (let i = length - 1; i >= 0; i -= 1) { + buffer[i] = value % 256; + value = Math.floor(value / 256); + } + + return buffer; +} + +export function writeElementIdVint(value: number | bigint): Uint8Array { + if (value >= ELEM_ID_VINT_DATA_UP_LIMIT[8]) { + throw new VintLengthOutOfRangeError(9); + } + if (value <= 0) { + throw new ElementIdVintDataAllZerosError(value); + } + return writeVint(value); +} + +export function readUnsigned(view: DataView): number | bigint { + const byteLength = view.byteLength; + let value: bigint | number; + switch (byteLength) { + case 0: + return 0; + case 1: + return view.getUint8(0); + case 2: + return view.getUint16(0, false); + case 3: + return view.getUint8(0) * 2 ** 16 + view.getUint16(1, false); + case 4: + return view.getUint32(0, false); + case 5: + return view.getUint8(0) * 2 ** 32 + view.getUint32(1, false); + case 6: + return view.getUint16(0, false) * 2 ** 32 + view.getUint32(2, false); + case 7: + value = + (BigInt(view.getUint8(0)) << 48n) + + (BigInt(view.getUint16(1, false)) << 32n) + + BigInt(view.getUint32(3, false)); + break; + case 8: + value = view.getBigUint64(0, false); + break; + default: + throw new UnsupportLengthForElementTypeError( + EbmlElementType.UnsignedInt, + '0~8', + byteLength + ); + } + if (value <= MAX_SAFE_INTEGER_BIGINT) { + return Number(value); + } + return value; +} + +export function writeUnsigned( + num: bigint | number, + preferredLength?: number +): Uint8Array { + if (num < 0 || num > MAX_UINT64) { + throw new OutOfRangeForElementTypeError( + EbmlElementType.UnsignedInt, + `0-${MAX_UINT64}`, + num + ); + } + let length = preferredLength; + if (!length) { + length = 0; + while (num > MAX_UINT_TABLE[length]) { + length++; + } + } + if (length === 0) { + return new Uint8Array(0); + } + switch (length) { + case 1: { + num = Number(num); + const buf = new Uint8Array(1); + const view = new DataView(buf.buffer); + view.setUint8(0, Number(num)); + return buf; + } + case 2: { + num = Number(num); + const buf = new Uint8Array(2); + const view = new DataView(buf.buffer); + view.setUint16(0, Number(num), false); + return buf; + } + case 3: { + num = Number(num); + const buf = new Uint8Array(3); + const view = new DataView(buf.buffer); + + const d1 = num % 2 ** 16; + num -= d1; + view.setUint16(1, d1, false); + view.setUint8(0, Math.floor(num / 2 ** 16)); + return buf; + } + case 4: { + num = Number(num); + + const buf = new Uint8Array(4); + const view = new DataView(buf.buffer); + view.setUint32(0, Number(num), false); + return buf; + } + case 5: { + num = Number(num); + + const buf = new Uint8Array(5); + const view = new DataView(buf.buffer); + + const d1 = num % 2 ** 32; + num -= d1; + view.setUint32(1, d1, false); + view.setUint8(0, Math.floor(num / 2 ** 32)); + return buf; + } + case 6: { + num = BigInt(num); + const buf = new Uint8Array(6); + const view = new DataView(buf.buffer); + + const d1 = num % (1n << 32n); + num -= d1; + view.setUint32(2, Number(d1), false); + view.setUint16(0, Number(num >> 32n), false); + return buf; + } + case 7: { + num = BigInt(num); + const buf = new Uint8Array(7); + const view = new DataView(buf.buffer); + + const d1 = num % (1n << 32n); + num -= d1; + view.setUint32(3, Number(d1), false); + const d2 = num % (1n << 48n); + num -= d2; + view.setUint16(1, Number(d2), false); + view.setUint8(0, Number(num >> 48n)); + return buf; + } + case 8: { + const buf = new Uint8Array(8); + const view = new DataView(buf.buffer); + view.setBigUint64(0, BigInt(num), false); + return buf; + } + default: + throw new UnsupportLengthForElementTypeError( + EbmlElementType.UnsignedInt, + '0~8', + length + ); + } +} + +// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: +export function readSigned(view: DataView): number | bigint { + const byteLength = view.byteLength; + if (byteLength < 0 || byteLength > 8) { + throw new UnsupportLengthForElementTypeError( + EbmlElementType.Integer, + '0~8', + byteLength + ); + } + if (byteLength === 0) { + return 0; + } + if (byteLength === 1) { + return view.getInt8(0); + } + if (byteLength === 2) { + return view.getInt16(0, false); + } + if (byteLength === 4) { + return view.getInt32(0, false); + } + if (byteLength <= 6) { + let n = 0; + const signBit = view.getUint8(0) & 0x80; + let unignedValue = 0; + for (let i = 0; i < byteLength; i++) { + unignedValue = unignedValue * 256 + view.getUint8(i); + } + if (signBit) { + const bitLength = byteLength * 8; + const maxUnsignedValue = 1 * 2 ** bitLength; + n = unignedValue - maxUnsignedValue; + } else { + n = unignedValue; + } + return n; + } + let n = 0n; + if (byteLength === 8) { + n = view.getBigInt64(0, false); + } else { + const signBit = view.getUint8(0) & 0x80; + let unignedValue = 0n; + for (let i = 0; i < byteLength; i++) { + unignedValue = (unignedValue << 8n) + BigInt(view.getUint8(i)); + } + if (signBit) { + n = unignedValue; + } else { + const bitLength = BigInt(byteLength * 8); + const maxUnsignedValue = 1n << bitLength; + n = unignedValue - maxUnsignedValue; + } + } + if (n <= MAX_SAFE_INTEGER_BIGINT) { + return Number(n); + } + return n; +} + +// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: +export function writeSigned( + num: number | bigint, + preferredLength?: number +): Uint8Array { + if (num < MIN_INT64 || num > MAX_INT64) { + throw new OutOfRangeForElementTypeError( + EbmlElementType.Integer, + `${MIN_INT64}~${MAX_INT64}`, + num + ); + } + let length = preferredLength; + if (!length) { + length = 0; + if (num > 0) { + while (num > MAX_INT_TABLE[length]) { + length++; + } + } else { + while (num < MIN_INT_TABLE[length]) { + length++; + } + } + } + + if (length === 0) { + return new Uint8Array(0); + } + + if (length > 8) { + throw new UnsupportLengthForElementTypeError( + EbmlElementType.Integer, + '0~8', + length + ); + } + + if (num < 0) { + if (length >= 6) { + num = BigInt(num) + BigInt(MAX_UINT_TABLE[length]) + 1n; + } else { + num = Number(num) + Number(MAX_UINT_TABLE[length]) + 1; + } + } + return writeUnsigned(num, length); +} + +export function readFloat(view: DataView): number { + const byteLength = view.byteLength; + switch (byteLength) { + case 0: + return 0; + case 4: + return view.getFloat32(0, false); + case 8: + return view.getFloat64(0, false); + default: + throw new UnsupportLengthForElementTypeError( + EbmlElementType.Float, + '0,4,8', + byteLength + ); + } +} + +export function writeFloat(num: number): Uint8Array { + if (num === 0) { + return new Uint8Array(0); + } + const buf = new Uint8Array(4); + const view = new DataView(buf.buffer); + view.setFloat32(0, num, false); + return buf; +} + +export function readUtf8(view: ArrayBufferView): string { + return UTF8_DECODER.decode(view); +} + +export function readAscii(view: ArrayBufferView): string { + return ASCII_DECODER.decode(view); +} + +export function writeUtf8(str: string): Uint8Array { + return UTF8_ENCODER.encode(str); +} + +export function writeAscii(str: string): Uint8Array { + return writeUtf8(str); +} + +export function readHexString(view: DataView): string { + const n = readUnsigned(view); + return n.toString(16); +} + +export function hexStringToBuf(hex: string): Uint8Array { + // @ts-ignore + if (typeof Uint8Array.fromHex === 'function') { + // @ts-ignore + return Uint8Array.fromHex(hex); + } + return new Uint8Array( + hex.match(/[\da-fA-F]{2}/gi)!.map((h) => Number.parseInt(h, 16)) + ); +} + +export function vintToHexString(num: number, litterEnd = false) { + const buf = writeVint(num); + const bytes = [...buf]; + if (litterEnd) { + bytes.reverse(); + } + return bytes.map((b) => b.toString(16).padStart(2, '0')).join(' '); +} + +export function concatBufs(...bufs: Uint8Array[]): Uint8Array { + const tmp = new Uint8Array( + bufs.reduce((byteLength, buf) => byteLength + buf.byteLength, 0) + ); + let byteOffset = 0; + for (const buf of bufs) { + tmp.set(buf, byteOffset); + byteOffset += buf.byteLength; + } + return tmp; +} + +export function concatArrayBuffers(...bufs: ArrayBuffer[]): Uint8Array { + return concatBufs(...bufs.map((b) => new Uint8Array(b))); +} + +export function dataViewSliceToBuf( + view: DataView, + start: number | undefined, + end: number | undefined +): Uint8Array { + const viewBufferEnd = view.byteOffset + view.byteLength; + const viewBufferStart = view.byteOffset; + + let newBufferStart = viewBufferStart; + if (start! >= 0) { + newBufferStart = viewBufferStart + start!; + } else if (start! < 0) { + newBufferStart = viewBufferEnd + start!; + } + let newBufferEnd = viewBufferEnd; + if (end! >= 0) { + newBufferEnd = viewBufferStart + end!; + } else if (end! < 0) { + newBufferEnd = viewBufferEnd + end!; + } + + return new Uint8Array(view.buffer.slice(newBufferStart, newBufferEnd)); +} + +export function dataViewSlice( + view: DataView, + start: number | undefined, + end: number | undefined +) { + const viewBufferEnd = view.byteOffset + view.byteLength; + const viewBufferStart = view.byteOffset; + + let newBufferStart = viewBufferStart; + if (start! >= 0) { + newBufferStart = viewBufferStart + start!; + } else if (start! < 0) { + newBufferStart = viewBufferEnd + start!; + } + let newBufferEnd = viewBufferEnd; + if (end! >= 0) { + newBufferEnd = viewBufferStart + end!; + } else if (end! < 0) { + newBufferEnd = viewBufferEnd + end!; + } + if (newBufferStart === viewBufferStart && newBufferEnd === viewBufferEnd) { + return view; + } + const newBufferLength = Math.max(newBufferEnd - newBufferStart, 0); + return new DataView(view.buffer, newBufferStart, newBufferLength); +} diff --git a/tests/decoder.spec.ts b/tests/decoder.spec.ts new file mode 100644 index 0000000..6d33a02 --- /dev/null +++ b/tests/decoder.spec.ts @@ -0,0 +1,135 @@ +import { assert, describe, it } from 'vitest'; +import { + EbmlTagPosition, + EbmlElementType, + EbmlStreamDecoder as Decoder, + EbmlDataTag, + type EbmlTagTrait, +} from 'konoebml'; + +const bufFrom = (data: Uint8Array | readonly number[]): ArrayBuffer => + new Uint8Array(data).buffer; + +const getDecoderWithNullSink = () => { + const decoder = new Decoder(); + decoder.readable.pipeTo(new WritableStream({})); + return decoder; +}; + +async function collectTags(decoder: Decoder): Promise { + const tags: EbmlTagTrait[] = []; + await decoder.readable.pipeTo( + new WritableStream({ + write: (tag) => { + tags.push(tag); + }, + }) + ); + return tags; +} + +describe('EbmlStreamDecoder', () => { + it('should wait for more data if a tag is longer than the buffer', async () => { + const decoder = getDecoderWithNullSink(); + const writer = decoder.writable.getWriter(); + await writer.write(bufFrom([0x1a, 0x45])); + + assert.strictEqual(decoder.transformer.getBuffer().byteLength, 2); + }); + + it('should clear the buffer after a full tag is written in one chunk', async () => { + const decoder = getDecoderWithNullSink(); + const writer = decoder.writable.getWriter(); + await writer.write(bufFrom([0x42, 0x86, 0x81, 0x01])); + + assert.strictEqual(decoder.transformer.getBuffer().byteLength, 0); + }); + + it('should clear the buffer after a full tag is written in multiple chunks', async () => { + const decoder = getDecoderWithNullSink(); + const writer = decoder.writable.getWriter(); + + await writer.write(bufFrom([0x42, 0x86])); + await writer.write(bufFrom([0x81, 0x01])); + + assert.strictEqual(decoder.transformer.getBuffer().byteLength, 0); + }); + + it('should increment the cursor on each step', async () => { + const decoder = getDecoderWithNullSink(); + const writer = decoder.writable.getWriter(); + + await writer.write(bufFrom([0x42])); // 4 + + assert.strictEqual(decoder.transformer.getBuffer().byteLength, 1); + + await writer.write(bufFrom([0x86])); // 5 + + assert.strictEqual(decoder.transformer.getBuffer().byteLength, 2); + + await writer.write(bufFrom([0x81])); // 6 & 7 + + assert.strictEqual(decoder.transformer.getBuffer().byteLength, 0); + + await writer.write(bufFrom([0x01])); // 6 & 7 + + assert.strictEqual(decoder.transformer.getBuffer().byteLength, 0); + }); + + it('should emit correct tag events for simple data', async () => { + const decoder = new Decoder(); + const writer = decoder.writable.getWriter(); + + const tags = collectTags(decoder); + + await writer.write(bufFrom([0x42, 0x86, 0x81, 0x01])); + await writer.close(); + + const [tag] = await tags; + + assert.strictEqual(tag.position, EbmlTagPosition.Content); + assert.strictEqual(tag.id.toString(16), '4286'); + assert.strictEqual(tag.contentLength, 0x01); + assert.strictEqual(tag.type, EbmlElementType.UnsignedInt); + assert.ok(tag instanceof EbmlDataTag); + assert.deepStrictEqual(tag.data, 1); + }); + + it('should emit correct EBML tag events for master tags', async () => { + const decoder = new Decoder(); + const writer = decoder.writable.getWriter(); + + writer.write(bufFrom([0x1a, 0x45, 0xdf, 0xa3, 0x80])); + writer.close(); + + const [tag] = await collectTags(decoder); + + assert.strictEqual(tag.position, EbmlTagPosition.Start); + assert.strictEqual(tag.id.toString(16), '1a45dfa3'); + assert.strictEqual(tag.contentLength, 0); + assert.strictEqual(tag.type, EbmlElementType.Master); + assert.ok(!(tag instanceof EbmlDataTag)); + assert.ok(!('data' in tag)); + }); + + it('should emit correct EBML:end events for master tags', async () => { + const decoder = new Decoder(); + const writer = decoder.writable.getWriter(); + + writer.write(bufFrom([0x1a, 0x45, 0xdf, 0xa3])); + writer.write(bufFrom([0x84, 0x42, 0x86, 0x81, 0x00])); + writer.close(); + + const tags = await collectTags(decoder); + + assert.strictEqual(tags.length, 3); + + const firstEndTag = tags.find((t) => t.position === EbmlTagPosition.End)!; + + assert.strictEqual(firstEndTag.id.toString(16), '1a45dfa3'); + assert.strictEqual(firstEndTag.contentLength, 4); + assert.strictEqual(firstEndTag.type, EbmlElementType.Master); + assert.ok(!(firstEndTag instanceof EbmlDataTag)); + assert.ok(!('data' in firstEndTag)); + }); +}); diff --git a/tests/encoder.spec.ts b/tests/encoder.spec.ts new file mode 100644 index 0000000..dccaf94 --- /dev/null +++ b/tests/encoder.spec.ts @@ -0,0 +1,121 @@ +import { assert, expect, describe, it } from 'vitest'; +import { + EbmlTagPosition, + type EbmlTagTrait, + EbmlTagIdEnum, + createEbmlTagForManuallyBuild, + EbmlStreamEncoder, +} from 'konoebml'; + +const invalidTag: EbmlTagTrait = ({ + id: undefined, + type: '404NotFound', + position: undefined, + size: -1, + data: null, +}); + +const incompleteTag: EbmlTagTrait = undefined!; + +const ebmlStartTag = createEbmlTagForManuallyBuild(EbmlTagIdEnum.EBML, { + position: EbmlTagPosition.Start, +}); + +const ebmlEndTag: EbmlTagTrait = createEbmlTagForManuallyBuild( + EbmlTagIdEnum.EBML, + { + contentLength: 10, + position: EbmlTagPosition.End, + } +); + +const ebmlVersion1Tag = Object.assign( + createEbmlTagForManuallyBuild(EbmlTagIdEnum.EBMLVersion, { + position: EbmlTagPosition.Content, + }), + { + data: 1, + } +); + +const ebmlVersion0Tag: EbmlTagTrait = Object.assign( + createEbmlTagForManuallyBuild(EbmlTagIdEnum.EBMLVersion, { + position: EbmlTagPosition.Content, + }), + { + data: 0, + } +); + +const makeEncoderTest = async (tags: EbmlTagTrait[]) => { + const source = new ReadableStream({ + pull(controller) { + for (const tag of tags) { + controller.enqueue(tag); + } + controller.close(); + }, + }); + const encoder = new EbmlStreamEncoder(); + const chunks: ArrayBuffer[] = []; + + await new Promise((resolve, reject) => { + source + .pipeThrough(encoder) + .pipeTo( + new WritableStream({ + write(chunk) { + chunks.push(chunk); + }, + close() { + resolve(); + }, + }) + ) + .catch(reject); + }); + return { + encoder, + chunks, + }; +}; + +describe('EBML Encoder', () => { + it('should write a single tag', async () => { + const { chunks } = await makeEncoderTest([ebmlVersion1Tag]); + + assert.deepEqual(chunks, [ + new Uint8Array([0x42, 0x86]), + new Uint8Array([0x81]), + new Uint8Array([0x01]), + ]); + }); + it('should write a tag with a single child', async () => { + const { chunks } = await makeEncoderTest([ + ebmlStartTag, + ebmlVersion0Tag, + ebmlEndTag, + ]); + + assert.deepEqual(chunks, [ + new Uint8Array([0x1a, 0x45, 0xdf, 0xa3]), + new Uint8Array([0x83]), + new Uint8Array([0x42, 0x86]), + new Uint8Array([0x80]), + new Uint8Array([]), + ]); + }); + + describe('#writeTag', () => { + it('throws with an incomplete tag data', async () => { + await expect(() => makeEncoderTest([incompleteTag])).rejects.toThrow( + /should only accept embl tag but not/ + ); + }); + it('throws with an invalid tag id', async () => { + await expect(() => makeEncoderTest([invalidTag])).rejects.toThrow( + /should only accept embl tag but not/ + ); + }); + }); +}); diff --git a/tests/init-test.ts b/tests/init-test.ts new file mode 100644 index 0000000..e69de29 diff --git a/tests/pipeline.spec.ts b/tests/pipeline.spec.ts new file mode 100644 index 0000000..2a4ea5f --- /dev/null +++ b/tests/pipeline.spec.ts @@ -0,0 +1,99 @@ +import { assert, describe, it, expect } from 'vitest'; +import { + EbmlStreamDecoder, + EbmlStreamEncoder, + type EbmlTagTrait, + EbmlTagIdEnum, + type EbmlBlockTag, + createEbmlTagForManuallyBuild, +} from 'konoebml'; +import { concatArrayBuffers } from 'konoebml/tools'; + +describe('EBML Pipeline', () => { + async function assertPipelineOutputEquals( + input: number[], + expected: number[] + ) { + const buffer = new Uint8Array(input); + + const source = new ReadableStream({ + pull(controller) { + controller.enqueue(buffer.buffer); + controller.close(); + }, + }); + + const chunks: ArrayBuffer[] = []; + await new Promise((resolve, reject) => { + const sink = new WritableStream({ + write(chunk) { + chunks.push(chunk); + }, + close() { + resolve(); + }, + }); + + source + .pipeThrough(new EbmlStreamDecoder()) + .pipeThrough(new EbmlStreamEncoder()) + .pipeTo(sink) + .catch(reject); + }); + + expect(concatArrayBuffers(...chunks)).toEqual(new Uint8Array(expected)); + } + + it('should not immediately output with not unknown sized and not paired master tag', async () => { + await assertPipelineOutputEquals( + [0x1a, 0x45, 0xdf, 0xa3, 0x83, 0x42, 0x86, 0x81], + [] + ); + }); + + it('should immediately output with unknown sized master tag', async () => { + await assertPipelineOutputEquals( + [0x1a, 0x45, 0xdf, 0xa3, 0xff, 0x42, 0x86, 0x81], + [0x1a, 0x45, 0xdf, 0xa3, 0xff] + ); + }); + + it('should encode and decode Blocks correctly', async () => { + const block = createEbmlTagForManuallyBuild(EbmlTagIdEnum.Block, {}); + block.track = 5; + block.invisible = true; + const payload = new Uint8Array(50); + for (let i = 0; i < payload.byteLength; i++) { + payload[i] = Math.floor(Math.random() * 255); + } + block.payload = payload; + const encoder = new EbmlStreamEncoder(); + const decoder = new EbmlStreamDecoder(); + const tags: EbmlTagTrait[] = []; + await new Promise((resolve, reject) => { + const source = new ReadableStream({ + pull(controller) { + controller.enqueue(block); + controller.close(); + }, + }); + source + .pipeThrough(encoder) + .pipeThrough(decoder) + .pipeTo( + new WritableStream({ + write(tag) { + tags.push(tag); + }, + close: () => resolve(), + }) + ) + .catch(reject); + }); + const tag = tags[0] as EbmlBlockTag; + assert.strictEqual(tag.id, EbmlTagIdEnum.Block); + assert.strictEqual(tag.track, block.track); + assert.strictEqual(tag.invisible, block.invisible); + assert.deepEqual(tag.payload, block.payload); + }); +}); diff --git a/tests/tools.spec.ts b/tests/tools.spec.ts new file mode 100644 index 0000000..df0b45d --- /dev/null +++ b/tests/tools.spec.ts @@ -0,0 +1,340 @@ +import { assert, describe, it } from 'vitest'; +import { + readAscii, + readElementIdVint, + readFloat, + readSigned, + readUnsigned, + readUtf8, + readVint, + writeVint, +} from 'konoebml/tools'; + +function bufFrom(data: Uint8Array | readonly number[]): Uint8Array { + return new Uint8Array(data); +} + +function viewFrom( + data: Uint8Array | readonly number[], + start?: number, + length?: number +): DataView { + const buf = bufFrom(data); + return new DataView(buf.buffer, start, length); +} + +describe('EBML Tools', () => { + describe('#readVint()', () => { + function assertReadVint( + data: Uint8Array | readonly number[], + expect: number | bigint | [number | bigint, number | undefined], + start?: number, + length?: number + ) { + const view = viewFrom(data, start, length); + const vint = readVint(view)!; + + const expectValue = Array.isArray(expect) ? expect[0] : expect; + const expectLength = + (Array.isArray(expect) ? expect[1] : undefined) ?? + view.byteLength - view.byteOffset; + assert.strictEqual(vint.value, expectValue); + assert.strictEqual(vint.length, expectLength); + } + + function assertReadElementIdVint( + data: Uint8Array | readonly number[], + expect: number | bigint | [number | bigint, number | undefined], + start?: number, + length?: number + ) { + const view = viewFrom(data, start, length); + const vint = readElementIdVint(view)!; + + const expectValue = Array.isArray(expect) ? expect[0] : expect; + const expectLength = + (Array.isArray(expect) ? expect[1] : undefined) ?? + view.byteLength - view.byteOffset; + assert.strictEqual(vint.value, expectValue); + assert.strictEqual(vint.length, expectLength); + } + + it('should read the correct value for all 1 byte ints', () => { + assertReadVint([0x80], 0); + assert.throws(() => { + readElementIdVint(viewFrom([0x80])); + }, /Element ID VINT_DATA can not be all zeros/); + + for (let i = 1; i < 0x80 - 1; i += 1) { + assertReadElementIdVint([i | 0x80], i); + assertReadVint([i | 0x80], i); + } + + assertReadVint([0xff], 127); + assert.throws(() => { + readElementIdVint(viewFrom([0xff])); + }, /Element ID VINT_DATA can not be all ones/); + }); + + it('should read the correct value for 1 byte int with non-zero start', () => { + assertReadVint([0x00, 0x81], [1, 1], 1); + }); + + it('should read the correct value for all 2 byte ints', () => { + for (let i = 0; i < 0x40; i += 1) { + for (let j = 0; j < 0xff; j += 1) { + assertReadVint([i | 0x40, j], (i << 8) + j); + } + } + }); + + it('should read the correct value for all 3 byte ints', () => { + for (let i = 0; i < 0x20; i += 1) { + for (let j = 0; j < 0xff; j += 2) { + for (let k = 0; k < 0xff; k += 3) { + assertReadVint([i | 0x20, j, k], (i << 16) + (j << 8) + k); + } + } + } + }); + // not brute forcing any more bytes, takes sooo long + + it('should read the correct value for 4 byte int min/max values', () => { + assertReadVint([0x10, 0x20, 0x00, 0x00], 2 ** 21); + assertReadVint([0x1f, 0xff, 0xff, 0xfe], 2 ** 28 - 2); + }); + + it('should read the correct value for 5 byte int min/max values', () => { + assertReadVint([0x08, 0x10, 0x00, 0x00, 0x00], 2 ** 28); + assertReadVint([0x0f, 0xff, 0xff, 0xff, 0xfe], 2 ** 35 - 2); + }); + + it('should read the correct value for 6 byte int min/max values', () => { + assertReadVint([0x04, 0x08, 0x00, 0x00, 0x00, 0x00], 2 ** 35); + assertReadVint([0x07, 0xff, 0xff, 0xff, 0xff, 0xfe], 2 ** 42 - 2); + }); + + it('should read the correct value for 7 byte int min/max values', () => { + assertReadVint([0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00], 2 ** 42); + assertReadVint([0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe], 2 ** 49 - 2); + }); + + it('should read the correct value for 8 byte int min value', () => { + assertReadVint([0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], 2 ** 49); + }); + + it('should read the correct value for the max representable JS number (2^53 - 1)', () => { + assertReadVint( + [0x01, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + Number.MAX_SAFE_INTEGER + ); + }); + + it('should return bigint for more than max representable JS number (2^53)', () => { + assertReadVint( + [0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + BigInt(Number.MAX_SAFE_INTEGER) + 1n + ); + }); + + it('should return bigint for more than max representable JS number (8 byte int max value)', () => { + assertReadVint( + [0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff], + 2n ** 56n - 1n + ); + }); + + it('should throw for 9+ byte int values', () => { + assert.throws(() => { + readVint( + viewFrom([0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff]) + ); + }, /Vint length out of range/); + }); + + it('should throw for not shortest element id', () => { + assert.throws(() => { + readElementIdVint(viewFrom([0x40, 0x3f])); + }, /Element ID VINT_DATA should be shortest/); + }); + }); + + describe('#writeVint()', () => { + function assertWriteVint( + value: number | bigint, + expected: Uint8Array | readonly number[] + ): void { + const actual = writeVint(value); + assert.strictEqual( + Buffer.from(expected).toString('hex'), + Buffer.from(actual).toString('hex') + ); + } + + it('should throw when writing -1', () => { + assert.throws(() => { + writeVint(-1); + }, /VINT_DATA out of range/); + }); + + it('should write all 1 byte ints', () => { + for (let i = 0; i < 0x80 - 1; i += 1) { + assertWriteVint(i, [i | 0x80]); + } + }); + + it('should write 2 byte int min/max values', () => { + assertWriteVint(2 ** 7 - 1, [0x40, 0x7f]); + assertWriteVint(2 ** 14 - 2, [0x7f, 0xfe]); + }); + + it('should write 3 byte int min/max values', () => { + assertWriteVint(2 ** 14 - 1, [0x20, 0x3f, 0xff]); + assertWriteVint(2 ** 21 - 2, [0x3f, 0xff, 0xfe]); + }); + + it('should write 4 byte int min/max values', () => { + assertWriteVint(2 ** 21 - 1, [0x10, 0x1f, 0xff, 0xff]); + assertWriteVint(2 ** 28 - 2, [0x1f, 0xff, 0xff, 0xfe]); + }); + + it('should write 5 byte int min/max value', () => { + assertWriteVint(2 ** 28 - 1, [0x08, 0x0f, 0xff, 0xff, 0xff]); + assertWriteVint(2 ** 35 - 2, [0x0f, 0xff, 0xff, 0xff, 0xfe]); + }); + + it('should write 6 byte int min/max value', () => { + assertWriteVint(2 ** 35 - 1, [0x04, 0x07, 0xff, 0xff, 0xff, 0xff]); + assertWriteVint(2 ** 42 - 2, [0x07, 0xff, 0xff, 0xff, 0xff, 0xfe]); + }); + + it('should write 7 byte int min/max value', () => { + assertWriteVint(2 ** 42 - 1, [0x02, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff]); + assertWriteVint(2 ** 49 - 2, [0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe]); + }); + + it('should write 8 byte int min/max value', () => { + assertWriteVint( + 2 ** 49 - 1, + [0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff] + ); + assertWriteVint( + 2n ** 56n - 2n, + [0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe] + ); + }); + + it('should write the correct value for the max representable JS number (2^53 - 1)', () => { + assertWriteVint( + Number.MAX_SAFE_INTEGER, + [0x01, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff] + ); + }); + + it('should throw for more than max representable JS number (8 byte int max value)', () => { + assert.throws(() => { + writeVint(2n ** 56n + 1n); + }, /VINT_DATA out of range/); + }); + + it('should throw for 9+ byte int values', () => { + assert.throws(() => { + writeVint(2n ** 56n + 1n); + }, /VINT_DATA out of range/); + }); + }); + + describe('#readUnsigned', () => { + it('handles 8-bit ints', () => { + assert.strictEqual(readUnsigned(viewFrom([0x07])), 7); + }); + it('handles 16-bit ints', () => { + assert.strictEqual(readUnsigned(viewFrom([0x07, 0x07])), 1799); + }); + it('handles 32-bit ints', () => { + assert.strictEqual( + readUnsigned(viewFrom([0x07, 0x07, 0x07, 0x07])), + 117901063 + ); + }); + it('handles ints smaller than 49 bits as numbers', () => { + assert.strictEqual( + readUnsigned(viewFrom([0x07, 0x07, 0x07, 0x07, 0x07])), + 30182672135 + ); + assert.strictEqual( + readUnsigned(viewFrom([0x07, 0x07, 0x07, 0x07, 0x07, 0x07])), + 7726764066567 + ); + }); + it('returns ints larger than the max safe number size as bigint', () => { + assert.strictEqual( + readUnsigned(viewFrom([0x1, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07])), + 74035645638969095n + ); + assert.strictEqual( + typeof readUnsigned( + viewFrom([0x1, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07]) + ), + 'bigint' + ); + }); + }); + + describe('#readSigned', () => { + it('handles 8-bit ints', () => { + assert.strictEqual(readSigned(viewFrom([0x07])), 7); + }); + it('handles 16-bit ints', () => { + assert.strictEqual(readSigned(viewFrom([0x07, 0x07])), 1799); + }); + it('handles 32-bit ints', () => { + assert.strictEqual( + readSigned(viewFrom([0x07, 0x07, 0x07, 0x07])), + 117901063 + ); + }); + it('handles 32 ~ 64bit ints', () => { + assert.strictEqual(readSigned(viewFrom([0x40, 0x20, 0x00])), 4202496); + }); + }); + + describe('#readFloat', () => { + it('can read 32-bit floats', () => { + assert.strictEqual(readFloat(viewFrom([0x40, 0x20, 0x00, 0x00])), 2.5); + }); + it('can read 64-bit floats', () => { + assert.strictEqual( + readFloat(viewFrom([0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])), + 2.5 + ); + }); + it('should throw for invalid sized float arrays', () => { + assert.throws(() => { + readFloat(viewFrom([0x40, 0x20, 0x00])); + }, /length should be/); + }); + }); + describe('#readUtf8', () => { + it('can read valid utf-8 strings', () => { + assert.strictEqual(readUtf8(viewFrom([97, 98, 99])), 'abc'); + assert.strictEqual( + readUtf8(viewFrom([240, 159, 164, 163, 240, 159, 152, 133])), + '🤣😅' + ); + }); + }); + + describe('#readAscii', () => { + it('can read valid ascii strings', () => { + assert.strictEqual(readAscii(viewFrom([97, 98, 99])), 'abc'); + }); + + it('can not read valid ascii strings', () => { + assert.notStrictEqual( + readAscii(viewFrom([240, 159, 164, 163, 240, 159, 152, 133])), + '🤣😅' + ); + }); + }); +}); diff --git a/tests/value.spec.ts b/tests/value.spec.ts new file mode 100644 index 0000000..e59679c --- /dev/null +++ b/tests/value.spec.ts @@ -0,0 +1,197 @@ +import fs from 'node:fs'; +import { assert, describe, it } from 'vitest'; +import { + EbmlStreamDecoder, + EbmlTagIdEnum, + EbmlSimpleBlockTag as SimpleBlock, + EbmlDataTag, + type EbmlMasterTag, +} from 'konoebml'; +import { Readable } from 'node:stream'; +import { WritableStream } from 'node:stream/web'; + +process.setMaxListeners(Number.POSITIVE_INFINITY); + +const createReadStream = (file: string) => + Readable.toWeb(fs.createReadStream(file), { + strategy: { highWaterMark: 100, size: (chunk) => chunk.byteLength }, + }) as ReadableStream; + +const makeDataStreamTest = + (stream: () => ReadableStream) => + async (cb: (tag: EbmlMasterTag | EbmlDataTag, done: () => void) => void) => { + await new Promise((resolve, reject) => { + stream() + .pipeThrough(new EbmlStreamDecoder()) + .pipeTo( + new WritableStream({ + write: async (tag) => { + cb(tag as EbmlMasterTag | EbmlDataTag, () => resolve(true)); + }, + close: () => { + reject('hit end of file without calling done'); + }, + }) + ) + .catch(reject); + }); + }; + +describe('EBML Values in tags', () => { + describe('AVC1', () => { + const makeAVC1StreamTest = makeDataStreamTest(() => + createReadStream('media/video-webm-codecs-avc1-42E01E.webm') + ); + + it('should get a correct PixelWidth value from a file (2-byte unsigned int)', async () => + await makeAVC1StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.PixelWidth) { + assert.strictEqual(tag.data, 352); + done(); + } + })); + + it('should get a correct EBMLVersion value from a file (one-byte unsigned int)', async () => + await makeAVC1StreamTest((tag, done) => { + if ( + tag instanceof EbmlDataTag && + tag.id === EbmlTagIdEnum.EBMLVersion + ) { + assert.strictEqual(tag.data, 1); + done(); + } + })); + + it('should get a correct TimeCodeScale value from a file (3-byte unsigned int)', () => + makeAVC1StreamTest((tag, done) => { + if ( + tag instanceof EbmlDataTag && + tag.id === EbmlTagIdEnum.TimecodeScale + ) { + assert.strictEqual(tag.data, 1000000); + done(); + } + })); + + it('should get a correct TrackUID value from a file (56-bit integer in hex)', () => + makeAVC1StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.TrackUID) { + assert.strictEqual(tag.data, 7990710658693702); + done(); + } + })); + + it('should get a correct DocType value from a file (ASCII text)', () => + makeAVC1StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.DocType) { + assert.strictEqual(tag.data, 'matroska'); + done(); + } + })); + + it('should get a correct MuxingApp value from a file (utf8 text)', () => + makeAVC1StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.MuxingApp) { + assert.strictEqual(tag.data, 'Chrome', JSON.stringify(tag)); + done(); + } + })); + + it('should get a correct SimpleBlock time payload from a file (binary)', () => + makeAVC1StreamTest((tag, done) => { + if (!(tag instanceof SimpleBlock)) { + return; + } + if (tag.value <= 0 || tag.value >= 200) { + return; + } + + /* look at second simpleBlock */ + assert.strictEqual(tag.track, 1, 'track'); + assert.strictEqual(tag.value, 191, 'value (timestamp)'); + assert.strictEqual( + tag.payload.byteLength, + 169, + JSON.stringify(tag.payload) + ); + done(); + })); + }); + + describe('VP8', () => { + const makeVP8StreamTest = makeDataStreamTest(() => + createReadStream('media/video-webm-codecs-vp8.webm') + ); + + it('should get a correct PixelWidth value from a video/webm; codecs="vp8" file (2-byte unsigned int)', () => + makeVP8StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.PixelWidth) { + assert.strictEqual(tag.data, 352); + done(); + } + })); + + it('should get a correct EBMLVersion value from a video/webm; codecs="vp8" file (one-byte unsigned int)', () => + makeVP8StreamTest((tag, done) => { + if ( + tag instanceof EbmlDataTag && + tag.id === EbmlTagIdEnum.EBMLVersion + ) { + assert.strictEqual(tag.data, 1); + done(); + } + })); + + it('should get a correct TimeCodeScale value from a video/webm; codecs="vp8" file (3-byte unsigned int)', () => + makeVP8StreamTest((tag, done) => { + if ( + tag instanceof EbmlDataTag && + tag.id === EbmlTagIdEnum.TimecodeScale + ) { + assert.strictEqual(tag.data, 1000000); + done(); + } + })); + + it('should get a correct TrackUID value from a video/webm; codecs="vp8" file (56-bit integer in hex)', () => + makeVP8StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.TrackUID) { + assert.strictEqual(tag.data, 13630657102564614n); + done(); + } + })); + + it('should get a correct DocType value from a video/webm; codecs="vp8" file (ASCII text)', () => + makeVP8StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.DocType) { + assert.strictEqual(tag.data, 'webm'); + done(); + } + })); + + it('should get a correct MuxingApp value from a video/webm; codecs="vp8" file (utf8 text)', () => + makeVP8StreamTest((tag, done) => { + if (tag instanceof EbmlDataTag && tag.id === EbmlTagIdEnum.MuxingApp) { + assert.strictEqual(tag.data, 'Chrome'); + done(); + } + })); + + it('should get a correct SimpleBlock time payload from a file (binary)', () => + makeVP8StreamTest((tag, done) => { + if (!(tag instanceof SimpleBlock)) { + return; + } + if (tag.value <= 0 || tag.value >= 100) { + return; + } + + assert.strictEqual(tag.track, 1, 'track'); + assert.strictEqual(tag.value, 96, JSON.stringify(tag)); + /* look at second simpleBlock */ + assert.strictEqual(tag.payload.byteLength, 43, JSON.stringify(tag)); + assert.strictEqual(tag.discardable, false, 'discardable'); + done(); + })); + }); +}); diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..484e0bd --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + "useDefineForClassFields": true, + "resolveJsonModule": true, + "moduleResolution": "bundler", + "target": "ES2021", + "module": "ESNext", + "lib": [ + "ES2021", + "DOM", + "DOM.Iterable" + ] + } +} \ No newline at end of file diff --git a/tsconfig.example.json b/tsconfig.example.json new file mode 100644 index 0000000..f6bf889 --- /dev/null +++ b/tsconfig.example.json @@ -0,0 +1,28 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": ".", + "types": [ + "node" + ], + "noEmit": true, + "paths": { + "konoebml": [ + "./src/index.ts" + ], + "konoebml/*": [ + "./src/*" + ] + } + }, + "files": [], + "include": [ + "examples/*" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..cb5fadc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./tsconfig.base.json", + "files": [], + "include": [], + "exclude": [ + "node_modules" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + }, + { + "path": "./tsconfig.example.json" + } + ] +} \ No newline at end of file diff --git a/tsconfig.lib.json b/tsconfig.lib.json new file mode 100644 index 0000000..9ea054a --- /dev/null +++ b/tsconfig.lib.json @@ -0,0 +1,17 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": "./src", + "baseUrl": ".", + "declarationDir": "./dist", + "outDir": "./dist", + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true + }, + "include": [ + "src" + ], + "exclude": [] +} \ No newline at end of file diff --git a/tsconfig.lib.tsbuildinfo b/tsconfig.lib.tsbuildinfo new file mode 100644 index 0000000..fa03351 --- /dev/null +++ b/tsconfig.lib.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.8.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./src/models/enums.ts","./src/errors.ts","./src/tools.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/primitive.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/typed-array.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/basic.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/observable-like.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/union-to-intersection.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/keys-of-union.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/distributed-omit.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/distributed-pick.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/empty-object.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/if-empty-object.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/required-keys-of.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/has-required-keys.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-equal.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/except.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/require-at-least-one.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/non-empty-object.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/unknown-record.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/unknown-array.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/tagged-union.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/simplify.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/writable.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-never.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/if-never.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/array.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/characters.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-any.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-float.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-integer.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/numeric.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-literal.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/trim.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/and.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/or.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/greater-than.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/greater-than-or-equal.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/less-than.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/tuple.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/string.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/keys.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/numeric.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/type.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/object.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/internal/index.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/writable-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/omit-index-signature.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/pick-index-signature.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/merge.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/conditional-simplify.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/non-empty-tuple.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/array-tail.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/enforce-optional.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/simplify-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/merge-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/merge-exclusive.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/require-exactly-one.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/require-all-or-none.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/require-one-or-none.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/single-key-object.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/partial-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/required-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/subtract.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/paths.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/pick-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/array-splice.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/literal-union.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/union-to-tuple.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/omit-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-null.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-unknown.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/if-unknown.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/partial-on-undefined-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/undefined-on-partial-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/readonly-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/promisable.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/arrayable.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/tagged.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/invariant-of.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-optional.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-readonly.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/optional-keys-of.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-required.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-required-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-non-nullable.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/value-of.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/async-return-type.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/conditional-keys.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/conditional-except.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/conditional-pick.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/conditional-pick-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/stringified.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/join.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/sum.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/less-than-or-equal.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/array-slice.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/string-slice.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/fixed-length-array.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/multidimensional-array.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/multidimensional-readonly-array.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/iterable-element.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/entry.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/entries.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-return-type.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-parameter-type.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/asyncify.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/jsonify.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/jsonifiable.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/find-global-type.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/structured-cloneable.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/schema.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/literal-to-primitive.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/literal-to-primitive-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/string-key-of.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/exact.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/readonly-tuple.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/override-properties.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/has-optional-keys.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/readonly-keys-of.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/has-readonly-keys.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/writable-keys-of.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/has-writable-keys.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/spread.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/if-any.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/is-tuple.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/tuple-to-object.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/tuple-to-union.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/int-range.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/int-closed-range.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/array-indices.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/array-values.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/set-field-type.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/shared-union-fields.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/all-union-fields.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/shared-union-fields-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/if-null.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/words.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/camel-case.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/camel-cased-properties.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/camel-cased-properties-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/delimiter-case.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/kebab-case.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/delimiter-cased-properties.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/kebab-cased-properties.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/pascal-case.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/pascal-cased-properties.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/snake-case.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/snake-cased-properties.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/snake-cased-properties-deep.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/screaming-snake-case.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/split.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/replace.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/string-repeat.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/includes.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/get.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/last-array-element.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/global-this.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/package-json.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/source/tsconfig-json.d.ts","./node_modules/.pnpm/type-fest@4.37.0/node_modules/type-fest/index.d.ts","./src/adapters/index.ts","./src/models/tag-trait.ts","./src/models/tag-data.ts","./src/models/tag-block.ts","./src/models/tag-master.ts","./src/models/tag-simple-block.ts","./src/factory.ts","./src/decode-utils.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/set.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/bi-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/bit-set.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/bit-vector.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/bk-tree.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/bloom-filter.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/utils/types.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/circular-buffer.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/default-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/default-weak-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/fixed-deque.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/fibonacci-heap.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/fixed-reverse-heap.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/fixed-stack.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/fuzzy-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/fuzzy-multi-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/hashed-array-tree.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/heap.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/inverted-index.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/kd-tree.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/linked-list.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/lru-cache.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/lru-cache-with-delete.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/lru-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/lru-map-with-delete.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/multi-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/multi-set.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/passjoin-index.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/queue.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/sparse-queue-set.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/sparse-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/sparse-set.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/stack.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/static-disjoint-set.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/static-interval-tree.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/suffix-array.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/symspell.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/trie.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/trie-map.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/vector.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/vp-tree.d.ts","./node_modules/.pnpm/mnemonist@0.40.3/node_modules/mnemonist/index.d.ts","./src/decoder.ts","./src/encoder.ts","./src/index.ts","./node_modules/.pnpm/@types+jasmine@5.1.7/node_modules/@types/jasmine/index.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-handler.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/retry-agent.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/util.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/eventsource.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@6.20.0/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/dom-events.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/sea.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/sqlite.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@22.13.10/node_modules/@types/node/index.d.ts"],"fileIdsList":[[276,318],[276,315,318],[276,317,318],[318],[276,318,323,353],[276,318,319,324,330,331,338,350,361],[276,318,319,320,330,338],[271,272,273,276,318],[276,318,321,362],[276,318,322,323,331,339],[276,318,323,350,358],[276,318,324,326,330,338],[276,317,318,325],[276,318,326,327],[276,318,330],[276,318,328,330],[276,317,318,330],[276,318,330,331,332,350,361],[276,318,330,331,332,345,350,353],[276,313,318,366],[276,313,318,326,330,333,338,350,361],[276,318,330,331,333,334,338,350,358,361],[276,318,333,335,350,358,361],[274,275,276,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367],[276,318,330,336],[276,318,337,361],[276,318,326,330,338,350],[276,318,339],[276,318,340],[276,317,318,341],[276,315,316,317,318,319,320,321,322,323,324,325,326,327,328,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367],[276,318,343],[276,318,344],[276,318,330,345,346],[276,318,345,347,362,364],[276,318,330,350,351,353],[276,318,350,352],[276,318,350,351],[276,318,353],[276,318,354],[276,315,318,350],[276,318,330,356,357],[276,318,356,357],[276,318,323,338,350,358],[276,318,359],[276,318,338,360],[276,318,333,344,361],[276,318,323,362],[276,318,350,363],[276,318,337,364],[276,318,365],[276,318,323,330,332,341,350,361,364,366],[276,318,350,367],[231,276,318],[225,226,227,228,229,230,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,276,318],[246,276,318],[248,276,318],[56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,81,82,83,84,85,86,87,88,89,90,91,99,100,101,102,104,105,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,276,318],[61,73,75,98,186,276,318],[68,276,318],[68,84,87,89,90,98,119,147,148,276,318],[73,90,98,116,276,318],[98,276,318],[157,276,318],[190,276,318],[73,98,191,276,318],[191,276,318],[69,141,276,318],[78,276,318],[64,68,72,98,103,142,276,318],[141,276,318],[85,190,276,318],[73,98,194,276,318],[194,276,318],[61,276,318],[75,276,318],[155,276,318],[56,61,68,98,124,276,318],[98,117,120,167,207,276,318],[89,276,318],[68,84,87,88,98,276,318],[135,276,318],[172,276,318],[66,276,318],[174,276,318],[81,276,318],[64,276,318],[77,276,318],[123,276,318],[124,276,318],[147,181,276,318],[98,116,276,318],[73,78,276,318],[79,80,92,93,94,95,96,97,276,318],[81,85,93,276,318],[73,77,84,93,276,318],[61,68,73,75,93,94,96,276,318],[80,84,86,92,276,318],[73,84,89,91,276,318],[56,77,276,318],[84,276,318],[82,84,98,276,318],[56,77,78,84,98,276,318],[73,78,177,276,318],[58,276,318],[57,58,64,73,77,81,84,98,124,276,318],[190,194,276,318],[198,276,318],[196,276,318],[60,276,318],[90,276,318],[100,165,276,318],[56,276,318],[72,73,98,100,101,102,103,104,105,106,107,276,318],[75,100,101,276,318],[68,116,276,318],[67,70,276,318],[82,83,276,318],[68,73,77,98,107,117,119,120,121,276,318],[102,276,318],[58,120,276,318],[98,102,125,276,318],[191,200,276,318],[64,73,81,89,98,116,276,318],[60,73,75,77,98,117,276,318],[69,276,318],[98,110,276,318],[190,203,276,318],[61,69,75,98,276,318],[73,98,124,276,318],[73,81,98,107,115,117,121,136,276,318],[61,69,73,75,98,135,276,318],[73,77,98,276,318],[73,75,77,98,276,318],[98,103,276,318],[65,98,276,318],[85,87,88,98,276,318],[66,75,276,318],[84,85,276,318],[98,146,149,276,318],[57,162,276,318],[84,91,98,276,318],[84,98,116,276,318],[73,177,178,276,318],[60,77,276,318],[69,75,276,318],[276,285,289,318,361],[276,285,318,350,361],[276,280,318],[276,282,285,318,358,361],[276,318,338,358],[276,318,368],[276,280,318,368],[276,282,285,318,338,361],[276,277,278,281,284,318,330,350,361],[276,285,292,318],[276,277,283,318],[276,285,306,307,318],[276,281,285,318,353,361,368],[276,306,318,368],[276,279,280,318,368],[276,285,318],[276,279,280,281,282,283,284,285,286,287,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,307,308,309,310,311,312,318],[276,285,300,318],[276,285,292,293,318],[276,283,285,293,294,318],[276,284,318],[276,277,280,285,318],[276,285,289,293,294,318],[276,289,318],[276,283,285,288,318,361],[276,277,282,285,292,318],[276,318,350],[276,280,285,306,318,366,368],[216,276,318],[53,54,55,217,218,223,276,318],[54,55,217,218,224,266,276,318],[53,54,218,221,266,276,318],[53,218,276,318],[53,54,218,219,220,221,222,276,318],[53,218,219,220,221,222,223,224,267,268,276,318],[53,55,217,219,276,318],[53,55,217,218,276,318],[53,217,218,223,224,276,318],[53,55,217,220,276,318],[53,54,55,217,276,318],[53,54,276,318]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","signature":false,"impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","signature":false,"impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","signature":false,"impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","signature":false,"impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","signature":false,"impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","signature":false,"impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","signature":false,"impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"a6283fd6370c702dc337062cc9d01c273d0bde972209a56c9885d8f9c30592fb","signature":false},{"version":"047d9461013e8c37e743687e462998204602b6d4dca752afeda56a1b740d668b","signature":false},{"version":"ec74db4db13e0162888131b7f93654b38d3da66e05028acea0103eaf37bc8dba","signature":false},{"version":"cd51ceafea7762ad639afb3ca5b68e1e4ffeaacaa402d7ef2cae17016e29e098","signature":false,"impliedFormat":1},{"version":"1b8357b3fef5be61b5de6d6a4805a534d68fe3e040c11f1944e27d4aec85936a","signature":false,"impliedFormat":1},{"version":"130ec22c8432ade59047e0225e552c62a47683d870d44785bee95594c8d65408","signature":false,"impliedFormat":1},{"version":"4f24c2781b21b6cd65eede543669327d68a8cf0c6d9cf106a1146b164a7c8ef9","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"928f96b9948742cbaec33e1c34c406c127c2dad5906edb7df08e92b963500a41","signature":false,"impliedFormat":1},{"version":"56613f2ebdd34d4527ca1ee969ab7e82333c3183fc715e5667c999396359e478","signature":false,"impliedFormat":1},{"version":"d9720d542df1d7feba0aa80ed11b4584854951f9064232e8d7a76e65dc676136","signature":false,"impliedFormat":1},{"version":"d0fb3d0c64beba3b9ab25916cc018150d78ccb4952fac755c53721d9d624ba0d","signature":false,"impliedFormat":1},{"version":"86b484bcf6344a27a9ee19dd5cef1a5afbbd96aeb07708cc6d8b43d7dfa8466c","signature":false,"impliedFormat":1},{"version":"ba93f0192c9c30d895bee1141dd0c307b75df16245deef7134ac0152294788cc","signature":false,"impliedFormat":1},{"version":"75a7db3b7ddf0ca49651629bb665e0294fda8d19ba04fddc8a14d32bb35eb248","signature":false,"impliedFormat":1},{"version":"eb31477c87de3309cbe4e9984fa74a052f31581edb89103f8590f01874b4e271","signature":false,"impliedFormat":1},{"version":"892abbe1081799073183bab5dc771db813938e888cf49eb166f0e0102c0c1473","signature":false,"impliedFormat":1},{"version":"b10d98a3178cf39b3cb34a26a1704633126c7306a37120af128f2075f0be848d","signature":false,"impliedFormat":1},{"version":"865f3db83300a1303349cc49ed80943775a858e0596e7e5a052cc65ac03b10bb","signature":false,"impliedFormat":1},{"version":"28fa41063a242eafcf51e1a62013fccdd9fd5d6760ded6e3ff5ce10a13c2ab31","signature":false,"impliedFormat":1},{"version":"ada60ff3698e7fd0c7ed0e4d93286ee28aed87f648f6748e668a57308fde5a67","signature":false,"impliedFormat":1},{"version":"1a67ba5891772a62706335b59a50720d89905196c90719dad7cec9c81c2990e6","signature":false,"impliedFormat":1},{"version":"5d6f919e1966d45ea297c2478c1985d213e41e2f9a6789964cdb53669e3f7a6f","signature":false,"impliedFormat":1},{"version":"a8289d1d525cf4a3a2d5a8db6b8e14e19f43d122cc47f8fb6b894b0aa2e2bde6","signature":false,"impliedFormat":1},{"version":"d7735a9ccd17767352ab6e799d76735016209aadd5c038a2fc07a29e7b235f02","signature":false,"impliedFormat":1},{"version":"4e251317bb109337e4918e5d7bcda7ef2d88f106cac531dcea03f7eee1dd2240","signature":false,"impliedFormat":1},{"version":"0f2c77683296ca2d0e0bee84f8aa944a05df23bc4c5b5fef31dda757e75f660f","signature":false,"impliedFormat":1},{"version":"cf41091fcbf45daff9aba653406b83d11a3ec163ff9d7a71890035117e733d98","signature":false,"impliedFormat":1},{"version":"742be2239f1a967692c4562a16973a08a1177663f972cbb4e1ef2b21bc97c9cf","signature":false,"impliedFormat":1},{"version":"ce92e662f86a36fc38c5aaa2ec6e6d6eed0bc6cf231bd06a9cb64cc652487550","signature":false,"impliedFormat":1},{"version":"bcf177e80d5a2c3499f587886b4a190391fc9ad4388f74ae6aa935a1c22cd623","signature":false,"impliedFormat":1},{"version":"521f9f4dd927972ed9867e3eb2f0dd6990151f9edbb608ce59911864a9a2712d","signature":false,"impliedFormat":1},{"version":"b2a793bde18962a2e1e0f9fa5dce43dd3e801331d36d3e96a7451727185fb16f","signature":false,"impliedFormat":1},{"version":"9d8fc1d9b6b4b94127eec180183683a6ef4735b0e0a770ba9f7e2d98dd571e0c","signature":false,"impliedFormat":1},{"version":"8504003e88870caa5474ab8bd270f318d0985ba7ede4ee30fe37646768b5362a","signature":false,"impliedFormat":1},{"version":"65465a64d5ee2f989ad4cf8db05f875204a9178f36b07a1e4d3a09a39f762e2e","signature":false,"impliedFormat":1},{"version":"2878f694f7d3a13a88a5e511da7ac084491ca0ddde9539e5dad76737ead9a5a9","signature":false,"impliedFormat":1},{"version":"1c0c6bd0d9b697040f43723d5b1dd6bb9feb743459ff9f95fda9adb6c97c9b37","signature":false,"impliedFormat":1},{"version":"0915ce92bb54e905387b7907e98982620cb7143f7b44291974fb2e592602fe00","signature":false,"impliedFormat":1},{"version":"3cd6df04a43858a6d18402c87a22a68534425e1c8c2fc5bb53fead29af027fcc","signature":false,"impliedFormat":1},{"version":"7c0a4d3819fb911cdb5a6759c0195c72b0c54094451949ebaa89ffceadd129ca","signature":false,"impliedFormat":1},{"version":"4733c832fb758f546a4246bc62f2e9d68880eb8abf0f08c6bec484decb774dc9","signature":false,"impliedFormat":1},{"version":"58d91c410f31f4dd6fa8d50ad10b4ae9a8d1789306e73a5fbe8abea6a593099b","signature":false,"impliedFormat":1},{"version":"3aea7345c25f1060791fc83a6466b889924db87389e5c344fa0c27b75257ebe4","signature":false,"impliedFormat":1},{"version":"d8d5061cb4521772457a2a3f0fcec028669990daceea78068bc968620641cd25","signature":false,"impliedFormat":1},{"version":"d6d2f8418a0479848393410d9840e1ff5e36a5f42a54b935cd83d020ba8219af","signature":false,"impliedFormat":1},{"version":"1f129869a0ee2dcb7ea9a92d6bc8ddf2c2cdaf2d244eec18c3a78efeb5e05c83","signature":false,"impliedFormat":1},{"version":"843e98d09268e2b5b9e6ff60487cf68f4643a72c2e55f7c29b35d1091a4ee4e9","signature":false,"impliedFormat":1},{"version":"e6804515ba7c8f647e145ecc126138dd9d27d3e6283291d0f50050700066a0ea","signature":false,"impliedFormat":1},{"version":"9420a04edbe321959de3d1aab9fa88b45951a14c22d8a817f75eb4c0a80dba02","signature":false,"impliedFormat":1},{"version":"6927ceeb41bb451f47593de0180c8ff1be7403965d10dc9147ee8d5c91372fff","signature":false,"impliedFormat":1},{"version":"ef4c9ef3ec432ccbf6508f8aa12fbb8b7f4d535c8b484258a3888476de2c6c36","signature":false,"impliedFormat":1},{"version":"77ff2aeb024d9e1679c00705067159c1b98ccac8310987a0bdaf0e38a6ca7333","signature":false,"impliedFormat":1},{"version":"1b609b28df5d753bb0ba20c7eb674fa93298fa268c9b20f40176f088878caef3","signature":false,"impliedFormat":1},{"version":"952c4a8d2338e19ef26c1c0758815b1de6c082a485f88368f5bece1e555f39d4","signature":false,"impliedFormat":1},{"version":"1d953cb875c69aeb1ec8c58298a5226241c6139123b1ff885cedf48ac57b435c","signature":false,"impliedFormat":1},{"version":"1a80e164acd9ee4f3e2a919f9a92bfcdb3412d1fe680b15d60e85eadbaa460f8","signature":false,"impliedFormat":1},{"version":"f981ffdbd651f67db134479a5352dac96648ca195f981284e79dc0a1dbc53fd5","signature":false,"impliedFormat":1},{"version":"a1c85a61ff2b66291676ab84ae03c1b1ff7139ffde1942173f6aee8dc4ee357b","signature":false,"impliedFormat":1},{"version":"ee1969bda02bd6c3172c259d33e9ea5456f1662a74e0acf9fa422bb38263f535","signature":false,"impliedFormat":1},{"version":"f1a5a12e04ad1471647484e7ff11e36eef7960f54740f2e60e17799d99d6f5ab","signature":false,"impliedFormat":1},{"version":"672c1ebc4fa15a1c9b4911f1c68de2bc889f4d166a68c5be8f1e61f94014e9d8","signature":false,"impliedFormat":1},{"version":"88293260a4744980874bdc1fd796db707374d852b8031599197408bc77563d1c","signature":false,"impliedFormat":1},{"version":"5a0d920468aa4e792285943cadad77bcb312ba2acf1c665e364ada1b1ee56264","signature":false,"impliedFormat":1},{"version":"c27c5144d294ba5e38f0cd483196f911047500a735490f85f318b4d5eb8ac2cc","signature":false,"impliedFormat":1},{"version":"ae4f913025ed64c54103725f2a16e351b15f5aab6cc770b2fa9ae8382f82fbdf","signature":false,"impliedFormat":1},{"version":"a2e4333bf0c330ae26b90c68e395ad0a8af06121f1c977979c75c4a5f9f6bc29","signature":false,"impliedFormat":1},{"version":"08c027d3d6e294b5607341125d1c4689b4fece03bdb9843bd048515fe496a73e","signature":false,"impliedFormat":1},{"version":"2cbf557a03f80df74106cb7cfb38386db82725b720b859e511bdead881171c32","signature":false,"impliedFormat":1},{"version":"918956b37f3870f02f0659d14bba32f7b0e374fd9c06a241db9da7f5214dcd79","signature":false,"impliedFormat":1},{"version":"260e6d25185809efc852e9c002600ad8a85f8062fa24801f30bead41de98c609","signature":false,"impliedFormat":1},{"version":"dd9694eecd70a405490ad23940ccd8979a628f1d26928090a4b05a943ac61714","signature":false,"impliedFormat":1},{"version":"42ca885a3c8ffdffcd9df252582aef9433438cf545a148e3a5e7568ca8575a56","signature":false,"impliedFormat":1},{"version":"309586820e31406ed70bb03ea8bca88b7ec15215e82d0aa85392da25d0b68630","signature":false,"impliedFormat":1},{"version":"98245fec2e886e8eb5398ce8f734bd0d0b05558c6633aefc09b48c4169596e4e","signature":false,"impliedFormat":1},{"version":"1410d60fe495685e97ed7ca6ff8ac6552b8c609ebe63bd97e51b7afe3c75b563","signature":false,"impliedFormat":1},{"version":"c6843fd4514c67ab4caf76efab7772ceb990fbb1a09085fbcf72b4437a307cf7","signature":false,"impliedFormat":1},{"version":"03ed68319c97cd4ce8f1c4ded110d9b40b8a283c3242b9fe934ccfa834e45572","signature":false,"impliedFormat":1},{"version":"956618754d139c7beb3c97df423347433473163d424ff8248af18851dd7d772a","signature":false,"impliedFormat":1},{"version":"7d8f40a7c4cc81db66ac8eaf88f192996c8a5542c192fdebb7a7f2498c18427d","signature":false,"impliedFormat":1},{"version":"c69ecf92a8a9fb3e4019e6c520260e4074dc6cb0044a71909807b8e7cc05bb65","signature":false,"impliedFormat":1},{"version":"c0c259eb2e1d212153e434aba2e0771ea8defe515caf6f5d7439b9591da61117","signature":false,"impliedFormat":1},{"version":"a33a9b9b9210506915937c1b109eaa2b827f25e9a705892e23c5731a50b2b36f","signature":false,"impliedFormat":1},{"version":"1edc9192dfc277c60b92525cdfa1980e1bfd161ae77286c96777d10db36be73c","signature":false,"impliedFormat":1},{"version":"ed53f2563bbdc94c69e4091752a1f7a5fe3d279896bab66979bb799325241db4","signature":false,"impliedFormat":1},{"version":"cc9bf8080004ee3d8d9ef117c8df0077d6a76b13cb3f55fd3eefbb3e8fcd1e63","signature":false,"impliedFormat":1},{"version":"1f0ee5ddb64540632c6f9a5b63e242b06e49dd6472f3f5bd7dfeb96d12543e15","signature":false,"impliedFormat":1},{"version":"18b86125c67d99150f54225df07349ddd07acde086b55f3eeac1c34c81e424d8","signature":false,"impliedFormat":1},{"version":"2d3f23c577a913d0f396184f31998507e18c8712bc74303a433cf47f94fd7e07","signature":false,"impliedFormat":1},{"version":"b848b40bfeb73dfe2e782c5b7588ef521010a3d595297e69386670cbde6b4d82","signature":false,"impliedFormat":1},{"version":"aa79b64f5b3690c66892f292e63dfe3e84eb678a886df86521f67c109d57a0c5","signature":false,"impliedFormat":1},{"version":"a692e092c3b9860c9554698d84baf308ba51fc8f32ddd6646e01a287810b16c6","signature":false,"impliedFormat":1},{"version":"64df9b13259fe3e3fea8ed9cdce950b7a0d40859d706c010eeea8c8d353d53fd","signature":false,"impliedFormat":1},{"version":"1848ebe5252ccb5ca1ca4ff52114516bdbbc7512589d6d0839beeea768bfb400","signature":false,"impliedFormat":1},{"version":"d2e3a1de4fde9291f9fb3b43672a8975a83e79896466f1af0f50066f78dbf39e","signature":false,"impliedFormat":1},{"version":"d0d03f7d2ba2cf425890e0f35391f1904d0d152c77179ddfc28dfad9d4a09c03","signature":false,"impliedFormat":1},{"version":"e37650b39727a6cf036c45a2b6df055e9c69a0afdd6dbab833ab957eb7f1a389","signature":false,"impliedFormat":1},{"version":"c58d6d730e95e67a62ebd7ba324e04bcde907ef6ba0f41922f403097fe54dd78","signature":false,"impliedFormat":1},{"version":"0f5773d0dd61aff22d2e3223be3b4b9c4a8068568918fb29b3f1ba3885cf701f","signature":false,"impliedFormat":1},{"version":"31073e7d0e51f33b1456ff2ab7f06546c95e24e11c29d5b39a634bc51f86d914","signature":false,"impliedFormat":1},{"version":"9ce0473b0fbaf7287afb01b6a91bd38f73a31093e59ee86de1fd3f352f3fc817","signature":false,"impliedFormat":1},{"version":"6f0d708924c3c4ee64b0fef8f10ad2b4cb87aa70b015eb758848c1ea02db0ed7","signature":false,"impliedFormat":1},{"version":"6addbb18f70100a2de900bace1c800b8d760421cdd33c1d69ee290b71e28003d","signature":false,"impliedFormat":1},{"version":"37569cc8f21262ca62ec9d3aa8eb5740f96e1f325fad3d6aa00a19403bd27b96","signature":false,"impliedFormat":1},{"version":"e0ef70ca30cdc08f55a9511c51a91415e814f53fcc355b14fc8947d32ce9e1aa","signature":false,"impliedFormat":1},{"version":"14be139e0f6d380a3d24aaf9b67972add107bea35cf7f2b1b1febac6553c3ede","signature":false,"impliedFormat":1},{"version":"23195b09849686462875673042a12b7f4cd34b4e27d38e40ca9c408dae8e6656","signature":false,"impliedFormat":1},{"version":"ff1731974600a4dad7ec87770e95fc86ca3d329b1ce200032766340f83585e47","signature":false,"impliedFormat":1},{"version":"91bc53a57079cf32e1a10ccf1a1e4a068e9820aa2fc6abc9af6bd6a52f590ffb","signature":false,"impliedFormat":1},{"version":"8dd284442b56814717e70f11ca22f4ea5b35feeca680f475bfcf8f65ba4ba296","signature":false,"impliedFormat":1},{"version":"a304e0af52f81bd7e6491e890fd480f3dc2cb0541dec3c7bd440dba9fea5c34e","signature":false,"impliedFormat":1},{"version":"c60fd0d7a1ba07631dfae8b757be0bffd5ef329e563f9a213e4a5402351c679f","signature":false,"impliedFormat":1},{"version":"02687b095a01969e6e300d246c9566a62fa87029ce2c7634439af940f3b09334","signature":false,"impliedFormat":1},{"version":"e79e530a8216ee171b4aca8fc7b99bd37f5e84555cba57dc3de4cd57580ff21a","signature":false,"impliedFormat":1},{"version":"ceb2c0bc630cca2d0fdd48b0f48915d1e768785efaabf50e31c8399926fee5b1","signature":false,"impliedFormat":1},{"version":"f351eaa598ba2046e3078e5480a7533be7051e4db9212bb40f4eeb84279aa24d","signature":false,"impliedFormat":1},{"version":"12aeda564ee3f1d96ac759553d6749534fafeb2e5142ea2867f22ed39f9d3260","signature":false,"impliedFormat":1},{"version":"4ce53edb8fb1d2f8b2f6814084b773cdf5846f49bf5a426fbe4029327bda95bf","signature":false,"impliedFormat":1},{"version":"85d63aaff358e8390b666a6bc68d3f56985f18764ab05f750cb67910f7bccb1a","signature":false,"impliedFormat":1},{"version":"0a0bf0cb43af5e0ac1703b48325ebc18ad86f6bf796bdbe96a429c0e95ca4486","signature":false,"impliedFormat":1},{"version":"22fcfd509683e3edfaf0150c255f6afdf437fec04f033f56b43d66fe392e2ad3","signature":false,"impliedFormat":1},{"version":"f08d2151bd91cdaa152532d51af04e29201cfc5d1ea40f8f7cfca0eb4f0b7cf3","signature":false,"impliedFormat":1},{"version":"3d5d9aa6266ea07199ce0a1e1f9268a56579526fad4b511949ddb9f974644202","signature":false,"impliedFormat":1},{"version":"b9c889d8a4595d02ebb3d3a72a335900b2fe9e5b5c54965da404379002b4ac44","signature":false,"impliedFormat":1},{"version":"a3cd30ebae3d0217b6b3204245719fc2c2f29d03b626905cac7127e1fb70e79c","signature":false,"impliedFormat":1},{"version":"d9c6f10eebf03d123396d4fee1efbe88bc967a47655ec040ffe7e94271a34fc7","signature":false,"impliedFormat":1},{"version":"8dd21a3054ca0c046840c308b014aec4cc5be0824a2504e365c4d499ea206ba8","signature":false,"impliedFormat":1},{"version":"f52fb387ac45e7b8cdc98209714c4aedc78d59a70f92e9b5041309b6b53fc880","signature":false,"impliedFormat":1},{"version":"1502a23e43fd7e9976a83195dc4eaf54acaff044687e0988a3bd4f19fc26b02b","signature":false,"impliedFormat":1},{"version":"5faa3d4b828440882a089a3f8514f13067957f6e5e06ec21ddd0bc2395df1c33","signature":false,"impliedFormat":1},{"version":"f0f95d40b0b5a485b3b97bd99931230e7bf3cbbe1c692bd4d65c69d0cdd6fa9d","signature":false,"impliedFormat":1},{"version":"380b4fe5dac74984ac6a58a116f7726bede1bdca7cec5362034c0b12971ac9c1","signature":false,"impliedFormat":1},{"version":"00de72aa7abede86b016f0b3bfbf767a08b5cff060991b0722d78b594a4c2105","signature":false,"impliedFormat":1},{"version":"fdf949030336b31644def7e6529d500301fb2b235a51691de84c36ffdaf8a2db","signature":false,"impliedFormat":1},{"version":"f70a315e029dacf595f025d13fa7599e8585d5ccfc44dd386db2aa6596aaf553","signature":false,"impliedFormat":1},{"version":"f385a078ad649cc24f8c31e4f2e56a5c91445a07f25fbdc4a0a339c964b55679","signature":false,"impliedFormat":1},{"version":"520e09c896f218d5871ba109df4fcf006642084cf6e6cd677897f7b93139ce46","signature":false,"impliedFormat":1},{"version":"4f5bbef956920cfd90f2cbffccb3c34f8dfc64faaba368d9d41a46925511b6b0","signature":false,"impliedFormat":1},{"version":"e3ffa968cbd25e0cad7056efa8223c83e9d4716af41c6904552b1a8a686e05b2","signature":false,"impliedFormat":1},{"version":"fd53b02b51f3b38b6c57bc7a2af7d766d9b0dbbf7376d9ec5027339a478438b5","signature":false,"impliedFormat":1},{"version":"7b7f39411329342a28ea19a4ca3aa4c7f7d888c9f01a411b05e4126280026ea6","signature":false,"impliedFormat":1},{"version":"37408aeaa2b98dad9fbc56a0d373aec76b9bdc67a51384b97a0f8e20c8a40912","signature":false,"impliedFormat":1},{"version":"c799def72e3d5c15fea3604f0b0ebbac3cca7570b4ce4a662e50142c882d70b3","signature":false,"impliedFormat":1},{"version":"0520bb170bfb6392e738b9cab09c29c5ed474c8ea9ff38236e2421faa544db36","signature":false,"impliedFormat":1},{"version":"789110b95e963c99ace4e9ad8b60901201ddc4cab59f32bde5458c1359a4d887","signature":false,"impliedFormat":1},{"version":"92eb8a98444729aa61be5e6e489602363d763da27d1bcfdf89356c1d360484da","signature":false,"impliedFormat":1},{"version":"72bbfa838556113625a605be08f9fed6a4aed73ba03ab787badb317ab6f3bcd7","signature":false,"impliedFormat":1},{"version":"d729b8b400507b9b51ff40d11e012379dbf0acd6e2f66bf596a3bc59444d9bf1","signature":false,"impliedFormat":1},{"version":"32ac4394bb4b0348d46211f2575f22ab762babb399aca1e34cf77998cdef73b2","signature":false,"impliedFormat":1},{"version":"665c7850d78c30326b541d50c4dfad08cea616a7f58df6bb9c4872dd36778ad0","signature":false,"impliedFormat":1},{"version":"1567c6dcf728b0c1044606f830aafd404c00590af56d375399edef82e9ddce92","signature":false,"impliedFormat":1},{"version":"06222fcc4e8839589e43ca1f3cec9f3ca80fffe2b67a44752d91bc53333320c5","signature":false,"impliedFormat":1},{"version":"e08e58ac493a27b29ceee80da90bb31ec64341b520907d480df6244cdbec01f8","signature":false,"impliedFormat":1},{"version":"c0fe2b1135ca803efa203408c953e1e12645b8065e1a4c1336ad8bb11ea1101b","signature":false,"impliedFormat":1},{"version":"a2ea224c325ef66a069280de98f455415a13ce4da0d3a462842e78e2f40aef9a","signature":false,"impliedFormat":1},{"version":"22e595a35d641ce3bc472f01e50f56e3ef944e5aa7e1ef48096d11bd8a476d62","signature":false,"impliedFormat":1},{"version":"381ed2bbdda025dc724911b316ed6b7414fdf7390e3f052a885017861539f391","signature":false,"impliedFormat":1},{"version":"3d9fb85cc7089ca54873c9924ff47fcf05d570f3f8a3a2349906d6d953fa2ccf","signature":false,"impliedFormat":1},{"version":"d82c245bfb76da44dd573948eca299ff75759b9714f8410468d2d055145a4b64","signature":false,"impliedFormat":1},{"version":"373adcd45da66437ea212398d3f3c028979a0a2ea45da631764653a62fa77923","signature":false,"impliedFormat":1},{"version":"db08c1807e3ae065930d88a3449d926273816d019e6c2a534e82da14e796686d","signature":false,"impliedFormat":1},{"version":"9e5c7463fc0259a38938c9afbdeda92e802cff87560277fd3e385ad24663f214","signature":false,"impliedFormat":1},{"version":"ef83477cca76be1c2d0539408c32b0a2118abcd25c9004f197421155a4649c37","signature":false,"impliedFormat":1},{"version":"2c3936b0f811f38ab1a4f0311993bf599c27c2da5750e76aa5dfbed8193c9922","signature":false,"impliedFormat":1},{"version":"47a1a3def4e6e7ebde192692b000cea586a35d7f3b6c8bb333f1b12f2b3310f6","signature":false,"impliedFormat":1},{"version":"7b98afb7881a7a1037866a1c4a1b1f861a7b481b766c7c402079e6658560cebe","signature":false},{"version":"cb5b0adbbfe0da1e9a609a93d96648f18a9a5b32fd3dd59fd48d8ab48ec4c8cf","signature":false},{"version":"5eb66a162062dec7899abb38f39585eb01211238e46e20d34f536c6cb1fa6610","signature":false},{"version":"54cdf6c4703daaa499f2a17ae5533e541f684c6102733811f8eb14a9b121a936","signature":false},{"version":"4fd7a18218fd81c648dda926a06a18dea6efa54bdd89be97ab872f410eef244a","signature":false},{"version":"14320f947d8e8b6e816b1644909b6fbb7a2f81fef6e3aa24adad04cd9425f7eb","signature":false},{"version":"30fb1a9781e39d61c84fb491a4576e45510ab1a5be6289e0995e11e9f6d87490","signature":false},{"version":"5d978dbdf0bae2f3570b40d152caeda3447c89d537be544da1c998a94ec37a7c","signature":false},{"version":"3ce036ce49d7be51782bfe99dd347d46dd6363f655a0a360a5aa1558db3325f9","signature":false,"impliedFormat":1},{"version":"9ff2a289cd7fa88114aa2266ee6f9d0769029403caacb7d6bc12188a7f1bb0d8","signature":false,"impliedFormat":1},{"version":"218e3461006bd449a9c3e6dc45dc0d6d135729d66589bbedbaee8bd3606042ae","signature":false,"impliedFormat":1},{"version":"7dd279a8f45cfcd1d15abfc1c1ab9163ca2b528a57af59bef70c1292103d4103","signature":false,"impliedFormat":1},{"version":"60f1c3db3ff000ac00af18f1dd077c1e6f513e146c0b75fb6842c5bc1ac326f7","signature":false,"impliedFormat":1},{"version":"2a1e45a03f73f6ef2bb1064f846abe13def5da95768dfe55e053434df557eba3","signature":false,"impliedFormat":1},{"version":"3e2e02fd849c64adfe90e18a7a685a1450529bac69fe31c6c1eb5e3ebc4253d4","signature":false,"impliedFormat":1},{"version":"cbb5fe2732baba49f2791d017d405034405d44780d2f53f624d80db73c0eac27","signature":false,"impliedFormat":1},{"version":"0a48a263f40c63d76cf3f0264ee7e80cee5bf1ba35d9d20a7113c2644cbdcb60","signature":false,"impliedFormat":1},{"version":"19540da60c08ebb434f269b0956ad591fca77371b421ecaec389a663c24f5ed9","signature":false,"impliedFormat":1},{"version":"b3c5dd997b89919cc63998b85bb5c8a1d1e6c1de1c5dc0610deaf9038535ad35","signature":false,"impliedFormat":1},{"version":"1b9c3d65d9b85b8f92fe2ccff604407594141d7da0ce0f86b2f35e8ab6062c4f","signature":false,"impliedFormat":1},{"version":"ac519e9db858d1c229343983dc059231e49eaf95f9cc9b2e1c67ec5c69896643","signature":false,"impliedFormat":1},{"version":"31c85bec364fa28c449e9604dd13818964ad044d367e6780144bb91d1287aefd","signature":false,"impliedFormat":1},{"version":"7d47230963402516f80d92baf7aa763d317b24ae05d0f12894e0df02eb652e95","signature":false,"impliedFormat":1},{"version":"3c8f9dfde460135ef695cea7d6c73951105ed36d2aff45b3f2f506ce8624b0ba","signature":false,"impliedFormat":1},{"version":"2a4a9bbefbfece5054fa69664206f66f39856896d3decb1c302304ea00ad59b1","signature":false,"impliedFormat":1},{"version":"d5fa8a97cd81ae633ca17349a0a7b9940fa47cb931698a348fc7e98ad2414681","signature":false,"impliedFormat":1},{"version":"ad5a7684bdf84b6afc6eb0f3dfc75e863a29fd179e9c19692b7a786089b3e004","signature":false,"impliedFormat":1},{"version":"a910850e6ec837e2dca139bfe7e769e032855d2aafceb3c6f9ecd45cf0876ff6","signature":false,"impliedFormat":1},{"version":"862ef53e3e6ec43f73d15f0a5c113dbc6b95b0d2d757023e39e8db19e94877bb","signature":false,"impliedFormat":1},{"version":"e22fe5283f65c62cfab32e9cb8986dd8792a9044bc5d7dc4f49ea6c3c1ea7cde","signature":false,"impliedFormat":1},{"version":"03ded9020695461eafdb52ba5f2ab994d0bdc85c681757e1c8e1a7f6d654562b","signature":false,"impliedFormat":1},{"version":"c31116ec14a99506b840afbe5a54e41177811a39af2ef1b8bec4fef5b62a8e78","signature":false,"impliedFormat":1},{"version":"7da6662e95dbe1954004f29a467e49539fd248c68da6495dbfdf509493d6ff92","signature":false,"impliedFormat":1},{"version":"dee7c0642d7dbd1580a2f588c206fdf753438cdcbebfd0aa797932e045a08da7","signature":false,"impliedFormat":1},{"version":"843fefdee9304efe7e6dc0f8ce42e75ac9acb32ed849ea206552b70fb64dfb32","signature":false,"impliedFormat":1},{"version":"f466a571efac9cf7392064a01bb2df09ad4c4245bb62b578c67ba5da4a322665","signature":false,"impliedFormat":1},{"version":"1e2409d6e5effd0919bcf96ca99f66937b8757c83a321147a3ac13a6b62cb894","signature":false,"impliedFormat":1},{"version":"f77ab34aa3f0e860adeab6993f569d919a8fef301b6db43ed135ce535ab92c8a","signature":false,"impliedFormat":1},{"version":"5ba64d0099d44e5355eaa5c56b16fb2975dc11830ac33e98a945b4bad53dad25","signature":false,"impliedFormat":1},{"version":"51c0033ffda0786abbf95f5275935a6d23f8148917e62db9529c320a2d0a0ec1","signature":false,"impliedFormat":1},{"version":"7d5a035bfd92dace5e295d22cedb886b6f91211e658c9805cb3e7d1b93640c36","signature":false,"impliedFormat":1},{"version":"706ad67192931f9ee3e57496277d120732baa89fd0cc1441dd3cfb9d038c4b43","signature":false,"impliedFormat":1},{"version":"4b998368c6ae0ab8202952408719df2587a6087a8a14a512a613350ad926332a","signature":false,"impliedFormat":1},{"version":"d4f04196cdccf2e42c2b8acc024259fa91f54bc98626b100c9de53776cc9d043","signature":false,"impliedFormat":1},{"version":"9ed1635ab1c01bbf1f8959b788a0edf021e8b0e84f9420364eed9f9f1101a380","signature":false,"impliedFormat":1},{"version":"946a596f5225c55cea08ea7299e934b894bb5cf434828a4d59af60f5d19bd5ba","signature":false,"impliedFormat":1},{"version":"5fb5cf76fbab668255eda7c8cd0944752793fab7ebd141ccda1131e8ef2c48ac","signature":false,"impliedFormat":1},{"version":"eaa3ea6393f95895bd55a448ed0e630b99ac34c98770e2f82806857f45b66022","signature":false,"impliedFormat":1},{"version":"0c8a357662f58a9f000e18d76b8cc33f426ef833cfb6ff88f412e0a805054079","signature":false,"impliedFormat":1},{"version":"32a3e9f5343fd6d88bcadecf351318bb6c535a361c5263dd52a5b909058b8412","signature":false,"impliedFormat":1},{"version":"816d40d2ba4fbd030891d4fe362fc3862bcacb29854054b7031b148cbeaeaeee","signature":false},{"version":"bed80839586f73d0dd49118d31a54616d0b5c518a5628d75db7ca227e26302f0","signature":false},{"version":"4168c9049e2818d917f6bf814c87dd20731d2127a45d703ed86814a0d1d79e87","signature":false},{"version":"d51818a042ffa67ab30ac9db11052502937ffdd93d743df214e3b551cc186f34","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","signature":false,"impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"8fa51737611c21ba3a5ac02c4e1535741d58bec67c9bdf94b1837a31c97a2263","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","signature":false,"impliedFormat":1},{"version":"24bd580b5743dc56402c440dc7f9a4f5d592ad7a419f25414d37a7bfe11e342b","signature":false,"impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","signature":false,"impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","signature":false,"impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","signature":false,"impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","signature":false,"impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","signature":false,"impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","signature":false,"impliedFormat":1},{"version":"6bdc71028db658243775263e93a7db2fd2abfce3ca569c3cca5aee6ed5eb186d","signature":false,"impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","signature":false,"impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","signature":false,"impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","signature":false,"impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","signature":false,"impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","signature":false,"impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","signature":false,"impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","signature":false,"impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","signature":false,"impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","signature":false,"impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","signature":false,"impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","signature":false,"impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","signature":false,"impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","signature":false,"impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","signature":false,"impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","signature":false,"impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","signature":false,"impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","signature":false,"impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","signature":false,"impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","signature":false,"impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","signature":false,"impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","signature":false,"impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","signature":false,"impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","signature":false,"impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","signature":false,"impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","signature":false,"impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","signature":false,"impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","signature":false,"impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","signature":false,"impliedFormat":1},{"version":"d2bc987ae352271d0d615a420dcf98cc886aa16b87fb2b569358c1fe0ca0773d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4f0539c58717cbc8b73acb29f9e992ab5ff20adba5f9b57130691c7f9b186a4d","signature":false,"impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","signature":false,"impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","signature":false,"impliedFormat":1},{"version":"f9677e434b7a3b14f0a9367f9dfa1227dfe3ee661792d0085523c3191ae6a1a4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","signature":false,"impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","signature":false,"impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","signature":false,"impliedFormat":1},{"version":"9057f224b79846e3a95baf6dad2c8103278de2b0c5eebda23fc8188171ad2398","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","signature":false,"impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","signature":false,"impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","signature":false,"impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","signature":false,"impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","signature":false,"impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"1ff5a53a58e756d2661b73ba60ffe274231a4432d21f7a2d0d9e4f6aa99f4283","signature":false,"impliedFormat":1},{"version":"1e289f30a48126935a5d408a91129a13a59c9b0f8c007a816f9f16ef821e144e","signature":false,"impliedFormat":1},{"version":"2ea254f944dfe131df1264d1fb96e4b1f7d110195b21f1f5dbb68fdd394e5518","signature":false,"impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","signature":false,"impliedFormat":1},{"version":"4f80de3a11c0d2f1329a72e92c7416b2f7eab14f67e92cac63bb4e8d01c6edc8","signature":false,"impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","signature":false,"impliedFormat":1},{"version":"f579f267a2f4c2278cca2ec84613e95059368b503ce96586972d304e5e40125b","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"23459c1915878a7c1e86e8bdb9c187cddd3aea105b8b1dfce512f093c969bc7e","signature":false,"impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","signature":false,"impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","signature":false,"impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"5f6f1d54779d0b9ed152b0516b0958cd34889764c1190434bbf18e7a8bb884cd","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","signature":false,"impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","signature":false,"impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","signature":false,"impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","signature":false,"impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","signature":false,"impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","signature":false,"impliedFormat":1},{"version":"f7b1df115dbd1b8522cba4f404a9f4fdcd5169e2137129187ffeee9d287e4fd1","signature":false,"impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","signature":false,"impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","signature":false,"impliedFormat":1},{"version":"93452d394fdd1dc551ec62f5042366f011a00d342d36d50793b3529bfc9bd633","signature":false,"impliedFormat":1},{"version":"fbf68fc8057932b1c30107ebc37420f8d8dc4bef1253c4c2f9e141886c0df5ab","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","signature":false,"impliedFormat":1},{"version":"993985beef40c7d113f6dd8f0ba26eed63028b691fbfeb6a5b63f26408dd2c6d","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"bef91efa0baea5d0e0f0f27b574a8bc100ce62a6d7e70220a0d58af6acab5e89","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"282fd2a1268a25345b830497b4b7bf5037a5e04f6a9c44c840cb605e19fea841","signature":false,"impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","signature":false,"impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","signature":false,"impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","signature":false,"impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"cb094bb347d7df3380299eb69836c2c8758626ecf45917577707c03cf816b6f4","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","signature":false,"impliedFormat":1},{"version":"b02784111b3fc9c38590cd4339ff8718f9329a6f4d3fd66e9744a1dcd1d7e191","signature":false,"impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","signature":false,"impliedFormat":1},{"version":"52a8e7e8a1454b6d1b5ad428efae3870ffc56f2c02d923467f2940c454aa9aec","signature":false,"affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","signature":false,"impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","signature":false,"impliedFormat":1}],"root":[[53,55],[217,224],[267,269]],"options":{"composite":true,"declaration":true,"declarationDir":"./dist","declarationMap":true,"emitDeclarationOnly":true,"esModuleInterop":true,"module":99,"noFallthroughCasesInSwitch":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":8,"useDefineForClassFields":true},"referencedMap":[[270,1],[315,2],[316,2],[317,3],[276,4],[318,5],[319,6],[320,7],[271,1],[274,8],[272,1],[273,1],[321,9],[322,10],[323,11],[324,12],[325,13],[326,14],[327,14],[329,15],[328,16],[330,17],[331,18],[332,19],[314,20],[275,1],[333,21],[334,22],[335,23],[368,24],[336,25],[337,26],[338,27],[339,28],[340,29],[341,30],[342,31],[343,32],[344,33],[345,34],[346,34],[347,35],[348,1],[349,1],[350,36],[352,37],[351,38],[353,39],[354,40],[355,41],[356,42],[357,43],[358,44],[359,45],[360,46],[361,47],[362,48],[363,49],[364,50],[365,51],[366,52],[367,53],[226,1],[227,1],[228,1],[229,1],[230,1],[232,54],[233,1],[234,1],[236,1],[235,54],[237,54],[238,54],[239,1],[240,1],[241,54],[242,1],[266,55],[243,1],[244,54],[245,1],[247,56],[246,54],[249,57],[248,54],[250,1],[251,1],[252,1],[253,1],[225,1],[255,54],[254,1],[256,1],[257,1],[258,54],[259,1],[260,1],[261,1],[263,1],[262,1],[231,1],[264,54],[265,1],[216,58],[187,59],[87,60],[183,1],[149,61],[119,62],[105,63],[184,1],[130,1],[140,1],[159,64],[58,1],[191,65],[193,66],[192,67],[142,68],[141,69],[144,70],[143,71],[103,1],[194,72],[198,73],[196,74],[62,75],[63,75],[64,1],[106,76],[156,77],[155,1],[168,78],[69,60],[162,1],[151,1],[211,79],[213,1],[90,80],[89,81],[171,82],[173,83],[67,84],[175,85],[177,86],[65,87],[78,88],[189,89],[125,90],[210,60],[182,91],[181,92],[79,93],[80,1],[98,94],[94,95],[95,96],[97,97],[93,98],[92,99],[96,100],[132,1],[81,1],[68,1],[82,101],[83,102],[85,103],[77,1],[123,1],[178,104],[124,89],[154,1],[146,1],[161,105],[160,106],[195,107],[199,108],[197,109],[61,110],[212,1],[148,80],[91,111],[166,112],[165,1],[120,113],[108,114],[109,1],[102,115],[152,116],[153,116],[71,117],[104,1],[84,118],[59,1],[122,119],[100,1],[135,1],[88,60],[170,120],[214,121],[114,63],[126,122],[200,67],[202,123],[201,123],[117,124],[118,125],[101,1],[56,1],[129,1],[128,63],[172,60],[169,1],[208,1],[111,63],[70,126],[110,1],[112,127],[115,63],[66,1],[164,1],[206,128],[185,76],[138,1],[133,129],[158,130],[134,129],[137,131],[136,132],[157,90],[188,133],[186,134],[107,135],[75,1],[113,136],[203,107],[205,108],[204,109],[207,137],[176,138],[167,1],[209,139],[150,140],[145,1],[163,141],[116,142],[147,143],[74,1],[131,1],[86,63],[215,1],[179,144],[180,1],[57,1],[127,63],[60,1],[121,145],[73,1],[72,1],[139,1],[190,63],[99,63],[174,60],[76,146],[51,1],[52,1],[9,1],[10,1],[12,1],[11,1],[2,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[3,1],[21,1],[22,1],[4,1],[23,1],[27,1],[24,1],[25,1],[26,1],[28,1],[29,1],[30,1],[5,1],[31,1],[32,1],[33,1],[34,1],[6,1],[38,1],[35,1],[36,1],[37,1],[39,1],[7,1],[40,1],[45,1],[46,1],[41,1],[42,1],[43,1],[44,1],[8,1],[50,1],[47,1],[48,1],[49,1],[1,1],[292,147],[302,148],[291,147],[312,149],[283,150],[282,151],[311,152],[305,153],[310,154],[285,155],[299,156],[284,157],[308,158],[280,159],[279,152],[309,160],[281,161],[286,162],[287,1],[290,162],[277,1],[313,163],[303,164],[294,165],[295,166],[297,167],[293,168],[296,169],[306,152],[288,170],[289,171],[298,172],[278,173],[301,164],[300,162],[304,1],[307,174],[217,175],[224,176],[267,177],[268,178],[54,179],[223,180],[269,181],[53,1],[220,182],[219,183],[221,184],[222,185],[218,186],[55,187]],"changeFileSet":[270,315,316,317,276,318,319,320,271,274,272,273,321,322,323,324,325,326,327,329,328,330,331,332,314,275,333,334,335,368,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,352,351,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,226,227,228,229,230,232,233,234,236,235,237,238,239,240,241,242,266,243,244,245,247,246,249,248,250,251,252,253,225,255,254,256,257,258,259,260,261,263,262,231,264,265,216,187,87,183,149,119,105,184,130,140,159,58,191,193,192,142,141,144,143,103,194,198,196,62,63,64,106,156,155,168,69,162,151,211,213,90,89,171,173,67,175,177,65,78,189,125,210,182,181,79,80,98,94,95,97,93,92,96,132,81,68,82,83,85,77,123,178,124,154,146,161,160,195,199,197,61,212,148,91,166,165,120,108,109,102,152,153,71,104,84,59,122,100,135,88,170,214,114,126,200,202,201,117,118,101,56,129,128,172,169,208,111,70,110,112,115,66,164,206,185,138,133,158,134,137,136,157,188,186,107,75,113,203,205,204,207,176,167,209,150,145,163,116,147,74,131,86,215,179,180,57,127,60,121,73,72,139,190,99,174,76,51,52,9,10,12,11,2,13,14,15,16,17,18,19,20,3,21,22,4,23,27,24,25,26,28,29,30,5,31,32,33,34,6,38,35,36,37,39,7,40,45,46,41,42,43,44,8,50,47,48,49,1,292,302,291,312,283,282,311,305,310,285,299,284,308,280,279,309,281,286,287,290,277,313,303,294,295,297,293,296,306,288,289,298,278,301,300,304,307,217,224,267,268,54,223,269,53,220,219,221,222,218,55],"emitSignatures":[[53,"ff3d977ebc65af4deb7c108ce24980545d62965dc6c2f6c7ce1c4e2981a9b549"],[54,"60b6162b4c552cc4fb908906b41ecc258c1375f1ac2aefceda12205e370afa54"],[55,"e01137ee46a72368940ed37f4e18ab560213ac349059ebfcf2a6ee6fd546ea77"],[217,"a1737278dcd9e18feb1b079524596f344fc63c483476fcc2a2079b371762b919"],[218,"b62ee5cba2034620f9a16638080ee6ee6c6ff567a828a9196b55857b67344542"],[219,"a72d14d2dbd5c3692e20e1d010b579f9eb2e06988cb439ff420017c9fb5f431c"],[220,"e98c00f9ae7de6bcf1543c33575877d6dbd5f5bbb7eb00878d784af53dc432ce"],[221,"aeb2cb168e1ac2a39fb8832f00a6eaf445d29611a295c8886b9348a6214a1d35"],[222,"b76b0acf0a2e898fd7c82c3f7394d8ab569ed72bf626785b89c2f5a4aed98bbd"],[223,"9757fdc7ef51d8316e10b886d91487e80f8f5fa489a3a333d26ef695aed3eec4"],[224,"aa70452dcf625765f2185575ed4c8b7a95298b132cf8e24302f9b9574b647506"],[267,"8f5bee4099697c0799d614fe4452c08ff37cb2948ce50e5bcdd56431229c9868"],[268,"db4c80cc55fe6b94fb8118ffde94a52e52b2fad8928fc8804333fdc586cfeb90"],[269,"ea3cab5ce62e87258aff83d90f22b88cfe04e4ef22599f1f447386a96286960a"]],"latestChangedDtsFile":"./dist/index.d.ts","version":"5.8.2"} \ No newline at end of file diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 0000000..c421382 --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,29 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "composite": true, + "rootDir": ".", + "types": [ + "vitest/globals", + "node" + ], + "noEmit": true, + "paths": { + "konoebml": [ + "./src/index.ts" + ], + "konoebml/*": [ + "./src/*" + ] + } + }, + "files": [], + "include": [ + "tests/*" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..2a7d59a --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,36 @@ +import swc from 'unplugin-swc'; +import tsconfigPaths from 'vite-tsconfig-paths'; +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + cacheDir: '.vitest', + test: { + setupFiles: ['tests/init-test.ts'], + environment: 'happy-dom', + include: ['tests/**/*.spec.ts'], + globals: true, + restoreMocks: true, + coverage: { + // you can include other reporters, but 'json-summary' is required, json is recommended + reporter: ['text', 'json-summary', 'json'], + // If you want a coverage reports even if your tests are failing, include the reportOnFailure option + reportOnFailure: true, + exclude: [ + 'vitest.config.ts', + 'rslib.config.ts', + 'scripts/**', + 'examples/**', + 'dist/**', + ], + }, + }, + plugins: [ + tsconfigPaths(), + swc.vite({ + include: /\.[mc]?[jt]sx?$/, + // for git+ package only + exclude: [] as any, + tsconfigFile: './tsconfig.spec.json', + }), + ], +});